표준입출력 리다이렉션시 리다이렉션 시도한 프로세스의 표준입출력은 왜 그대로인가요?

eagle76fish의 이미지

프로세스 두 개를 만들었습니다. 첫 번째 프로세스 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로 화면에 그대로 출력합니다. 표준입출력을 전향했음에도 어떻게 이 일이 가능한지 궁금합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.