管道

  管道linux支持最初unix IPC 形式之一,具有以下特点,管道是半双工的,数据只能想一个方向流动,需要双方通信是,需要建立两个管道, 管道有分为无名管道,命名管道;

  一:无名管道

    无名管道是通过函数pipe()创建,它返回的是一个二位数组类型,【0】端为读端,【1】端为写端

    下面是无名管道实现代码:

    子进程在【1】端写数据,父进程在【0】读数据

 1 #include <stdio.h>
 2 #include <fcntl.h>
 3 #include <stdlib.h>
 4 #include <unistd.h>
 5 
 6 int main()
 7 {
 8     int fd[2];
 9     int ret = 0;
10     pid_t pid = 0;
11     
12     ret = pipe(fd);
13     if(ret < 0) {
14         perror("pipe");
15         exit(EXIT_FAILURE);
16     }
17     
18     pid = fork(); //创建一个子进程    
19     if(pid < 0) {
20         perror("fork");
21         exit(EXIT_FAILURE);
22     }
23     
24     //子进程在【1】端写
25     if(pid == 0) {
26         ret = write(fd[1], "this is child\n", 15);
27         if(ret < 0) {
28             perror("write");
29             exit(EXIT_FAILURE);
30         }
31         close(fd[0]);        
32     }
32
34     if(pid > 0) {
35         char data[20] = {0};
36         ret = read(fd[0], data, 15);
37         if(ret < 0) {
38             perror("read");
39             exit(EXIT_FAILURE);
40         }
41         printf("data is: %s\n", data);
42         close(fd[1]);
43         wait(NULL);
44     }    
45 }

  二:下面是命名管道

  命名管道通过mkfifo创建一个管道文件,对文件进行读写操作

  实现过程如下:

 1 /*
 2  *有名管道就是通过mkfifo开创一个管道文件
 3  *对文件来进行读写操作
 4  * */
 5 #include <stdio.h>
 6 #include <signal.h>
 7 #include <stdlib.h>
 8 #include <fcntl.h>
 9 
10 int main()
11 {
12     int ret  = 0;
13 #if 0
14     //创建一个管道文件
15     ret = mkfifo("myfifo", 0644);
16     if(ret < 0) {
17             perror("mkfifo error");
18             exit(EXIT_FAILURE);
19         }
20 #else
21 
22 #endif
23 
24     int fd = open("myfifo", O_RDWR);
25     if(fd < 0) {
26         perror("open");
27         exit(EXIT_FAILURE);
28     }
29     
30     ret = write(fd, "hello world bunfly", 18);
31     if(ret < 0) {
32         perror("write");
33         exit(EXIT_FAILURE);
34     }
35         
36     char buf[20] = {0};
37     ret = read(fd, buf, 18);
38     if(ret < 0) {
39         perror("read");
40         exit(EXIT_FAILURE);
41     }    
42 
43     printf("buf is: %s\n", buf);
44     close(fd);
45     return 0;
46 }

 

posted @ 2015-08-20 15:55  zhangwju  阅读(192)  评论(0编辑  收藏  举报