一文学会Linux IPC通信

news2025/1/11 23:38:25

目录

概览

单工、半双工、双工

各种IPC通信方式优缺点

1. 管道

2. 消息队列

3. 共享内存

4. 信号量

5. 信号

6. Socket套接字

精筛优秀博客


原本想详细写下,后发现有很多人总结过,那我就直接战在巨人的肩膀上不再重复造轮子了。

概览

单工、半双工、双工

  • 单工:单向通信
  • 半双工:双向通信,但不能同时双向
  • 全双工:双向通信,可同时双向

各种IPC通信方式优缺点

1. 管道

分为匿名管道和命名管道,都是半双工。

匿名管道只能亲缘关系的进程间使用(父子进程)。

#include <unistd.h>
int pipe(int fd[2]);    // 返回值:若成功返回0,失败返回-1

命名管道(又叫FIFO)本质是文件,可以非亲缘关系的进程间使用。

#include <sys/stat.h>
// 返回值:成功返回0,出错返回-1
int mkfifo(const char *pathname, mode_t mode);

不管是匿名管道还是命名管道,都是:先进先出,效率低,不适合频繁交换数据。 

2. 消息队列

#include <sys/msg.h>
// 创建或打开消息队列:成功返回队列ID,失败返回-1
int msgget(key_t key, int flag);
// send:成功返回0,失败返回-1
int msgsnd(int msqid, const void *ptr, size_t size, int flag);
// receive:成功返回消息数据的长度,失败返回-1
int msgrcv(int msqid, void *ptr, size_t size, long type,int flag);
// control:成功返回0,失败返回-1
int msgctl(int msqid, int cmd, struct msqid_ds *buf);

不一定要先进先出,可以用type控制。消息队列里有消息体,消息体被读取后删除,但消息队列生命周期跟随内核,进程销毁仍存在。

效率较高

不适合比较大的数据,在 Linux 内核中,会有两个宏定义 MSGMAX 和 MSGMNB,它们以字节为单位,分别定义了一条消息的最大长度和一个队列的最大长度。

存在用户态与内核态间数据拷贝开销

3. 共享内存

#include <sys/shm.h>
// 创建或获取一个共享内存:成功返回共享内存ID,失败返回-1
int shmget(key_t key, size_t size, int flag);
// 连接共享内存到当前进程的地址空间:成功返回指向共享内存的指针,失败返回-1
void *shmat(int shm_id, const void *addr, int flag);
// 断开与共享内存的连接:成功返回0,失败返回-1
int shmdt(void *addr); 
// 控制共享内存的相关信息:成功返回0,失败返回-1
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);

两个进程虚拟地址映射到相同的物理地址。

效率最高,无用户态与内核态间数据拷贝开销

但无同步机制

4. 信号量

#include <sys/sem.h>
// 创建或获取一个信号量组:若成功返回信号量集ID,失败返回-1
int semget(key_t key, int num_sems, int sem_flags);
// 对信号量组进行操作,改变信号量的值:成功返回0,失败返回-1
int semop(int semid, struct sembuf semoparray[], size_t numops);  
// 控制信号量的相关信息
int semctl(int semid, int sem_num, int cmd, ...);

信号量其实是一个整型的计数器,主要用于实现进程间的互斥与同步,而不是用于缓存进程间通信的数据。若要进程间传递数据要配合共享内存

信号量初始化为1。P(通过)操作-1,V(释放)操作+1,信号量>=0进程才可继续执行。信号量<0进程阻塞等待其他进程把信号量恢复。

具体的过程如下:

  • 进程 A 在访问共享内存前,先执行了 P 操作,由于信号量的初始值为 1,故在进程 A 执行 P 操作后信号量变为 0,表示共享资源可用,于是进程 A 就可以访问共享内存。
  • 若此时,进程 B 也想访问共享内存,执行了 P 操作,结果信号量变为了 -1,这就意味着临界资源已被占用,因此进程 B 被阻塞。
  • 直到进程 A 访问完共享内存,才会执行 V 操作,使得信号量恢复为 0,接着就会唤醒阻塞中的线程 B,使得进程 B 可以访问共享内存,最后完成共享内存的访问后,执行 V 操作,使信号量恢复到初始值 1。

5. 信号

信号是进程间通信机制中唯一的异步通信机制。对于异常情况下的工作模式,就需要用「信号」的方式来通知进程。

在 Linux 操作系统中, 为了响应各种各样的事件,提供了几十种信号,分别代表不同的意义。我们可以通过 kill -l 命令,查看所有的信号:

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

6. Socket套接字

