2011년7월20일_프로세스간 파이프를 통한 통신, pipe()...슈퍼마리오의 배관이라 생각하면되!!



시간 없어어엉어어어엉어~4a46b55d020016m1
문서정리해 업로드하는게 왜 이렇게 힘든지...ㅠㅠ



참조(Reference)




DSCN3675 DSCN3676 DSCN3677 DSCN3678 DSCN3673 DSCN3674




   1:  // pipe1.c
   2:  #include <stdio.h>
   3:  #include <unistd.h>
   4:  #include <stdlib.h>
   5:   
   6:  #define    BUFSIZE    30
   7:   
   8:  int main(int argc, char *argv[])
   9:  {
  10:      int fd[2];                //파이프 출입구를 담을 디스크립터
  11:      char buffer[BUFSIZE];    //문자열을 담을 버퍼
  12:      pid_t pid;                //자식프로세스의 pid값을 담을 변수
  13:      int state;                //상태를 저장할 변수
  14:      
  15:      state = pipe(fd);        //하나의 파이프를 생성하고,
  16:                              //두 개의 파일디스크립터도 생성한다.
  17:                              //이 파이프를 통해 부모/자식 프로세스간 통신.
  18:   
  19:      if(-1 == state)            //파이프생성 실패시 처리
  20:      {
  21:          fprintf(stderr, "pipe() error\n");
  22:          exit(1);
  23:      }
  24:   
  25:      pid = fork();            //프로세스 복사해 자식프로세스 생성
  26:   
  27:      if(-1 == pid)            //프로세스 복사 실패시 처리
  28:      {
  29:          fprintf(stderr, "fork() error\n");
  30:          exit(1);
  31:      }
  32:      else if(0 == pid)        //자식프로세스 역활
  33:      {                        //파이프 입구로 "Good \n"문자열 전송
  34:          write(fd[1], "Good \n", 7);
  35:      }
  36:      else                    //부모프로세스 역활
  37:      {                        //파이프 출구로 부터 데이터 수신.
  38:          read(fd[0], buffer, BUFSIZE);
  39:          puts(buffer);
  40:      }
  41:   
  42:      return 0;
  43:  }



image



   1:  // pipe2.c
   2:  #include <stdio.h>
   3:  #include <unistd.h>
   4:  #include <stdlib.h>
   5:   
   6:  #define    BUFSIZE    30
   7:   
   8:  int main(int argc, char *argv[])
   9:  {
  10:      int fd[2];                //파이프 출입구를 담을 디스크립터
  11:      char buffer[BUFSIZE];    //문자열을 담을 버퍼
  12:      pid_t pid;                //자식프로세스의 pid값을 담을 변수
  13:      int state;                //상태를 저장할 변수
  14:      
  15:      state = pipe(fd);        //하나의 파이프를 생성하고,
  16:                              //두 개의 파일디스크립터도 생성한다.
  17:                              //이 파이프를 통해 부모/자식 프로세스간 통신.
  18:   
  19:      if(-1 == state)            //파이프생성 실패시 처리
  20:      {
  21:          fprintf(stderr, "pipe() error\n");
  22:          exit(1);
  23:      }
  24:   
  25:      pid = fork();            //프로세스 복사해 자식프로세스 생성
  26:   
  27:      if(-1 == pid)            //프로세스 복사 실패시 처리
  28:      {
  29:          fprintf(stderr, "fork() error\n");
  30:          exit(1);
  31:      }
  32:      else if(0 == pid)        //자식프로세스 역활
  33:      {                        //부모로 "Good!"전송하고 2초대기
  34:          write(fd[1], "Good!", 6);
  35:          //sleep(2);
  36:          read(fd[0], buffer, BUFSIZE);    //수신
  37:          printf("Output of child process : %s \n\n", buffer);
  38:      }
  39:      else                    //부모프로세스 역활
  40:      {                        //파이프 출구로 부터 데이터 수신.
  41:          read(fd[0], buffer, BUFSIZE);
  42:          printf("Output of parent process : %s \n", buffer);
  43:          write(fd[1], "Really Good", 12);    //응답
  44:          sleep(3);            //고아프로세스가 되지 않도록 대기
  45:      }
  46:   
  47:      return 0;
  48:  }



image




   1:  // pipe3.c
   2:  #include <stdio.h>
   3:  #include <unistd.h>
   4:  #include <stdlib.h>
   5:   
   6:  #define    BUFSIZE    30
   7:   
   8:  int main(int argc, char *argv[])
   9:  {
  10:      int fd1[2], fd2[2];        //파이프 출입구를 담을 디스크립터
  11:      char buffer[BUFSIZE];    //문자열을 담을 버퍼
  12:      pid_t pid;                //자식프로세스의 pid값을 담을 변수
  13:      
  14:      if(-1 == pipe(fd1) || -1 == pipe(fd2))        //에러처리
  15:      {
  16:          fprintf(stderr, "pipe() error\n");
  17:          exit(1);
  18:      }        
  19:   
  20:      pid = fork();            //프로세스 복사해 자식프로세스 생성
  21:   
  22:      if(-1 == pid)            //프로세스 복사 실패시 처리
  23:      {
  24:          fprintf(stderr, "fork() error\n");
  25:          exit(1);
  26:      }
  27:      else if(0 == pid)        //자식프로세스 역활
  28:      {                        //부모로 "Good!"전송하고 2초대기
  29:          write(fd1[1], "Good!", 6);
  30:          read(fd2[0], buffer, BUFSIZE);    //수신
  31:          printf("Output of child process : %s \n\n", buffer);
  32:      }
  33:      else                    //부모프로세스 역활
  34:      {                        //파이프 출구로 부터 데이터 수신.
  35:          read(fd1[0], buffer, BUFSIZE);
  36:          printf("Output of parent process : %s \n", buffer);
  37:          write(fd2[1], "Really Good", 12);    //응답
  38:          sleep(1);            //고아프로세스가 되지 않도록 대기
  39:      }
  40:   
  41:      return 0;
  42:  }


image