ludin's story

kaludin.egloos.com

포토로그 마이가든



Windows IPC - Pipe(이름없는 파이프) 0

출처 : i am developer!







 

이름없는 파이프

 - 하나의 프로세스가 생성 / 전달

 - 전달

   실행중 : DuplicateHandle()

   자식일때 : 상속

   자식의 표준 입출력과 연결

 

--------------------------- pipe_a.exe ------------------------------

파이프 생성 / 전달

 

#include <windows.h>

#include <stdio.h>

 

void main()

{

        HANDLE hRead, hWrite;

 

        // 익명의 pipe - 단방향

        CreatePipe(&hRead, &hWrite, 0,   // 보안 속성

                                 1024);  // 버퍼 크기

 

 

        // 이미 실행중인 프로세스에 전달해 주려면

        // DuplicateHandle()로 복사한 후 메세지를

        // 보내서 핸들을 전달

        //

        // 자식에게 전달하려면 KO 상속 사용 -> 읽기

        // 위한 핸들을 상속 가능하게 변경한다

        SetHandleInformation( hRead, HANDLE_FLAG_INHERIT,

                                      HANDLE_FLAG_INHERIT);

 

        STARTUPINFO si = {0};

        si.cb = sizeof(si);

 

        PROCESS_INFORMATION pi;

 

        char name[256] = {0};

        wsprintf(name, "child.exe %d", hRead);

 

        BOOL b = CreateProcess(0, name, 0, 0,

                                   TRUE, // TRUE : KO핸들 테이블 상속

                          CREATE_NEW_CONSOLE, // 자식 프로세스용 새로운

                                              // console을 만들어라

                          0, 0, &si, π);

                                                                       

       

        if(b)

        {

                CloseHandle(pi.hProcess);

                CloseHandle(pi.hThread);

                CloseHandle(hRead);

        }

 

        //--------------------------------------------------------------

        // 이제 pipe를 통해서 자식에게 값을 전달한다.

        while(1)

        {

                char data[4096] = {0};

                gets(data);

 

                DWORD len;

                WriteFile(hWrite, data, 4096, &len, 0);

        }

}

 

 

 

--------------------------- child.exe -------------------------------

부모로 부터 전달받은 메세지 출력

 

#include <windows.h>

#include <stdio.h>

 

void main(int argc, char *argv[])

{

        if(argc != 2)

                return ;

 

        // 부모가 command line args로 전달한 파이프 핸들을 얻는다

        HANDLE hRead = (HANDLE)atoi(argv[1]);

 

        DWORD len;

 

        while(1)

        {

                char data[4096] = {0};

                ReadFile(hRead, data, 4096, &len, 0);

 

                printf("%s\n", data);

        }

}

 

// 빌드해서 child.exe를 만들어라

// 완성된 child.exe를 복사해서 부모소스 쪽 폴더에 옮겨 놓아라

// 부모를 실행해보아라

// 문자열 입력후 enter


트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://kaludin.egloos.com/tb/2468074 [도움말]

덧글

덧글 입력 영역



:: 배경음악 ::

1. 성시경-추억이 들린다 2. 씨야-사랑의 인사
Candle