IPC에 대해 알아보자
- IPC란 무엇인가?
- IPC란 Interprocess Communications의 약자로, Windows 운영 체제 내 애플리케이션 간의 통신 및 데이터 공유를 용이하게 하는 메커니즘을 의미한다.
- 해당 메커니즘 내에서 프로세스 간 통신을 할 수 있도록 해준다.
IPC를 사용하는 서버와 클라이언트
- IPC 서버
- 애플리케이션 또는 클라이언트 요청에 응답하는 프로세스
- IPC 클라이언트
- 애플리케이션 또는 다른 애플리케이션 또는 프로세스에서 서비스를 요청하는 프로세스
파이프
파이프
- 프로세스에서 통신을 위해 사용하는 공유 메모리의 섹션
- 파이프 서버
- 파이프를 만드는 프로세스
- 파이프 클라이언트
- 파이프에 연결하는 프로세스
파이프 정보
- 익명 파이프
- 부모 프로세스와 자식 프로세스 간에 데이터를 전송하는 명명되지 않은 단방향 파이프
- 항상 로컬에서 작동(네트워크 통신에는 사용 불가)
- 명명된 파이프
- 파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위해 명명된 단방향 또는 이중 파이프.
- 명명된 파이프의 모든 인스턴스는 동일한 파이프 이름을 공유하나 각 인스턴스에는 자체 버퍼와 핸들이 있으며 클라이언트 / 서버 통신을 위한 별도의 통로 제공
- 인스턴스를 사용하면 여러 파이프 클라이언트에서 동일한 명명된 파이프를 동시 사용 가능
명명된 파이프의 파이프 이름
1
2
* 파이프 서버에서 CreateNamedPipe함수를 호출하여 명명된 파이프의 인스턴스를 하나 이상 만들 때 파이프의 이름을 지정.
* 파이프 클라이언트는 Createfile 또는 CallNamedPipe함수를 호출하여 명명된 파이프의 인스턴스에 연결할 때 파이프 이름을 지정
명명된 파이프의 이름 지정 양식
1
2
3
파이프 이름 양식) \\ServerName\pipe\PipeName
파이프 이름 예시) \\.\pipe\PipeName
- ServerName
- 로컬 컴퓨터를 지정하기 위한 원격 컴퓨터 또는 마침표의 이름
- 파이프 서버는 네트워크를 사용할 수 없기에 파이프 이름 예시와 같이 서버 이름에 마침표가 있어야 함.
- PipeName
- 이름 문자열
- 숫자 및 특수 문자를 포함하여 백슬래시 이외의 문자 포함 가능
- 최대 256자까지 가능
- 대/소문자 구분하지 않음
명명된 파이프 열기 모드
- 파이프 서버는 CreateNamedPipe 함수의 dwOpenMode 매개 변수에서 파이프 액세스, 겹침 및 쓰기 모드를 지정한다. 파이프 클라이언트는 CreateFile 함수를 사용하여 파이프 핸들에 대해 이러한 열린 모드를 지정할 수 있다.
액세스 모드
- PIPE_ACCESS_INBOUN
- 파이프 서버가 만든 파이프는 파이프 서버에 대해 읽기 전용, 클라이언트에 대해 쓰기 전용
- PIPE_ACCESS_OUTBOUND
- 파이프 서버가 만든 파이프는 파이프 서버에 대해 쓰기 전용, 클라이언에 대해 읽기 전용
- PIPE_ACCESS_DUPLEX
- 파이프 서버가 만든 파이프는 파이프 서버에 대해 읽기/쓰기 가능, 클라이언트에 대해 읽기/쓰기 가능
- CreateFile을 사용하여 명명된 파이프에 연결하는 파이프 클라이언트는 파이프 서버에 지정한 엑세스 모드와 호환된는 dwDesiredAccess 매개 변수에 액세스 권한을 지정해야 함 ``` 파이프 서버 생성된 파이프) * PIPE_ACCESS_OUTBOUND
파이프 클라이언트 파이프 핸들을 열기 위한 액세스 권한) * GENERIC_READ ```
명명된 파이프 유형, 읽기 및 대기 모드
- 형식 모드
- 데이터가 명명된 파이프에 기록되는 방법 결정
- 데이터는 명명된 파이프를 통해 바이트 스트림 또는 메세지 스트림으로 전송
- 파이프 서버는 CreateNamedPipe를 호출하여 명명된 파이프의 인스턴스를 만들 때 파이프 유형 지정
- 형식모드는 파이프의 모든 인스턴스에 대해 동일해야 함
- 바이트 형식 파이프 제작
- PIPE_TYPE_BYTE를 지정 혹은 기본값 사용
- 메세지 형식 파이프 제작
- PIPE_TYPE_MESSAGE 지정
- 읽기 모드
- 명명된 파이프에서 데이트럴 읽는 방법 결정
- CreateNamedPipe 호출 시 파이프 핸들의 초기 읽기 모드 지정
- 바이트 읽기 모드 또는 메시지 읽기 모드에서 데이터를 읽을 수 있음
- 바이트 형식 파이프에 대한 핸들은 바이트 읽기 모드에서만 존재
- 메세지 형식 파이프에 대한 핸들은 바이트 읽기 또는 메세지 읽기 모드
- 바이트 읽기 모드 파이프 제작
- PIPE_READMODE_BYTE 혹은 기본값 사용
- 메세지 읽기 모드 파이프 핸들 제작
- PIPE_READMODE_MESSAGE 지정
- 대기 모드
- 파이프 핸들의 대기 모드는 Readfile, WriteFile, ConnectNamedPipe함수가 작업 처리 결정
- 차단 대기 모드에서 함수는 파이프의 다른 쪽 끝에 있는 프로세스가 작업을 완료할 때까지 무기한 대기
- 비차단 대기 모드에서 함수는 무기한 대기가 필요한 상황에서 즉시 반환
- ReadFile
- 파이프가 비어 있을 때 파이프 핸들의 대기 모드에 의해 영향을 받음
- 차단 대기 핸들 사용 시 스레드 쓰기에서 파이프의 다른 쪽 끝에 데이터를 사요할 수 있을 때까지 작업이 완료 되지 않음.
- 비 블록킹 대기 핸들 사용하면 즉시 0을 반환, GetLastError 함수는 ERROR_NO_DATA 반환
- WriteFile
- 파이프 버퍼에 공간이 부족한 경우 파이프 핸들의 대기 모드에 의해 영향
- 차단 대기 핸들을 사용시 파이프의 다른 쪽 끝에서 읽는 스레드에 의해 버퍼에 충분한 공간이 생성될 때까지 쓰기 작업 완료되지 않음. 비 블로킹 대기 핸들 사용 시 쓰기 작업은 바이트를 작성하지 않거나 버퍼가 보유한 바이트 수를 작성하지 않고 즉시 0 반환
- ConnectNamedPipe
- 연결된 클라이언트가 없너가 파이프 인스턴스에 연결하기 위해 대기하는 경우 파이프 핸들의 대기 모드에 의해 영향 받음
- 차단 대기 핸들 사용 시 파이프 클라이언트가 CreateFile 또는 CallNamedPipe 함수를 호출하여 파이프 인스턴스에 연결할 때까지 대기
- 비 블로킹 대기 핸들 사용 시, 연결 작업이 즉시 0 반환, GetLastError 함수는 ERROR_PIPE_LISTENING 반환
## Reference —