189 8069 5689

unix父子进程间通信-无名管道

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

 

创新互联专注于八宿企业网站建设,响应式网站建设,商城网站制作。八宿网站建设公司,为八宿等地区提供建站服务。全流程专业公司,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务


网站栏目:unix父子进程间通信-无名管道
网页链接:http://ptruijie.cn/article/ghhpeh.html

其他资讯