Windows System Programming IPC

mohadang·2023년 4월 23일
0
post-thumbnail

IPC

프로세스간 통신이다. 궁극적으로는 데이터를 공유하기 위한 기법이다.

Windows IPC

메일슬롯 기법

윈도우, 리눅스, 임베디드에 있는 기법이며 각 구현은 플랫폼마다 다르다.
Sender, Receiver로 나뉜다.
주소를 통해서 전달
Sender에서 Receiver로 단방향 데이터 전송만 가능
Sender에서 여러 Receiver로 데이터 전송 가능(브로드캐스팅)

UDP 특성과 매우 유사

메일슬롯 구조

프로세스 환경변수

IPC 관점으로 바라보는 일부 시각이 있을 수 있다.
환경변수는 주로 프로세스마다 고유한 정보를 저장하거나 전역적으로 공유하기 위해 사용한다.
프로세스 환경변수는 부모 프로세스가 자식 프로세스에게 상속 가능하기에 데이터 공유가 가능하다.

환경 변수는 key/value 방식으로 데이터 블록에 저장되어 있다.
프로세스 A 의 환경변수 테이블을 프로세스 B 에게 복사할 수 있다.

parent process

child process

이름 없는 파이프

단방향 통신만 가능
부모 자식간만 통신 가능하다. 부모 프로세스에서 pipe를 생성하면
자식 프로세스에게 파이프 핸들을 넘겨 주어야 한다

이름 있는 파이프

양방향 통신 가능.
자식 부모 관계가 아니어도 서로 통신이 가능하다.
이름 있는 파이프는 네임스페이스를 사용하여 이름을 부여한다.
파이프를 사용하는 프로세스들은 네임스페이스를 키값으로 사용하여 파이프에 대한 핸들을 획득하여 사용한다.
이름 있는 파이프는 이름 없는 파이프와 달리 연결 과정이 있다.

API

CreateNamedPipe 호출시 주의할 파라미터들이 있다

서버측에서 CreateNamedPipe 를 호출하여 이름에 대한 최대 파이프 인스턴스 개수를 지정할 수 있다.
이 갯수만큼 클라이언트들이 이름 있는 파이프를 통해서 서버와 통신이 가능하다.
다만 이 갯수는 CreateNamedPipe 를 처음 호출할때에만 적용되며 이후 호출에서는 무시된다.
그래서 첫번째에만 5 를 주고 이후 부터는 0을 줘도 이상 없지만 MS 에서는 같은 5 값을 계속 주기를 권고한다.
클라이언트 타임 아웃은 클라이언트가 연결시 대기 시간을 지정한다. 최대 인스턴스 개수만큼 도달 할때까지 파이프 연결이 되면 이 후 클라이언트 연결은 대기가 된다.

그리고 이름이 조금 했갈리지만 서버에서 Connect(ConnectNamedPipe)를 호출한다.

클라이언트측에서는 CreateFile을 통해 이름 있는 파이프 핸들을 획득 한 후 WaitNamedPipe를 호출하여 서버가 연결 해주기를 기다린다.

SetNamedPipeHandleState : 클라이언트에서 연결된 이름있는 파이프 모드를 변경할때 사용
FlushFileBuffers() : IPC 출력 버퍼를 비운다.
DisconnectNamedPipe() : 서버측에서 통신을 종료하기 위해서는 반드시 DisconnectNamedPipe()를 호출해주어야 한다. 단순히 CloseHandle만 사용하면 클라이언트측에서는 IPC 통신이 끊어진 것을 인지할 수 없다.

profile
mohadang

0개의 댓글