본문 바로가기
IT창고/System

이름없는 파이프

by 창구창고 2007. 1. 22.
반응형

//server

#include <stdio.h>
#include <windows.h>

// 익명의 Pipe : 단방향의 이름없는 pipe.(Named Pipe 는 양방향, 단방향 모두 가능)

void main()
{
	HANDLE hRead, hWrite;

	CreatePipe( &hRead, &hWrite, 0, 4096);

	// hWrite 에 쓰면 hRead에서 읽을수 있다.
	// hRead를 다른 프로세스에 전달해 주어야 한다.
	// 이미 다른 프로세스가 실행중이라면 DuplicateHandle()로
	// 새롭게 자식을 만들면서 전달하려면 KO 상속을 이용한다.

	// 읽기 위한 핸들을 상속 가능하게 한다.
	SetHandleInformation( hRead, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);

	char cmd[256];
	wsprintf( cmd, "child.exe %d", hRead); // 명령형 전달인자 사용

	PROCESS_INFORMATION pi;
	STARTUPINFO si = { sizeof(si)};

	BOOL b = CreateProcess( 0, cmd, 0, 0, TRUE, CREATE_NEW_CONSOLE,0,0,&si, &pi);
	
	if ( b )
	{
		CloseHandle( pi.hProcess);
		CloseHandle( pi.hThread);
		CloseHandle( hRead );
	}
	//--------------------------------------------
	char buf[4096];
	while ( 1 )
	{
		printf("전달할 메세지를 입력하세요 >> ");
		gets( buf );

		DWORD len;
		WriteFile( hWrite, buf, strlen(buf)+1, &len, 0);
	}
}




//client
#include <stdio.h>
#include <windows.h>

void main(int argc, char** argv)
{
	if ( argc != 2 )
	{
		printf("이프로그램은 직접 실행하면 안됩니다. 부모를 실행해 주세요\n");
		return;
	}
	// 부모가 보내준 pipe 핸들을 꺼낸다.
	HANDLE hPipe = (HANDLE)atoi(argv[1]);

	char buf[4096];

	while ( 1 )
	{
		memset( buf, 0, 4096 );
		
		DWORD len;
		BOOL b = ReadFile( hPipe, buf, 4096, &len, 0);

		if ( b == FALSE ) break;

		printf("%s\n", buf );
	}
	CloseHandle( hPipe );
}
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."