linux进程间通信的方式

发布时间:2024年01月12日

引用:GitHub - jiong1998/Linux-.github.io: Linux系统编程【文件IO、进程、进程间通信、信号、多线程、互斥】:个人源码+个人笔记

在进程间完成数据传递需要借助操作系统提供特殊的方法,现今常用的进程间通信方式有:

管道: PIPE、FIFO?(使用最简单)

? ? ? ? pipe(匿名管道)

? ? ? ? fifo(命名管道)

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

管道的特点

- 管道的本质是一块内核缓冲区 ,**数据只要读就没了。**(防止管道满)

- 由两个**文件描述符引用**,一个表示读端,一个表示写端。

- 规定数据从管道的写端流入管道,从读端流出。

- 当两个进程都终止的时候,管道也自动消失。

- <font color='red'> 管道的读端和写端默认都是**阻塞**的</font>

注意:父进程创建管道,子进程会继承。

**原理:**

- 管道内部使用**环形队列**实现。

- 默认缓冲区大小为4K,可以使用ulimit -a命令获取大小。

- 实际操作过程中缓冲区会根据数据压力做适当调整。

**局限性**:

- 数据一旦被读走,便不在管道中存在,**不可反复读取**。

- **数据只能在一个方向上流动**,若要实现双向流动,必须使用两个管道

- 只能在**有血缘关系的进程间**使用管道。

为什么管道只能在有血缘关系的进程间使用:

&emsp;&emsp;管道的两端是通过文件描述符表示的,如果是两个毫不相关的进程,在一个进程内创建了管道,没办法让另一个进程获得该管道的文件描述符。但是在父子进程中就可以。

信号?(开销最小)

共享映射区 (无血缘关系)

本地套接字 (最稳定)

文章来源:https://blog.csdn.net/Tomas__chao/article/details/135556246
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。