네임드 파이프 (Named-Pipe)
네임드 파이프 (Named-Pipe)
네임드 파이프 란?
익명 파이프(Pipe)
통신을 할 프로세스가 명확하게 알 수 있는 경우 사용
자식과 부모 프로세스간 통신의 경우에 사용 가능
[단점]
PPID(같은 부모 프로세스)를 가지는 프로세스들 사이에서만 통신이 가능
전혀 모르는 상태의 프로세스들 사이의 통신의 경우 사용
네임드 파이프 (Named Pipe)
Named Pipe는 Pipe의 단점을 해결한, Pipe의 확장이라고 할 수 있음
이름을 가진 PIPE 를 통해서 프로세스들 간에 단방향 통신을 지원
서로 다른 프로레스들이 PIPE 의 이름만 알면 통신이 가능함
[단점]
읽기/쓰기가 동시에 불가능함, read only, write only 만 가능
해당 단점을 해결하기 위해 보통 pipe 하나를 읽기전용, 하나를 쓰기 전용으로 열어서 사용함
IPC 종류 |
PIPE |
Named PIPE |
사용 시기 |
부모 자식 간 단 방향 통신 시 |
다른 프로세스와 단 방향 통신 시 |
공유 매개체 |
파일 |
파일 |
통신 단위 |
Stream |
Stream |
통신 방향 |
단 방향 |
단 방향 |
네임드 파이프 통신과정
Server (Read)가 하는 작업
1. CreateNamePipe()
파이프를 생성
(매개변수 설명)
CreateNamedPipe( LPCWSTR lpName, # 파이프 이름 지정 예) \\\\.\\pipe\\pipename DWORD dwOpenMode, # 3가지 종류의 open mode(flag)가 존재 # PIPE_ACCESS_DUPLEX //읽기 + 쓰기 모드 # PIPE_ACCESS_INBOUND //읽기 (서버입장에서의 읽기) # PIPE_ACCESS_OUTBOUND //쓰기 (서버입장에서의 쓰기) DWORD dwPipeMode, # 3가지 종류의 Pipe mode(flag)가 존재 # PIPE_TYPE_BYTE, PIPE_TYPE_MESSAGE = 데이터 전송 형태 결정(바이너리, 메시지 모드) # PIPE_READMODE_BYTE , PIPE_READMODE_MESSAGE = 데이터 수신 형태 결정(바이너리, 메시지 모드) # PIPE_WAIT, PIPE_NOWAIT = PIPE_WAIT만 쓰입니다. DWORD nMaxInstances, # 생성할 수 있는 최대한의 파이프 갯수. 1~255 까지 허용. DWORD nOutBufferSize, # 파이프 출력 버퍼 사이즈 DWORD nInbufferSize, # 파이프 입력 버퍼 사이즈 DWORD nDefaultTimeOut, # WaitNamedPipe() 함수에 적용할 시간. 단위 : ms (1/1000초) LPSECURITY_ATTRIBUTES lpSecurityAttributes # 보안 속성을 가지는 구조체 ); |
2. ConnectNamePipe()
다른 프로세스들이 파이프 연결 요청을 기다림
(매개변수 설명)
BOOL ConnectNamedPipe( HANDLE hNamedPipe, # CreateNamedPipe를 통해 호출된 파이프 핸들 전달 LPOVERLAPPED lpOverlapped # 중첩 I/O를 위한 전달 인자. ); |
Client (Writer)가 하는 작업
1. CreateFile()
파일을 생성하는 함수
하지만 IPC 연결 요청을 하는 경우 메일슬롯, 파이프 등 생성하는 중요한 함수
(매개변수 설명)
HANDLE CreateFile( LPCTSTR lpFileName, # 파일을 생성하거나 open 할 경로 DWORD dwDesiredAcess, # 파일 엑세스 권한 설정 (Flag) DWORD dwShareMode, # 파일의 공유 모드를 설정 (Flag) LPSECURITY_ATTRIBUTES lpSecurity Attribute # SECURITY_ATTRIBUTES 구조체의 포인터 DWORD dwCreationDisposition, # 파일이 해당 위치에 존재하는지에 따른 행동 설정 (Flag) DWORD dwFlagsAndAttributes, # 생성될 파일의 속성을 지정 (Flag) 예) 읽기전용, 숨김설정, 등등 HANDLE hTemplateFile # GENERIC_READ 엑세스 권한을 가진 템플릿 파일의 유효한 핸들 );
|