Windows의 파이프 메커니즘의 두가지 종류.
1.이름없는 파이프(Anonymous Pipe)
2.이름있는 파이프(Named Pipe)
메일 슬롯과 파이프
메일슬롯은 네트워크로 연결되어 통신하는 프로세스들이나, 부모 자식간의 연관 관계가 전혀 없는 프로세스들 사이에서 통신 할 때 유용한 IPC 기법이다. 이름없는 파이프는 관계가 있는(부모 자식 관계, 형제 관계)프로세스들 사이에서 통신하는 경우에 유용하다.
이름있는 파이프, 이름이 있다는 것은 주소정보가 있다는 뜻이다. 즉 메일 슬롯처럼 서로 관계가 없는 프로세스들 사이에서도 주소정보를 공유하여 데이터를 주고받을 수 있다는 뜻이다. 또한 메일 슬롯과 달리 양방향 통신이 가능하다.
메일슬롯은 단방향 통신만을 지원하지만 브로드 캐스트(Broad Cast)방식의 데이터 전송이 가능하다. 따라서 여러사람에게 동시에 메시지를 전달하는 시스템 구현시 메일슬롯이 유용하다.
특징 정리
메일슬롯 : 단방향 통신 방식, 브로드캐스트 전송가능, 메일슬롯에 주소가 할당되어 주소를 기반으로 통신하기 때문에 관계없는 프로세스들 사이 통신가능
이름없는 파이프 : 단방향 통신 방식, 파이프를 통해서 생성된 핸들 기반 통신 -> 프로세스들 사이에 관계 필요
이름있는 파이프 : 양방향 통신 방식, 브로드 캐스트 X
이름없는 파이프(Anonymous Pipe)
BOOL CreatePipe(
PHANDLE hReadPipe,
PHANDLE hWritePipe,
LPSECURITY_ATTRIBUTES lpPipeAttributes,
DWORD nSize
);
1.hReadPipe : 파이프는 생성시 두개의 핸들을 얻게된다. 각각 데이터가 들어가는 쪽과 나가는 쪽이다. (데이터를 쓰는쪽, 읽는 쪽) 첫번째 인자는 데이터를 읽기위한 파이프 쪽의 핸들을 얻게된다.
2.hWritePipe : 데이터를 쓰는쪽에 해당하는 핸들을 얻는다.
3.lpPipeAttributes : 보안관련 정보
4.nSize : 파이프의 버퍼 사이즈를 지정하는 용도이다. 0을 전달하면 디폴트 사이즈로 버퍼크기가 결정된다.
파이프 생성시 생성되는 출력용핸들, 입력용 핸들을 상속한다면 부모 자식 프로세스간 메시지 전송이 가능해진다.
이름있는 파이프(Named Pipe)
1.CreateNamedPipe 함수를 통해 이름있는 파이프 생성
2.ConnectNamedPipe 함수 호출을 통해 파이프 연결 요청을 기다리는 상태로 변경
3.클라이언트에서 CreateFile함수를 통해 파이프와 연결
CreateNamedPipe 함수
HANDLE CreateNamedPipe(
LPCTSTR lpName,
DWORD dwOpenMode,
DWORD dwPipeMode,
DWORD nMaxInstances,
DWORD nOutBufferSize,
DWORD nInBufferSize,
DWORD nDefaultTimeOut,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
1.lpName : 파이프 이름 지정 ex)\\.\pipe\pipename
2.dwOpenMode : 파일 모드 지정과 유사
_PIPE_ACCESS_DUPLEX : 읽기, 쓰기 모두 가능
_PIPE_ACCESS_INBOUND : 읽기만 가능
_PIPE_ACCESS_OUTBOUND : 쓰기만 가능
3.dwPipeMode : 데이터 전송 타입, 데이터 수신 타입, 블로킹 모드 세가지를 설정한다.
4.nMaxInstance : 생성할 수 있는 파이프의 최대 개수를 지정한다.
PIPE_UNLIMITED_INSTANCES가 전달되면 생성 가능한 최대 개수만큼 생성된다.
5.nOutBufferSize : 이름 있는 파이프의 출력 버퍼 사이즈를 설정한다. 0입력시 Windows 디폴트 값 설정
6.nInBufferSize : 이름 있는 파이프의 입력 버퍼 사이즈 지정 0입력시 Windows 디폴트 값 설정
6.nDefaultTimeOut : WaitNamedPipe함수에 적용할 기본 만료시간을 밀리세컨드 단위로 설정한다.
7.lpSecurityAttributes : 보안 속성 지정
dwPipeMode 설정
데이터 전송 방식 : PIPE_TYPE_BYTE(바이트), PIPE_TYPE_MESSAGE(메세지) 데이터 전송시 바이너리 형태로 전송할 것인지, 메시지 방식으로 전송할 것인지를 결정한다. PIPE_TYPE_MESSAGE 전달시 텍스트 모드로 전송한다.
데이터 수신 방식 : PIPE_READMODE_BYTE, PIPE_READMODE_MESSAGE 바이너리 방식으로 읽을 것인지, 메시지 방식으로 읽을 것인지를 결정한다.
함수 리턴 방식 : PIPE_WAIT(블로킹), PIPE_NOWAIT(넌-블로킹) 무조건 PIPE_WAIT전달
각 모드들은 or연산으로 조합할 수 있다.
NamedPipe 사용시 유용한 함수들
connectNamedPipe 함수
BOOL ConnectNamedPipe(
HANDLE hNamedPipe,
LPOVERLAPPED lpOverlapped
);
1.hNamedPipe : CreateNamedPipe에서 생성된 파이프 핸들을 전달한다.
2.lpOverlapped : 중첩 I/O를 위한 전달인자이다.
WaitNamedPipe함수
BOOL WaitNamedPipe(
LPCTSTR lpNamedPipeName,
DWORD nTimeOut
);
1.lpNamedPipeName : 상태확인의 대상이 되는 파이프 이름
2.nTimeOut : 타임-아웃 시간 설정
SetNamedPipeHandleState 함수
BOOL SetNamedPipeHandleSTate(
HANDLE hNamedPipe,
LPDWORD lpMode,
LPDWORD lpMaxCollectionCount,
LPDOWRD lpCollectDataTimeout
);
1.hNamedPipe : 파이프와의 연결 속성 변경을 위한 핸들 지정
2.일기모드와 함수 리턴방식에 대한 값을 OR(|)연산하여 전달
3.lpMaxCollectionCount : 서버로 데이터를 보내기에 앞서서 버퍼링할 수 있는 최대바이트 크기 지정
4.lpCollectionDataTimeout : 서버로 데이터를 보내기에 앞서서 버퍼링허용 최대시간 지정
'Programming > Windows System Programming' 카테고리의 다른 글
컴퓨터 구조 세번째(1) (0) | 2020.07.15 |
---|---|
스케줄링 알고리즘과 우선순위 (0) | 2020.07.13 |
핸들 테이블과 오브젝트 핸들의 상속 (0) | 2020.07.11 |
프로세스 환경변수 (0) | 2020.07.11 |
Signaled vs Non-Signaled (0) | 2020.07.11 |