[Linux]Pipe

공부기록·2023년 12월 2일
0
post-thumbnail

🔊 Pipe

  • 파이프란 Unix에서 제공하는 IPC 중 하나로 프로세스간의 소통이 이루어진다고 생각할 수 있다. 하나의 프로세스의 표준 입력을 PIPE에 연결하고 다른 프로세스의 표준 출력을 PIPE의 read에 연결하면 하나의 프로세스가 입력(write)하면 다른 프로세스에서 출력(read)가 이루어지는 것이다.

🔈 pipe()

  • FIFO 기반이며 단방향이면서 parent와 child 관계에서 수행된다.
# include <unistd.h>

int pipe(int filedes[2]);

/* 성공시 0, 실패시 -1을 반환 */
  • argument
    • filedes[0]은 read로 filedes[1]은 write로 이용한다.
  • errno : EMFILE, ENFILE


🏷️ 파이프의 block

read 실행시 파이프가 비어있으면 read가 block되고 write 실행시 파이프가 꽉 차있으면 write가 block된다. 정상적인 경우는 모두 금방 return된다.

🏷️ 파이프의 한쪽이 종료된다면

  • write가 먼저 종료되면 데이터를 다 읽은 후 EOF로 인지하여 0을 반환한다.
  • read가 먼저 종료되면 -1을 반환하고 SIGPIPE 시그널이 발생하여 errno에 EPIPE값이 들어간다.

main(){
   char inbuf[MSGSIZE];
   int p[2], j;
   pid_t pid;

   pipe(p); //pipe 선언

   switch (pid = fork()){
   case -1: perror ("fork call"); exit (2);
   /*
   	자식 프로세스는 p[1]에 write를 진행한다.
   */
   case 0:
      close (p[0]); //불필요한 부분은 닫는다.
      write (p[1], msg1, MSGSIZE);
      write (p[1], msg2, MSGSIZE);
      write (p[1], msg3, MSGSIZE);
      break,
   /*
     부모 프로세스는 child가 pipe에 write값을 차례로 읽어온 후 출력한다.(FIFO)
   */
   default:
      close (p[1]); //불필요한 부분은 닫는다.
      for (j = o; j < 3; j++){
         read (p[0], inbuf, MSGSIZE);  
         printf ("%s\n", inbuf);
      }
      wait (NULL);
 }
 exit (0);
}

  • 예시와 같이 코드를 짜면 Parent의 4번 fd와 Child의 3번 fd는 사용되지 않으므로 close 시켜줘야한다. 만약 close하지 않으면 child가 먼저 종료된 후에도 parent의 4번에서 write를 실행하려 할 것이고 그러다 계속 block되어 deadlock이 발생할 것이다.

작성중

0개의 댓글

관련 채용 정보