Domin1c0's Blog

A technical blog sharing my journey in programming, development, and open source.

View on GitHub
22 July 2025

Ipc

by

IPC 进程间通信

interprocess communication

1. pipe 管道

示例图

管道的特质

管道是一种最基本的IPC机制,也称匿名管道,应用于有血缘关系的进程之间,完成数据传递。
调用 pipe 函数即可创建一个管道

管道的原理

管道的局限性

创建管道

函数作用:创建一个管道
函数原型:

父子进程间通信

先使用 pipe 创建管道,再进行 fork 操作,根据情况关闭 读端–fd[0] 或写端–fd[1]

设置管道为非阻塞

int flag = fcntl(fd[0], F_GETFL);      //获取当前文件状态标志
flag |= O_NONBLOCK;                    //添加非阻塞标志
fcntl(fd[0], F_SETFL, flag);           //设置新的标志

2. fifo 管道

fifo 介绍

fifo 通常被称为命名管道,以区分管道(pipe)
通过 fifo 不相关的进程也能交换数据

fifo 创建管道

方式 1 - 使用命令 mkfifo

方式 2 - 使用函数

思路

3. 共享映射区

存储映射I/O 使一个磁盘文件与存储空间中的一个缓冲区相映射,从缓冲区中取数据,就相当于读文件中的相应字节;将数据写入缓冲区,则会将数据写入文件。这样就可以在不使用 read 和 write 函数的情况下,使用地址(指针)完成I/O操作

mmap 函数

函数作用:建立存储映射区

函数原型:

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
参数:

munmap 函数

函数作用:

函数原型:

返回值:

函数参数:

匿名映射

mmap(NULL, 4096 ,PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0)

tags: 进程 - 进程间通信