본문 바로가기
UNIX 프로그래밍

[9주차 개념] 파이프

by 서영선 2023. 11. 14.

 

🚩 pipe 

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

 

#include <unistd.h>

int pipe(int filedes[2]);

 

  • filedes[0] : 읽기용
  • filedes[1] : 쓰기용
  • 성공시 0, 실패 시 -1 return
  • process 당 open file 수, 시스템 내의 file 수 제한

 

 

🚩 pipe의 특성

  1. FIFO 처리
  2. lseek은 작동하지 않음 ( 읽은 데이터는 사라짐 )
  3. pipe는 fork()에 의해 상속 가능

 

 

 

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

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

 

main() {
	char ch[10];
    int pid, p[2];
    
    if (pipe(p) == -1){
   		perror("pipe call");
        exit(1);    
    }
    
    pid = fork();
    if (pid == 0){
    	close(p[1]);
        read(p[0], ch, 10);
        printf("%s\n", ch);
        exit(0);
    }
    
    close(p[0]);
    scanf("%s", ch);
    write(p[1], ch, 10);
    wait(0);
    exit(0);
}

 

 

 

 

🚩 pipe를 이용한 양방향 통신 

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

 

 

🚩 blocking read / blocking write

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

 

main(){
	int i, in, pid, p[2][2];
    
    for(i=0;i<2;i++){
    	pipe(p[i]);
    }
    pid = fork();
    if (pid ==0){
    	close(p[0][1]);
        close(p[1][0]);
        read(p[0][0], &in, sizeof(int));
        in++;
        write(p[1][1], &in, sizeof(int));
        exit(0);
    }
    close(p[0][0]);
    close(p[1][1]);
    scanf("%d", &in);
    write(p[0][1], &in, sizeof(int));
    read(p[1][0], &in, sizeof(int));
    printf("%d\n", in);
    wait(0);
    exit(0);
}

 

 

 

 

🚩 pipe 닫기

  • 쓰기 전용 pipe 닫기 : 다른 write가 없는 경우, read를 위해 기다리던 process들에게 0을 리턴 (EOF과 같은 효과)
  • 읽기 전용 pipe 닫기 : 더 이상 reader가 없으면, write들은 SIGPIPE signal을 받는다. Signal handling이 되지 않으면 process는 종료, signal handling이 되면, signal 처리 후 write는 -1을 리턴

 

 

 

🚩 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
  • 이 경우, errno는 EAGAIN

 

 

 

 

'UNIX 프로그래밍' 카테고리의 다른 글

[8주차 개념] 메모리 매핑  (0) 2023.11.10
[7주차 개념] 시그널  (0) 2023.11.10
[4주차 실습] UNIX 실습 문제  (0) 2023.10.22
[3주차 실습] UNIX 실습 문제  (0) 2023.10.22
[2주차 실습] UNIX 실습 문제  (1) 2023.10.22

댓글