进程通信之管道

来源:互联网 发布:ubuntu 系统剪贴板 编辑:程序博客网 时间:2024/06/04 18:40

管道通信分为两种,一种是匿名管道,另一种是命名管道,对于这两种管道有什么区别呢?
匿名管道,顾名思义就是没有名字,他只能让拥有血缘关系的两个进程进行通信,它是让两个进程分别连接管道的读端和写端,将数据保存在该管道内,两个进程就都能看到这些信息了。
因为匿名管道不能让两个没有血缘关系的进程通信,那么这些进程想要通信要怎么办呢?所以命名管道就出现了。
命名管道可以让两个毫无关系的进程进行通信,它是在硬盘上创建了一个管道文件,它在创建时需要定义路径,所以其他进程也可以连接到该管道,就实现了两个没有关系的进程间通信。
那么匿名管道如何让编写呢?

子进程向父进程发送一个hello world的消息:

  1 #include <sys/types.h>  2 #include <sys/wait.h>  3 #include <unistd.h>  4 #include <stdio.h>  5 #include <string.h>  6 int main()  7 {      8     ssize_t n;  9     int i=0;                                                               10     int fd[2]={0, 0 }; 11     char buf[1024]; 12      //判断创建的管道是否成功 13     if(pipe(fd)<0) 14     { 15         perror("pipe"); 16         return 1; 17     } 18     pid_t pid = fork(); 19     if(pid < 0) 20     { 21         perror("fork"); 22         return 2; 23     } 24     if(pid == 0) 25     { 26         close(fd[0]);//--->write 27         const char* arr = "hello linux!\n"; 28         while(i<10) 29         { 30             write(fd[1], arr, strlen(arr)); 31             sleep(1); 32             i++;                                                           33         } 34     } 35     else 36     { 37         close(fd[1]);//---->read 38         i=0; 39         while(i<10) 40         { 41             n = read(fd[0], buf, sizeof(buf)-1); 42             if(n > 0) 43             { 44                 buf[n-1] = 0; 45                 printf("client->father#%s\n", buf); 46             } 47             i++;                                                           48         } 49     } 50     return 0; 51 }

子进程先向管道内写入信息,父进程在从管道内读取信息。
这里写图片描述

匿名管道的通信方式:

这里写图片描述

原创粉丝点击