Pipe
- Uni-directional byte stream
- name or ID가 없음 -> unrelated process 간 사용 불가능
- related process 간에 사용 가능 (ex. fork())
- 한 프로세스 당 read, write의 일방향적
Pipe fork()
- 위 그림은 오류 존재. Parent Process가 Child Process에게 데이터를 전송하려 할 때, 자신이 write한 데이터를 read해버릴 수 있음
- Parent Process의 read fd와 Child Process의 write fd를 close 시켜 일방향성 유지
Pipe APIs
int pipe(int pipefd[2]);
- pipe 생성
파라미터
- pipefd[2]: 생성될 pipe fd[2]를 저장할 버퍼
- pipefd[0]: reader-side fd
- pipefd[1]: writier-side fd
반환값
- 성공시 0 리턴
- 실패시 -1 리턴
Pipe I/O
- pipe가 full 일 때 write 시도하면 blocking, 위에서 언급했듯이 Pipe는 Byte Stream으로 구성되어 있기 때문에 Pipe 내부가 꽉 차면 데이터를 더 저장할 수 없기 때문에 blocking됨.
- pipe가 empty일 때 read 시도하면 blocking
- write size가 PIPE_BUF보다 작으면 atomic(데이터가 방해받지 않고 온전히 저장) 크면 interleaved(데이터가 분리 되어 저장돼 분리된 중간 부분에 다른 데이터가 저장) 될 수 있음.
( Linux PIPE_BUF: 4KB
( multiple writier 환경에서 유의
Named Pipe(FIFO)
- Uni-directional byte stream
- 파일 경로가 ID
( unrelated process 간에도 사용 가능
- FIFO 생성과 open이 분리되어 있음
- open()시 read-side와, write-side가 동기화 됨
( 즉 , 양쪽 모두 open 시도가 있어야 성공, 만약 read만 open된 후 read는 write가 open을 하는 순간에 같이 성공하게 됨.
( open 시 O_NONBLOCK이 유용하게 사용될 수 있음, 기다리지 않고 먼저 열어 놓는 방법
Named Pipe APIs
int mkfifo (const chat *pathname, mode_t mode);
(named pipe 파일을 생성한다.
파라미터
- dpathname: 생성할 named pipe 파일 경로, 지정된 경로에 파일 생성됨
- mode: permisision, 파일이 갖게 되는 permission
반환값
- 성공시 0 리턴
- 실패시 -1 리턴
- named pipe 파일 생성 후 open,read,write 시스템 콜을 이용해야 IPC 가능
'Computer Science > 시스템 프로그래밍' 카테고리의 다른 글
Named Pipe 사용 예시 (0) | 2022.12.22 |
---|---|
Pipe 사용 예시 (0) | 2022.12.22 |
IPC란? (0) | 2022.12.22 |