可以跨网络与不同主机的进程间通信,也可以同主机通信。本地字节流 socket 和 本地数据报 socket 在 bind 的时候,不像 TCP 和 UDP 要绑定 IP 地址和端口,而是绑定一个本地文件,这也就是它们之间的最大区别。

根据创建 socket 类型的不同,通信的方式也就不同:

  • 实现 TCP 字节流通信: socket 类型是 AF_INET 和 SOCK_STREAM;
  • 实现 UDP 数据报通信:socket 类型是 AF_INET 和 SOCK_DGRAM;
  • 实现本地进程间通信: 「本地字节流 socket 」类型是 AF_LOCAL 和 SOCK_STREAM,「本地数据报 socket 」类型是 AF_LOCAL 和 SOCK_DGRAM。另外,AF_UNIX 和 AF_LOCAL 是等价的,所以 AF_UNIX 也属于本地 socket;

各种通信方式的比较和优缺点

  1. 管道:速度慢,容量有限,只有父子进程能通讯

  2. FIFO:任何进程间都能通讯,但速度慢

  3. 消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题

  4. 信号量:不能传递复杂消息,只能用来同步

  5. 共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存

如想看具体实现看下面链接。

精筛优秀博客

进程间通信——几种方式的比较和详细实例_worthsen的博客-CSDN博客_进程间的通信方式三种

5.2 进程间有哪些通信方式? | 小林coding (xiaolincoding.com)

Linux c/c++之IPC进程间通信_石小浪♪的博客-CSDN博客_ipc_set

