进程间通信背景
键盘、显示器等资源是单份的,不同进程要想通信,前提是能看到同一份资源。文件描述符机制允许不同进程控制相同的文件对象,管道也是一种特殊的文件。

两个进程都能控制相同的文件,通过文件描述符进行读写操作。
管道
管道定义
- 管道是 Unix 最古老的通信方式
- 把一个进程连接到另一个进程的数据流叫做管道

匿名管道
建立通信比较困难,因为进程具有独立性。我们需要在一个进程中创建文件,该进程可以对文件读写,如果再来一个进程也可以对该文件读写,就可以通信了。
如何创建另一个进程?使用 fork 系统调用。
此外,管道之所以叫管道,因为它是单向流通的,传送字节流,就像水龙头那般。我们会让一个进程只读取,一个进程只写入。

按照上述文字表述,只要创建文件就可以通信,但是文件是建在硬盘上的,我们在硬盘上读写太慢了,关闭进程时文件也不会删除,所以有管道接口,建立在内存上,关闭进程时自动清理。
接口

该函数会把文件描述符带出来,如果不手动打开任何文件,默认 pipefd[0] 为读端,pipefd[1] 为写端。若已打开其他文件,则文件描述符继续排序。
其中默认 pipefd[0] 用于读文件,pipefd[1] 用于写文件。
实现匿名管道
#include <iostream>
#include <unistd.h>
#include <sys/wait.h>
#include
std;
{
string s = ;
self = ();
buffer[];
number = ;
() {
buffer[] = ;
(buffer, (buffer), , s.(), self, number);
cout << buffer << endl;
number++;
(wrd, buffer, (buffer));
(number > ) ;
();
}
}
{
buffer[] = {};
() {
buffer[] = ;
n = (rrd, buffer, (buffer));
(n > ) {
buffer[n] = ;
cout << << << () << << buffer << endl;
} (n == ) {
cout << << endl;
;
} {
;
}
}
}
{
pipefd[] = {};
n = (pipefd);
(n < ) {
;
}
cout << << pipefd[] << << pipefd[] << endl;
id = fork();
(id < ) {
cout << << endl;
}
(id == ) {
(pipefd[]);
(pipefd[]);
(pipefd[]);
();
}
(pipefd[]);
(pipefd[]);
(pipefd[]);
();
pid = (id, , );
(pid < ) {
cout << << endl;
;
}
;
}





