- 파이프 란 ?
# 간단하게 말하자면 한 프로세스의 출력이 다른 프로세스의 입력으로 들어가서
두개의 프로세스가 inter-communication 을 하는 것이다.
# FIFO basis
# half duplex ( full duplex를 굳이 하자면 가능 하기는 하지만 이를 권고)
(보내는 쪽은 보내기만, 받는 쪽은 받기만)
# 공통 부모인 프로세스나 친척들 끼리 파이프를 사용가능 (parent-child뿐만 아니라 child-child도 가능(공통조상에서 파이프를 열였을 경우))
# 공통조상이 아닌 프로세스들 끼리 파이프와 같은 기능을 사용하고 싶을 때는 FIFO 를 이용
# #include<iostream>
int pipe(int filedes[2]);
# 프로세스가 파이프를 통해 read를 하려고 하는 경우
-1. pipe is not empty : read를 하고 즉시 리턴 한다. (리턴값은 읽은 데이터의 바이트 수)
-2. pipe is empty : read가 block된다. ( write를 통해서 들어올 때까지 기다림)
# 프로세스가 파이프를 통해 write를 하려고 하는 경우
-1. pipe is not full : 즉시 write하고 리턴한다.
-2. pipe is full : 빈(여유)공간이 만들어 질때 까지 block(기다림)
# 파이프의 한쪽이 closed(닫힌경우)
-1 . (write 가 닫혔을 때) read의 경우 데이터 파일을 다 읽고 나면 0을 리턴한다.
-2 . (read 가 닫혔을 때) write의 경우 write를 해도 read할 프로세스가 없다.
커널이 SIGPIPE라는 시그널을 보낸다.(write를 실행한 프로세스에게)
(default 값은 죽는것.)
시그널을 무시하거나 잡아서(catch) 핸들러를 수행하거나 할경우 -1을 리턴하고
errno을 EPIPE로 셋팅한다.
'학부생 공부 > unix' 카테고리의 다른 글
쉘 구현 (Redirection, 파이프(pipes)) (6) | 2020.03.03 |
---|---|
쉘 구현(제어키 SIGINT, SIGQUIT 사용시 미종료) (2) | 2020.03.03 |
쉘 구현하기 . (백그라운드 실행) (0) | 2019.11.06 |