管道

  管道是 linux下支持的最初的IPC形式之一,管道是半双工的,数据只可以想一个方向流动;如果要双向流动的话,需要建立两个管道;

    一:无名管道:

      无名管道定是死的,pipe()函数返回的是一个二维数组类型,【0】端固定是读端,【1】端是写端;

      代码:

        

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <signal.h>
  4 
  5 int main()
  6 {
  7     int fd[2];
  8     //
  9     int ret =pipe(fd);
 10     if(ret < 0)
 11     {
 12         perror("pipe!\n");
 13         exit(EXIT_FAILURE);
 14     }
 15 
 16     int pid = fork();
 17     if(pid <0)
 18     {
 19         perror("fork!\n");
 20         exit(EXIT_FAILURE);
 21     }
 22     if(pid ==0)
 23     {
 24         write(fd[1],"hello this child_process write!\n",40);
 25     }
 26     if(pid >0)
 27     {
 28         sleep(3);
 29         char buff[40];
 30         read(fd[0],buff,40);
 31         printf("buff is %s\n",buff);
 32     }
 33 
 34     return 0;
 35 
 36 
 37 }
 38 
 39 

  其中是,创建一个子进程,在子进程读,在父进程中来写;

 

 

二.有名管道:

    

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <signal.h>
  4 #include <fcntl.h>
  5   
  6 int main()
  7 { 
  8     //
  9     //int ret = mkfifo("myfifo",0644);
 10     //if(ret < 0)
 11     //{ 
 12     //  perror("pipe!\n");
 13     //  exit(EXIT_FAILURE);
 14     //} 
 15  
 16     int fd=open("myfifo",O_RDWR);
 17     if(fd < 0)
 18     {
 19         perror("open!\n");
 20         exit(EXIT_FAILURE);
 21     }   
 22             
 23     int ret=write(fd,"hello this is write!\n",40);
 24     if(ret < 0)
 25     {   
 26         perror("write!\n");
 27         exit(EXIT_FAILURE);
 28     }   
 29  
 30     char buff[40];
 31     ret=read(fd,buff,40);
 32     if(ret < 0)
 33     {       
 34         perror("open\n");
 35         exit(EXIT_FAILURE);
 36     }
 37  
 38     printf("buff is %s\n",buff);
 39     close(fd);
 40     return 0;
 41    
 42  
 43 }

  有名管道就是通过mkfifo开创建一个管道文件,对文件来读写操作;

 

 

  

posted @ 2015-06-11 21:20  慢伴拍的二叉树  阅读(237)  评论(0编辑  收藏  举报