Inter-Process Communication
개념
프로세스는 시스템으로부터 자원을 할당받는 하나의 독립된 개체이다.
본래 프로세스는 할당된 자원(메모리) 범주 내의 정보만 접근할 수 있으며, 이를 벗어나는 경우 Segmentation Fault 등의 오류가 발생한다.
이는 커널이 프로세스의 안정성을 위해 다른 프로세스로 접근하는 것을 막기 때문이다.
pipe
- 통신을 위한 메모리 공간(버퍼)을 생성하여 프로세스가 데이터를 주고받는 기법
- 각 프로세스가 Read only, Write only 모드로만 동작한다.
- 통신이 필요할 때마다 파이프를 생성해야 하기 때문에 자원의 낭비가 심하다.
- 100개의 프로세스가 2개의 파이프로 서로 통신하면 100P2 = 9900개의 파이프가 생성된다.
- pipe 관련 system call로는 popen, pclose, pipe가 있다.
FILE popen(const char* command, const char* mode);
- pipe를 생성한다.
command
는 쉘 명령,mode
는 r, w이다. - 내부적으로
fork()
한 뒤 command 명령을exec()
로 실행하여 자식 프로세스가 수행하게 한다.
- pipe를 생성한다.
int pclose(FILE* stream);
- 인자로 지정한 pipe를 닫는다.
- waitpid 함수를 수행하며 자식 프로세스가 종료되기를 기다렸다가 return한다.
- return값은 자식 프로세스의 종료 상태이다. 실패 시 -1이다.
int pipe(int fields[2]);
- popen으로 pipe를 쉽게 생성할 수 있지만 쉘을 실행해야 하므로 비효율적이고 주고받는 데이터도 제한적이다.
- pipe는 과정이 다소 복잡하지만 더 효율적으로 pipe를 생성한다.
- fields[0]은 읽기 전용, fields[1]은 쓰기 전용으로 연다.
- 생성에 성공하면 0, 실패하면 -1을 반환한다.
파이프의 종류
Anonymous Pipe
- 따로 지칭하지 않아도 서로를 분간할 수 있는 경우에 사용된다.
- 부모 프로세스가 fork로 자식 프로세스를 생성하면 파일 지정 번호로 통신할 수 있다.
- 따로 지칭하지 않아도 서로를 분간할 수 있는 경우에 사용된다.
Named Pipe
- 익명 파이프가 부모-자식 프로세스 간 통신만 가능하다는 단점을 보완한다.
- 외부 프로세스와 통신하기 위해 나온 개념으로, pipe에 이름을 붙여준 것이다.
- 각 pipe에 이름과 권한을 부여하여 생성한다.
- 이름 있는 pipe는 특수 파일의 한 종류로 FIFO라고 한다.
- mknod : FIFO, 특수 파일을 생성한다.
- mkfifo : FIFO 파일만 생성한다.
Socket
- 네트워크 상에서 서버-클라이언트 사이의 통신 방법이다.
- 소켓 API라 불리는 프로그래밍 요청 혹은 function call로 만들어진다.