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