1. 程式人生 > >pipe管道簡單搭建

pipe管道簡單搭建

#include <stdio.h> 
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>

int main(void)
{
   int fd[2];
   pid_t pid;
   char str[1024] = "helloworld";
   char buf[1024];
   //先建立管道,然後fork,建立子程序,即使子程序繼承管道
   //pipe為單工模式,想要雙向通訊,可以建立兩個管道
   if(pipe(fd)<0)
   {
	  perror("pipe");
    exit(1);
   }
   pid= fork();
   //父寫子讀
   //fd[0]讀端
   //fd[1]寫端
   if(pid>0)
   {
    //父程序關閉讀
     close(fd[0]);
     sleep(2);
     write(fd[1],str, strlen(str));
     close(fd[1]);//管道用完關閉
     wait(NULL);
   }
   else if(pid ==0)
   {
      int len,flags;
      //子程序關閉寫
      close(fd[1]);
      //改變檔案描述符為非阻塞模式
      flags=fcntl(fd[0], F_GETFL);
      flags|=O_NONBLOCK;
      fcntl(fd[0], F_SETFL, flags);

      tryagain:
          len = read(fd[0], buf, sizeof(buf));
          if(len==-1){
            //讀到為空
            if(errno==EAGAIN){
              write(STDOUT_FILENO, "try again\n", 10);
              goto tryagain;
            }
            else{
              perror("read");
              close(fd[0]);
              exit(1);
            }
          }
      write(STDOUT_FILENO,buf, len);
      close(fd[0]);//管道用完關閉
   }
   else
   {
    perror("fork");
    exit(1);
   }
 return 0;
}