Linux进程间通讯 – 管道
文章目录
1. 原理
Linux 进程间通讯,也称为IPC(InterProcess Communication)
在 Linux 中每个进程都具备独立的进程地址空间,对每个进程的独立地址空间进行划分,在0G - 3G部分被划分为用户空间,而3G - 4G部分被划分为内核地址空间。注意此0G - 4G 为虚拟地址空间,实际上会通过MMU映射到物理地址空间。
在进行地址映射的时候,每个进程的用户空间在实际物理空间上将被映射到多个地址空间,而多个进程的内核空间将会被被映射到同一块区域,因此多个进程之间具备相同的内核地址空间,通过此共同的内核地址空间实现线程间数据交互即为进程间通讯,也即IPC。

2. 进程间通讯
Linux进程间通讯的方式主要分为以下四大种类型:
- 管道
pipe - 信号
signal - 共享映射区
mmap - 本地套接字
socket
2.1 管道
使用管道实现进程间通讯的优点是:使用简单!
管道分为有名管道 FIFO 和匿名管道 pipe,匿名管道仅能用于具备血缘关系的进程间通讯;而有名管道因其具备了名字可以被找到,因此可用于无血缘关系的进程间通讯。
管道本质是一个伪文件,是由内核管理的一个缓冲区,同时此缓冲区被设计成环形,具备两个端口,一端连接数据的写入,一端连接数据的输出,因此管道仅可用于单向通讯的场合。
当管道中无有效数据时,从管道中读取数据时进入阻塞等待状态,直至有数据从管道的写端写入。
当管道中数据被写满时,再次往管道内写入数据会进入阻塞等待状态,直至有数据从管道的读端被读走。
2.1.1 匿名管道 pipe
创建管道:
#include <unistd.h>
int pipe(int pipefd[2]);
- 传入参数:包含两个文件指针的数组,
pipefd[0]指向管道的读端;pipefd[1]指向管道的写端 - 返回值:0:成功 -1:失败
示例:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
int main(int argc, char **argv)
{
int fd[2] = {
0 };
int ret = 0;
pid_t pid = 0;
char buf[512] = {
0};
ret = pipe(fd);
if (ret < 0) {
perror("create pipe failed");
return -1;
}
pid = fork(

最低0.47元/天 解锁文章
7153

被折叠的 条评论
为什么被折叠?



