60 likes | 297 Views
파이프를 이용한 프로세스간 통신 파이프의 용량 초과시 다른 프로세스에 의해 자료가 읽혀져 파이프에 충분 한 공간이 마련될 때까지 수행이 중단 예제 (unix_test1.c) – p215 파이프의 용량을 초과하는 자료를 한 번에 write 하면 , write 는 여러 단계로 수행되어야 한다 . 이때 여러 프로세스가 같은 파이프에 동시에 쓰지 않도록 주의할 것. 파이프를 이용한 프로세스간 통신 쓰기 전용 파일 기술자를 닫았을 때 ; - 자료를 쓰기 위해 해당 파이프를 개방한 다른 프로세스가 존재하면 OK
E N D
파이프를 이용한 프로세스간 통신 • 파이프의 용량 초과시 다른 프로세스에 의해 자료가 읽혀져 파이프에 충분 한 공간이 마련될 때까지 수행이 중단 • 예제 (unix_test1.c) – p215 • 파이프의 용량을 초과하는 자료를 한 번에 write하면, write는 여러 단계로 • 수행되어야 한다. 이때 여러 프로세스가 같은 파이프에 동시에 쓰지 않도록 주의할 것
파이프를 이용한 프로세스간 통신 • 쓰기 전용 파일 기술자를 닫았을 때; • -자료를 쓰기 위해 해당 파이프를 개방한 다른 프로세스가 존재하면 OK • -파이프가 비어있는 경우, 읽으려는 프로세스는 작업을 수행할 수 없음 • 읽기를 기다리며 잠들어 있는 프로세스를 깨우고 0 return • 읽기 전용 파일 기술자를 닫았을 때; • 자료를 읽기 위해 해당 파이프를 개방한 다른 프로세스가 존재하면 OK • 파이프로부터 자료를 읽어 들이는 프로세스가 없으면 그 파이프에 자료를 쓰기 위해 기다리던 프로세스들은 SIGPIPE 시그널을 받고 -1로 return
봉쇄되지 않은 read와 write • fstat 사용 • 여러 프로세스가 파이프로부터 자료를 읽어들이는 경우, fstat와 read • 사이에 다른 프로세스가 파이프로부터 자료를 읽을 수 있음 • O_NONBLOCK 사용 • fcntl(filedes, F_SETFL, O_NONBLOCK) • 파이프가 차있을 경우 write는 -1로 복귀, errorno를 EAGAIN으로 지정 • 파이프가 비어 있을 경우 read는 -1로 복귀, errorno를 EAGAIN으로 지정 • 예제 – unix_test2.c (p220)
파이프를 이용한 프로세스간 통신 • 실습 • - 부모는 1000개의 random number를 생성해서 자식에게 보낸다 • - 자식은 평균값을 계산해서 부모에게 보낸다 • - 부모는 평균 값을 출력한다
다수의 파이프를 취급하기 위한 select 사용 • 그림 7.4 • 부모 프로세스가 server로 동작, 자식 프로세스가 client로 동작 • - int select(int nfds, fd_set *readfds, fd_set *writefds, • fd_set *errorfds, struct timeval *timeout); • nfds : 서버가 잠재적 흥미를 가진 파일 기술자의 수 • readfds : 읽을 만한 가치가 있는가? • writefds : 쓰기를 받아 들일 준비가 되어 있는가? • errorfds : error가 발생했는가? • timeout = null (block), timeout = 0 (return), timeout > 0 (지정된 시간 후 return)
다수의 파이프를 취급하기 위한 select 사용 • 예제 (unix_test4.c) – p226 • (실습) • 두 child를 생성해서 각각 filename (data1, data2)를 parent에게 전송 • parent를 filename을 받아 open, read, 화면 출력을 실행