- 작성시간 : 2009/11/02 01:00
- 퍼머링크 : kaludin.egloos.com/2468074
- 카테고리 : 『C/C++』
이름없는 파이프
- 하나의 프로세스가 생성 / 전달
- 전달
실행중 : 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



덧글