파이프

hgh1472·2023년 12월 23일
0

pipe

한 프로세스에서 다른 프로세스로의 단방향 통신 채널.
write와 read로 data 통신이 가능하다.

파이프 만들기

#include <unistd.h>
int pipe(int filedes[2]);
  • filedes[0] : 읽기용
  • filedes[1] : 쓰기용
  • 성공 시 0, 실패 시 -1 return

pipe의 특성

  • FIFO 처리
  • lseek은 작동하지 않는다. (읽은 데이터는 사라진다.)
  • pipe는 fork()에 의해 상속 가능

pipe를 이용한 단방향 통신 (부모 -> 자식)

  • pipe 생성
  • fork()에 의해 자식 생성 & pipe 복사
  • 부모는 읽기용, 자식은 쓰기용 pipe를 close

pipe를 이용한 양방향 통신

  • pipe 2개 생성
  • fork()에 의해 자식 생성 & pipe 2개 복사
  • pipe1 : 부모는 읽기용, 자식은 쓰기용 pipe close
  • pipe2 : 부모는 쓰기용, 자식은 읽기용 close

blocking read / blocking write

  • read가 blocking되는 경우 = pipe가 비어 있는 경우
  • write가 blocking 되는 경우 = pipe가 가득 찬 경우

pipe 닫기

  • 쓰기 전용 pipe 닫기
    다른 writer가 없는 경우, read를 위해 기다리던 process들에게 0을 return
  • 읽기 전용 pipe 닫기
    더 이상 reader가 없으면, writer들은 SIGPIPE signal을 받는다.

non-blocking read / non-blocking write

여러 pipe를 차례로 polling 하는 경우

#include <fcntl.h>
fcntl(filedes, F_SeTFL, O_NONBloCK);
  • filedes가 쓰기 전용이고, pipe가 차면 blocking 없이 즉시 -1 return
  • 읽기 전용인 경우에는, pipe가 비어 있으면, 즉시 -1 return

pipe를 이용한 client-Server

Client는 하나의 pipe로 request를 write한다.
Server는 여러 개의 pipe로부터 request를 read한다.

  • no request form any client -> server는 blocking
  • a request from any child -> read the request
  • more than one request -> read them in the order

select 시스템 호출

지정된 file descriptor 집합 중 어느 것이 읽기/쓰기 가능한 지 표시하는 system call.

읽기, 쓰기 가능한 file descriptor가 없으면 blocking
영구적 blocking을 막기 위해 time out을 사용

사용법

#include <sys/time.h>
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout);

FIFO

pipe는 동일 ancestor를 갖는 프로세스들만 연결 가능하다. fifo는 모든 프로세스들을 연결 가능하다.

UNIX의 file 이름을 부여받는다.
소유자, 크기, 연관된 접근 허가를 가진다.
일반 file처럼, open, close, read, write, remove가 가능하다.

사용법

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);

reader가 O_RDWR로 fifo를 open하는 이유

writer가 종료 시 blocking 된 채로 기다리기 위해. 아니면 무한 0 return

0개의 댓글