进程通信介绍
进程通信是指进程之间形成数据共享、交互、控制等。由于进程是独立的,需要操作系统作为第三方提供接口来完成通信,并制定规则保证数据安全。目前进程间通信主要有三个规则体系:
- 管道
- System V 进程间通信
- POSIX 进程间通信
匿名管道
介绍
将一个进程连接到另一个进程的数据流称为管道。匿名管道对具有'亲缘关系'(如父子进程、父孙进程)的进程之间实现通信,它不依赖文件名或路径,而是操作内存文件,仅依赖文件描述符直接通信。
通过 pipe() 形成的管道本身是一个临时缓冲区,配合重定向将一个进程输出弄到管道,再从管道的读端获取数据。
特点理解
- 亲缘关系:调用
fork()出来的进程具有亲缘关系,完全单独的两个进程无法执行匿名管道。 - 内存文件:不是访问磁盘文件,不需要路径、文件名等信息,只需要文件描述符直接访问内存文件。
- 单向性:
pipefd[0]固定为读端,用于read();pipefd[1]固定为写端,用于write()。 - 生命周期:只要进程关闭,对应文件生命周期结束。
- 字节流传输:读和写按照单个字节为标准,无消息边界,但顺序保证。
管道情况
- 读写正常,但文件缓冲区为空,导致读端阻塞。
- 读写正常,管道被写满,写端阻塞。
- 读写正常,写端关闭,读端读取 0,表明读到文件末尾,不会被阻塞。
匿名管道运用
打开读写端
int pipe(int pipefd[2]);
参数:一个包含两个整数的数组,用于存储管道的读端和写端文件描述符。 返回值:成功时返回 0,失败时返回 -1。
完整代码
#include <iostream>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <cstring>
std;
{
buff[MAX] = {};
() {
pid = (pipefd, buff, );
(pid == ) {
;
}
cout << buff << endl;
();
}
;
}
{
num = ;
* ptr = ;
() {
pid = (pipefd, ptr, (ptr));
(pid == ) {
;
}
cout << << num++ << endl;
();
}
;
}
{
pipefd[] = {};
pf = (pipefd);
(pf == ) {
();
;
}
d = fork();
(d == ) {
(pipefd[]);
(pipefd[]);
();
} {
(pipefd[]);
(pipefd[]);
pid = (, , );
(pid <= ) {
();
;
} {
cout << << endl;
}
}
;
}