Linux进程间通信的几种方式总结--linux内核剖析(七)-阿里云开发者社区 (aliyun.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PowerCLi 创建esxi登陆用户

官网PowerCLI参数配置参考 New-VMHostAccount 创建用户参考New-VIRole 创建权限组参考Get-VIPrivilege 查询所有角色层配置信息

由浅入深读透vue源码:diff算法

导语 | 开发者工作中&#xff0c;研究代码逻辑常需要思考这个问题&#xff1a;数组变更后&#xff0c;具体变更了哪一些元素&#xff1f;变更的位置如何&#xff1f;本文作者陈碧松解析并覆写了针对数组变化的diff算法逻辑。希望本文对你有帮助。diff方法的运行规则和前提方法为…

干货 | 医疗健康类APP违法违规个人信息收集的自动化检测技术研究

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。第一部分&#xff1a;概述一、研究背景APP兴起在带给人们便利的同时&#xff0c;也在逐渐蚕食着人们的隐私边界。与此同时&#xff0c;“互联网医疗”使得医疗健康类APP兴起。二、研究目的本文旨…

Altium Designer 20 凡亿教育视频学习-05

第五部分学习 线距选择 焊盘与线之间的距离设置为为6mil 其他距离设置&#xff1a;如线与线之间的距离 Track--线的意思 copper--铜 via--过孔 SMD Pad--贴片焊盘 线宽选择 电源线需要加粗处理 操作1&#xff1a;专门为电源线制订规则 能专门为电源线制订宽度规则&…

基于STM32楼梯层控制系统

1、项目需求分析 项目目标意义&#xff1a; 随着社会的发展、 科技的进步以及人们生活水平的逐步提高&#xff0c; 各种方便于生活的遥控系统开始进入了人们的生活。 电梯的发展是由于需要从山坡上运输包括煤和材在内的原材料而引发的&#xff0c;而到了今日&#xff0c;电梯的…

JavaScript 注释

文章目录JavaScript 注释JavaScript 注释JavaScript 多行注释使用注释来阻止执行在行末使用注释JavaScript 注释 JavaScript 注释可用于提高代码的可读性。 JavaScript 注释 JavaScript 不会执行注释。 我们可以添加注释来对 JavaScript 进行解释&#xff0c;或者提高代码的可…

ArcGIS基础实验操作100例--实验59二维面转体模型

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验59 二维面转体模型 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&am…

PyTorch简易安装方法(100%成功)

PyTorch简易安装方法&#xff08;100%成功&#xff09; 一般我们习惯用pip install xxx&#xff0c;同时使用清华源用来加速&#xff0c;这种方法安装99%的库都没啥大问题&#xff0c;但是有时候安装pytorch的时候就会发现问题。笔者反正每次用该方法安装torch总会遇到刚开始下…

活动星投票争做新时代好少年网络评选

“争做新时代好少年”网络评选投票_图文投票的便利_免费小程序广泛应用手机互联网给所有人都带来不同程度的便利&#xff0c;而微信已经成为国民的系统级别的应用。现在很多人都会在微信群或朋友圈里转发投票&#xff0c;对于运营及推广来说找一个合适的投票小程序能够提高工作…

【模拟CMOS集成电路】电路噪声——基本电路噪声性能(2)

【笔记&#xff1a;模拟CMOS集成电路】电路噪声——基本电路噪声性能&#xff08;2&#xff09;前言1 噪声——分析基础2 噪声——基本电路噪声性能2.1 MOS管噪声模型(1)电阻RG热噪声和沟道热噪声(2)衬底电阻热噪声(3)源极寄生电阻RS热噪声2.2常见组态的单级放大器噪声分析2.2.…

C++11基于范围的for循环vector容器扩容详解迭代器失效

目录 C11基于范围for循环 vector容器扩容详解 迭代器失效 总结 C11基于范围for循环 对于一个有范围的集合来说&#xff0c;在程序代码中指定循环的范围有时候是多余的&#xff0c;还可能犯错误。 为此C11中引入了基于范围的for循环。 语法&#xff1a; 语法&#xff1a;…

一加11:新的赛场,“不温和”的答卷

《不要温和地走进那个良夜》是英国诗人狄兰托马斯创作于20世纪中期的一首享誉世界的诗歌&#xff0c;作者所表达出的在逆境中坚韧不屈、逆流而上的精神&#xff0c;激励了一代又一代人。1月4日&#xff0c;一加11发布会现场&#xff0c;一加中国区总裁李杰Louis借鉴了狄兰托马斯…

联合证券|近90亿大资金“跑步入场”,光伏板块掀涨停潮

早盘光伏板块掀起涨停潮&#xff0c;原因或是这些。 国产特斯拉全线降价 1月6日&#xff0c;据特斯拉我国官网&#xff0c;特斯拉国产车型大幅降价&#xff0c;对国产Model 3后驱版、高性能版&#xff0c;及Model Y后驱版、长续航版、高性能版等五款车型进行调价。Model 3起价…

DFMN 代码解读

目录 0. 环境配置 1. 运行程序 2. 读代码的思路 1&#xff09;model.py !! 关于继承 !! 关于网络结构组织 !! 关于 forward 2) 数据预处理 3&#xff09;train.py 0. 环境配置 很简单&#xff0c;提示缺包xxx&#xff0c;pip install xxx 就可以了 1. 运行程序 从…

NuxtJS服务器端入门

一、搜索引擎优化 1、什么是SEO 总结&#xff1a;seo是网站为了提高自已的网站排名&#xff0c;获得更多的流量&#xff0c;对网站的结构及内容进行调整和优化&#xff0c;以便搜索引擎 &#xff08;百度&#xff0c;google等&#xff09;更好抓取到优质网站的内容&#xff0c…

GCN图神经网络和LSTM的介绍和使用场景 中英文

GCN-LSTM 可以学习参考 英文内容部分源自youtube的教学视频 自己跟着英文敲的 给定一辆出租车行驶时在某个时间段的速度&#xff0c;下一个时刻速度会是多少&#xff1f;这是一个时间序列回归预测问题。获得了若干时间点的速度&#xff0c;目标是预测出租车速度序列中的下一个…

线性模型:AR、MA、ARMA、ARMAX、ARX、ARARMAX、OE、BJ等

目录 1 AR 1 2 MA 1 3 ARMA 1 4 ARMAX 2 5 ARX 2 6 ARARX 3 7 ARARMAX 3 8 OE 3 9 BJ 3 各种线性模型&#xff0c;这些模型算数学基础模型&#xff0c;不仅在计量经济学&#xff0c;也在工业控制等各领域有应用。包括AR、MA、ARMA、ARMAX、ARX、ARARMAX、OE、BJ等。 1 AR 自…

【疑难攻关】——floor报错注入

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座右…

mysql多表查询30个经典案例

mysql多表查询30个经典案例插入两张表一个dept一个emp插入dept表数据插入emp表数据1.列出每个部门里面有那些员工及部门名称;2.运维部门的收入总和&#xff1b;3.HR部入职员工的员工号4.财务部门收入超过5000元的员工姓名5.找出销售部收入最低的员工的入职时间&#xff1b;6.找…

5G NR标准: 第20章 5G的演进

第20章 5G的演进 NR 的第一个版本&#xff0c;第 15 版&#xff0c;侧重于对 eMBB 的基本支持&#xff0c;在某种程度上&#xff0c;URLLC.1 如前几章所述&#xff0c;第 15 版是为即将发布的 NR 未来发展构建的基础 . NR 演进将带来额外的功能并进一步提升性能。 附加功能不…