표준입출력 리다이렉션시 리다이렉션 시도한 프로세스의 표준입출력은 왜 그대로인가요?
프로세스 두 개를 만들었습니다. 첫 번째 프로세스 win32consoletest160이 두 번째 프로세스 win32consoletest161를 자녀프로세스로 생성합니다. 두 개의 프로세스 모두 콘솔 프로그램이고요. win32consoletest160에서 표준입출력을 전향할 겁니다. 그런데 리다이렉션을 시도한 win32consoletest160에서는 리다이렉션 상황이 적용되지 않고, 자식프로세스에서만 그 리다이렉션 상황이 적용되는지 그 이유를 모르겠습니다. 부모의 표준입출력 상황을 자녀프로세스는 상속받는 것으로 압니다. 작성한 코드는 다음과 같습니다.
- win32consoletest160.cpp-
#include
#include
int main() {
printf("main win32...\n");
SECURITY_ATTRIBUTES Attr;
Attr.nLength=sizeof(Attr);
Attr.lpSecurityDescriptor=NULL;
Attr.bInheritHandle=TRUE;
HANDLE OutputPipe1=CreateFileA("InterProcess1", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, &Attr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE InputPipe1=CreateFileA("InterProcess1", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, &Attr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
CreatePipe(&InputPipe1, &OutputPipe1, &Attr, 0);
BOOL IsSet=SetStdHandle(STD_OUTPUT_HANDLE, OutputPipe1);
//BOOL IsSet=SetStdHandle((DWORD)stdout, OutputPipe1);//stdout은 전향되지 않는다.
HANDLE InputPipe2=CreateFileA("InterProcess2", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, &Attr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE OutputPipe2=CreateFileA("InterProcess2", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, &Attr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
CreatePipe(&InputPipe2, &OutputPipe2, &Attr, 0);
SetStdHandle(STD_INPUT_HANDLE, InputPipe2);
//OutputPipe1과 InputPipe2는 생성될 자식프로세스가 쓰게끔 한다.
HANDLE Timming=CreateEventA(&Attr, FALSE, FALSE, "Timming");
STARTUPINFOA Si;
memset(&Si, 0, sizeof(Si));
Si.cb=sizeof(Si);
PROCESS_INFORMATION Pro;
BOOL IsProcess=CreateProcessA("../../win32consoletest161/Debug/win32consoletest161.exe", NULL, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &Si, &Pro);
if(IsProcess==FALSE) {
printf("CreateProcessA has failed.\n");
}
WaitForSingleObject(Timming, INFINITE);
char ABuffer[1024];
scanf("%s", ABuffer);//전향했음에도 콘솔입력버퍼로부터 입력내용을 가져옴
printf("win32consoletest160.exe %s\n", ABuffer);//전향했음에도 콘솔화면버퍼로 출력함
CloseHandle(OutputPipe1);
CloseHandle(InputPipe1);
CloseHandle(InputPipe2);
CloseHandle(OutputPipe2);
CloseHandle(Timming);
return 0;
}
- win32consoletest161.cpp -
#include
#include
int main() {
HANDLE Timming=OpenEventA(EVENT_ALL_ACCESS, FALSE, "Timming");
printf("win32consoletest161 has started.\n");
char TmpStr[1024];
//scanf("%s", TmpStr);//이 주석을 풀면, 프로세스들이 작동 안함
//printf("printf %s\n", TmpStr);//이 주석도 그러함
SetEvent(Timming);
CloseHandle(Timming);
return 0;
}
위의 부모 프로세스 win32consoletest160이 SetStdHandle로 OutputPipe1 파이프와 InputPipe2 파이프 두 개를 각각 표준출력핸들, 표준입력핸들로 리다이렉션했음에도 win32consoletest160 프로세스는 scanf로 키보드 입력을 받아서 printf로 화면에 그대로 출력합니다. 표준입출력을 전향했음에도 어떻게 이 일이 가능한지 궁금합니다.
댓글 달기