IPC
IPC는 서로 다른 프로세스가 데이터를 주고받거나 작업 순서를 맞추는 방법이다. 같은 컴퓨터 안에서도 프로세스의 주소 공간은 기본적으로 분리되어 있으므로, 별도의 통신 수단이 필요하다.
데이터의 흐름에 맞춰 고르기
| 방식 | 적합한 흐름 | 함께 고려할 것 |
|---|---|---|
| 파이프 | 한 명령의 출력을 다음 명령으로 전달 | 바이트 스트림이며 메시지 경계는 별도로 다뤄야 함 |
| Unix domain socket | 같은 호스트의 클라이언트·서버 통신 | 소켓 경로와 접근 권한 |
| 공유 메모리 | 여러 프로세스가 큰 데이터를 같은 영역에서 참조 | 동기화와 데이터 수명 |
| 메시지 큐 | 메시지 단위로 보내고 받기 | 큐 용량과 송수신 실패 처리 |
세마포어는 주로 공유 자원 접근을 조율하는 도구다. 데이터 자체를 전달하는 방식과 동기화 수단은 구분한다. 공유 메모리를 선택했다고 경쟁 상태까지 해결되는 것은 아니다.
파이프에서 EOF가 전달되는 조건
printf '%s\n' first second | wc -l
출력은 2다. printf가 데이터를 쓴 뒤 쓰기 쪽을 닫으면, 읽는 쪽은 남은 데이터를 소비하고 EOF를 확인한다. 파이프를 사용하는 프로그램이 끝나지 않는다면 다른 프로세스가 쓰기 파일 디스크립터를 계속 열고 있는지도 확인한다.
SSH Agent도 로컬 IPC다
SSH 클라이언트는 Agent 소켓으로 서명을 요청할 수 있다. 개인 키 파일을 매번 읽는 것과 다르다. 따라서 SSH_AUTH_SOCK이 잘못된 소켓을 가리키면 Agent 프로세스가 실행 중이어도 키를 사용할 수 없다. 1Password 다중 계정 구성에서 이 문제를 실제 설정과 연결해 설명한다.
자료: pipe(7), unix(7), shm_overview(7)