标签:
我会用几篇博客总结一下在Linux中进程之间通信的几种方法,我会把这个开头的摘要部分在这个系列的每篇博客中都打出来
进程之间通信的方式
在以一切皆文件为原则的Linux系统中,管道也是一种文件(特殊文件),可以使用mkfifo命令创建一个管道文件
在管道文件的前面有一个p来标识管道文件
这次主要说的是通过管道完成进程之间的通信,通过管道通信有两种方式。
一种是匿名管道,一种是命名管道
先来看一段代码
1 #define MAXLINE 80
2 int main()
3 {
4 int n;
5 int fd[2];
6 pid_t pid;
7 char line[MAXLINE];
8 if (pipe(fd) < 0)
9 perror("pipe");
10 if ((pid = fork()) < 0)
11 perror("fork");
12 if (pid > 0)
13 {
14 //father
15 close(fd[0]);
16 }
17 else
18 {
19 close(fd[1]);
20 n = read(fd[0], line, MAXLINE);
21 write(stdout, line, n);//写到标准输出上看一下效果
22 }
23 return 0;
24
25 }
这个程序就是一个简单的父子进程之间通过管道进行通信的一个例子,具体的工作过程我用画图的方式展现出来
注意这一个步骤是十分重要的,如果不关闭相应的端口,就无法正确操作管道。
匿名管道主要利用了,创建子进程的时候会把父进程的文件描述符表拷贝一份这个特征,通过这个特征,父子进程就看到了一个公共的资源—管道,并同时拥有对该管道腹泻的权利,那么一方读,一方写,就可以完成进程之间的通信了。
所谓的匿名管道就是说,没有名字。。。你根本不知道这个管道文件存放在哪,也不知道这个管道文件的文件名,唯一跟这个跟管道文件有联系的只有父子进程中的文件描述符。那么根据匿名管道的实现机制,很容易就能看出他的优缺点。
上述就是匿名管道的使用和实现机制,可以看出必须有“亲缘关系”的进程之间才可以使用匿名管道来完成进程间通信。父子进程当然可以,“孙子”进程也是可以的~
那么为了解决只有有亲缘关系的进程才能使用这种方式进行通信的弊端,就有了命名管道的通信方式
简单的来说,我们刚才使用的匿名管道是因为不知道文件名和存放路径,所以只能通过继承文件描述符表来获得跟匿名管道建立联系的方式,如果我们知道路径和管道文件名呢?那不就可以完成非亲缘关系的进程间通信了么
标签:
原文地址:http://www.cnblogs.com/lenomirei/p/5636339.html