unix父子进程间通信-无名管道-创新互联

  1. #include 
  2. #include 
  3. #include 
  4. #include 
  5. #include 
  6. #include 
  7. #include 
  8. #define MAXLINE 100
  9. char buf[MAXLINE];
  10. int main(int argc, char** agrv)
  11. {
  12.         int pipefd[2];
  13.         int ret;
  14.         if(0 != pipe(pipefd))//创建管道
  15.         {
  16.                 perror("pipe\n");
  17.                 exit(1);
  18.         }
  19.         //创建子程序
  20.         if((ret=fork()) < 0)//创建失败
  21.         {
  22.                 perror("fork\n");
  23.                 exit(1);
  24.         }
  25.         else if(ret == 0)//子程序
  26.         {
  27.                 FILE* fp;
  28.                 close(pipefd[0]);//关闭管道可读端
  29.                 fp = fopen("./main.c","r"); //打开已存在可读文件
  30.                 if(NULL == fp)
  31.                 {
  32.                         perror("fopen\n");
  33.                         exit(1);
  34.                 }
  35.                 while(fgets(buf,MAXLINE,fp) != NULL)//将文件内容全部读入管道
  36.                 {
  37.                         int n = strlen(buf);
  38.                         if(n != write(pipefd[1],buf,n))
  39.                         {
  40.                                 perror("write\n");
  41.                                 exit(1);
  42.                         }
  43.                 }//end while
  44.                 if(ferror(fp))//在读的过程文件是否有报错
  45.                 {
  46.                         perror("ferror\n");
  47.                         exit(1);
  48.                 }
  49.                 close(pipefd[1]);//关闭文件可写端
  50.                 exit(0);//退出子程序
  51.         }
  52.         else
  53.         {
  54.                 close(pipefd[1]);//关闭管道可写端
  55.                 if(-1 == wait(NULL))//等待子程序完全将文件内容读入到管道
  56.                 {
  57.                         perror("wait\n");
  58.                         exit(1);
  59.                 }
  60.                 if(dup2(pipefd[0],STDIN_FILENO) != STDIN_FILENO)//重新设置标准输入为管道可读端
  61.                 {
  62.                         perror("dup2\n");
  63.                         exit(1);
  64.                 }
  65.                 if(execl("/bin/more","more",(char*)0) < 0 )//分页程序 自动调用标准输入文件 显示管道内容
  66.                 {
  67.                         perror("execl\n");
  68.                         exit(1);
  69.                 }
  70.         }
  71.         return 0;
  72. }

创新互联公司是一家专业提供瑞安企业网站建设,专注与成都网站建设、网站制作、html5、小程序制作等业务。10年已为瑞安众多企业、政府机构等服务。创新互联专业的建站公司优惠进行中。

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文标题:unix父子进程间通信-无名管道-创新互联
本文URL:http://ybzwz.com/article/doipgh.html