Linux进阶-进程间通信(ipc)

news/2024/3/29 16:56:22/文章来源:https://blog.csdn.net/weixin_47077788/article/details/128100959

进程间通信:数据传输、资源共享、事件通知、进程控制。

Linux系统下的ipc

早期unix系统 ipc:管道(数据传输)、信号(事件通知)、fifo(数据传输)。

system-v ipc(贝尔实验室):system-v 消息队列(数据传输、进程控制)、system-v 信号量(资源共享、进程控制)、system-v 共享内存(数据传输效率较高)

socket ipc(BSD)

posix ipc(IEEE):posix 消息队列(数据传输、进程控制)、posix 信号量(资源共享、进程控制)、posix 共享内存(数据传输)

有名管道:用于无父子关系的进程间通信。无父子关系的进程可将信息发送到某个有名管道中,并通过管道名读取消息

无名管道:用于具有父子关系的进程间通信。

信号:用于通知其他进程有何事件发送。此外,进程可以向自身发送信号,还可以获得Linux内核发出的信号。

消息队列:克服了信号的数据结构过于简单的问题,同时也解决了管道数据流无格式和缓冲区长度受限等问题。规定了每个进程的权限,避免了仿冒信息的出现。

信号量:用于解决进程的同步和相关资源抢占而设计的。

共享内存:让多个进程访问同一个内存空间,适合于数据量极大和数据结构极为复杂的进程间通信。但这种方式牺牲了系统的安全性,所有通常与其他进程间通信形式混合使用,并避免以根用户权限执行。

套接字:Linux下的程序能快速移植到其它类UNIX平台上。

无名管道pipe函数

//所需头文件
#include <unistd.h>//函数原型
int pipe(int pipefd[2]);    //pipefd[0]读数据,pipefd[1]写数据//返回值
成功:0
失败:-1

是一个没有名字的特殊文件,无法使用open函数,但可以使用close函数。只能通过子进程继承文件描述符的形式来使用。读操作时管道如果为空,会阻塞进程,直到有数据写入管道。写操作时管道如果满了,会阻塞进程,直到管道读取数据。当数据被读取后,这些数据将自动被管道清除。所有文件描述符被关闭之后,无名管道被销毁。

 有名管道mkfifo函数

//所需头文件
#include <sys/types.h>
#include <sys/state.h>//函数原型
int mkfifo(const char *filename,mode_t mode);    //文件名,权限//返回值
成功:0
失败:-1

有文件名,可以使用open函数打开,任意进程间数据传输。读操作时管道如果为空,会阻塞进程,直到有数据写入管道。写操作时管道如果满了,会阻塞进程,直到管道读取数据。当数据被读取后,这些数据将自动被管道清除。wtite具有“原子性”。

 

信号:软件模拟中断,进程接受信号后做出相应响应

显示信号类型:kill -l

pkill 进程名:杀死进程

硬件产生信号:执行非法指令、访问非法内存、驱动程序等

软件产生信号:控制台(Ctrl+C中断信号、Ctrl+L退出信号、Ctrl+Z停止信号)、kill命令、程序调用kill()函数

信号的处理方式:
忽略:进程当信号从来没有发生过
捕获:进程会调用相应的处理函数,进行相应的处理
默认:使用系统默认处理方式来处理信号
常见信号名信号编号产生原因默认处理方式
SIGHUP1关闭终端终止
SIGINT2Ctrl+C终止
SIGQUIT3Ctrl+\终止+转储
SIGABRT6abort()终止+转储
SIGPE8算术错误终止
SIGKILL9kill -9 pid终止,不可捕获/忽略
SIGUSR110自定义/忽略
SIGSEGV11段错误终止+转储
SIGUSR212自定义/忽略
SIGALRM14alarm()终止
SIGTERM15kill pid终止
SIGCHLD17(子)状态变化/忽略
SIGTOP19Ctrl+Z暂停,不可捕获/忽略

signal函数

//所需头文件
#include <signal.h>//函数原型
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum,sighandler_t handler);    //要设置的信号,SIG_IGN、SIG_DFL、void (*sighandler_t)(int)//返回值
成功:上一次设置的handler
失败:SIG_ERR

kill函数

//所需头文件
#include <sys/types.h>
#include <signal.h>//函数原型
int kill(pid_t pid,int sig);    //PID,信号类型//返回值
成功:0
失败:1

raise函数

//所需头文件
#include <signal.h>//函数原型
int raise(int sig);    //返回值
成功:0
失败:1

信号集处理函数:屏蔽信号集、非处理信号集

屏蔽信号集:手动/自动屏蔽某些信号

非处理信号集:信号如果被屏蔽,则记录在未处理未处理信号集。非实时信号(1~31),不排队,只留一个;实时信号(34~64),排队,保留全部。

信号集相关API描述参数
int sigempty(sigset_t *set)将信号集初始化为0
int sigfillset(sigset_t *set)将信号集初始化为1
int sigaddset(sigset_t *set,int signum)将信号集某一位设置为1
int sigdelset(sigset_t *set,int signum)将信号集某一位设置为0
int sigprocmask(int how,const sigset_t *set,sigset_t *oldset)使用设置好的信号集去修改信号屏蔽集

how:SIG_BLOCK-屏蔽某个信号(屏蔽集|set)、SIG_UNBLOCK-打开某个信号(屏蔽集&~set)、SIG~SETMASK-屏蔽集=set

oldset:保存旧的屏蔽集的值,NULL表示不保存

system-v 消息队列

system-v ipc特点:独立于进程、没有文件名和文件描述符、IPC对象具有Key和ID。

消息队列用法:
定义一个唯一的键值Key(ftok)
构造消息队列(msgget)
发送特定类型消息(msgsnd)
接收特定类型消息(msgrcv)
删除消息队列(msgctl)

ftok函数:可生成唯一的键值Key

//函数原型
key_t ftok(const char *path,int proj_id);//返回值
成功:合法键值
失败:-1

msgget函数:获取消息队列ID

//函数原型
int msgget(key_t key,int msgflg);    //键值,IPC_CREAT(消息队列不存在则创建)|权限//返回值
成功:消息队列ID
失败:-1

msgsnd函数:发送消息到消息队列

//函数原型
int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg);    
msqid:消息队列ID
msgp:消息缓存区struct msgbuf{long mtype;    //消息标识char mtext[1]; //消息内容}
msgsz:消息正文的字节数
msgflag:IPC_NOWAIT-非阻塞发送、0-阻塞发送//返回值
成功:0
失败:-1

msgrcv函数:在消息队列中读取

//函数原型
ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,int msgflg);    
msqid:消息队列ID
msgp:消息缓存区
msgsz:消息正文的字节数
msgtyp:要接收消息的标识
msgflag:IPC_NOWAIT-非阻塞读取、MSG_NOERROR-截断消息、0-阻塞读取//返回值
成功:0
失败:-1

msgctl函数:设置或获取消息队列的相关属性

//函数原型
ssize_t msgctl(int msqid,int cmd,struct msqid_ds *buf);    
msqid:消息队列ID
cmd:IPC_STAT-获取消息队列的属性信息、IPC_SET-设置消息队列的属性、IPC_RMID-删除消息队列
buf:相关结构体缓冲区//返回值
成功:0
失败:-1

 

system-v 信号量

system-v 共享内存

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes之Pod初始化容器

Kubernetes之Pod初始化容器 概述 ​ 初始化是很多编程语言普遍关注的问题&#xff0c;甚至有些编程语言直接支持模式构造来生成初始化程序&#xff0c;这些用于进行初始化的程序结构称为初始化器或初始化列表。初始化代码要首先运行&#xff0c;且只能运行一次&#xff0c;它们…

CAPM资产定价模型

本文是Quantitative Methods and Analysis: Pairs Trading此书的读书笔记。 CAPM(Capital Asset Pricing Model)资产定价模型 这个模型在金融界的影响就是beta这个词的使用。CAPM模型用两个部分的回报之和来解释一个资产的回报。其中一个部分是指市场&#xff08;称为market)…

时间序列:时间序列模型---自回归过程(AutoRegressive Process)

本文是Quantitative Methods and Analysis: Pairs Trading此书的读书笔记。 这次我们构造一个由无限的白噪声实现&#xff08;white noise realization) 组成的时间序列&#xff0c;即。这个由无限数目的项组成的值却是一个有限的值&#xff0c;比如时刻的值为&#xff0c; 而…

Magic Leap 2设计和开发幕后花絮

Magic Leap今年发布新款AR头显Magic Leap 2&#xff0c;相比于上一代Magic Leap 1&#xff0c;新品更专注于B端场景&#xff0c;自公布以来&#xff0c;Magic Leap不仅对公司策略、理念更加透明&#xff0c;也不断公开ML2产品设计背后的思考。相比于ML1&#xff0c;ML2的设计有…

粒子群算法查找函数最小值

实现 函数 F01、F06 的优化测试 以下内容是现有算法的运行结果、调参分析、及代码实现&#xff0c;用于给其他人提供参考&#xff0c;懒得改了hh 1. 运行结果 参数 w 0.5 &#xff08;可更改&#xff09; c1 2.0 &#xff08;可更改&#xff09; c2 2.0 &#xff08;可更改&…

Echart 柱状图,X轴斜着展示

option { color: [‘#3398DB’], tooltip: { trigger: ‘axis’, axisPointer: { // 坐标轴指示器&#xff0c;坐标轴触发有效 type: ‘shadow’ // 默认为直线&#xff0c;可选为&#xff1a;‘line’ | ‘shadow’ } }, grid: { left: ‘3%’, right: ‘4%’, bottom: ‘3%’…

iPhone升级iOS 16后出现提示“面容ID不可用”怎么办?

最近&#xff0c;很多用户在苹果社区反馈&#xff0c;iPhone升级iOS 16后Face ID不能用了&#xff0c;尝试重置Face ID时&#xff0c;系统会弹窗提示“面容ID不可用&#xff0c;稍后尝试设置面容ID。” 如果你的iPhone在没有摔落手机或是手机进水的情况下出现这个弹窗&#xff…

【uniapp小程序】路由跳转navigator传参封装

文章目录&#x1f34d;前言&#x1f34b;正文1、看官网1.1 navigator API 介绍1.2、路由跳转参数传递1.3、五种常见的跳转方式1.3.1 uni.navigateTo(OBJECT)1.3.2 uni.redirectTo(OBJECT)1.3.3 uni.reLaunch(OBJECT)1.3.4 uni.switchTab(OBJECT)1.3.5 uni.navigateBack(OBJECT)…

图的初识·基本概念

文章目录基本概念图有两种基本形式无向图的表示有向图的表示基本概念 图结构也是数据结构的一部分。而且还有一点小难。图是由多个结点链接而成的&#xff0c;但是一个结点可以同时连接多个其他结点&#xff0c;多个节点也可以同时指向一个节点。【多对多的关系】 图结构是任意…

如何从报表控件FastReport .NET中连接到 PostgreSQL 数据库?

FastReport.NET官方版下载 Fastreport是目前世界上主流的图表控件&#xff0c;具有超高性价比&#xff0c;以更具成本优势的价格&#xff0c;便能提供功能齐全的报表解决方案&#xff0c;连续三年蝉联全球文档创建组件和库的“ Top 50 Publishers”奖。 慧都科技是Fast Repor…

mysql索引类别和失效场景

首先&#xff0c;我们为什么要使用索引&#xff0c;索引有什么作用呢&#xff1f; 索引可以用来快速查询数据表中有某一特定值的记录&#xff0c;大大加快数据的查询速度&#xff1b;在列上创建了索引之后&#xff0c;查找数据时可以直接根据该列上的索引找到对应记录行的位置…

YOLO X 改进详解

YOLO X 主要改进&#xff1a; Anchor-Free: FCOSDecoupled detection headAdvanced label assigning strategy Network structure improvement Decoupled detection head 对比于YOLO V5, YOLO X 在detection head上有了改进。YOLO V5中&#xff0c;检测头是通过卷积同时预…

视频编解码 - RTP 与 RTCP

目录 RTP 实时传输协议 RTCP协议 将H264 RTP打包 RTP 实时传输协议 音视频数据传输&#xff0c;先将原始数据经过编码压缩后&#xff0c;将码流打包成一个个RTP包&#xff0c;再将码流传输到接收端。 打包的作用 接收端要正确地使用这些音视频编码数据&#xff0c;不仅仅需…

JaVers:自动化数据审计

在开发应用程序时&#xff0c;我们经常需要存储有关数据如何随时间变化的信息。此信息可用于更轻松地调试应用程序并满足设计要求。在本文中&#xff0c;我们将讨论 JaVers 工具&#xff0c;该工具允许您通过记录数据库实体状态的更改来自动执行此过程。 Javers如何工作&#x…

vue Router

Vue项目各文件含义 1.src文件夹 是我们真正敲代码的文件夹&#xff0c; 2.assets放静态资源 3.components放组件 4.App.vue主组件 5.main.js项目的入口文件 Vue Router 在router/index.js路由文件中配置路由&#xff0c;设置路由跳转规则 import Vue from vue import Vu…

android Framework 中用到了哪些跨进程通信方式?

文章目录Linux 有哪些跨进程的通信方式&#xff1f;管道本地 Socket共享内存信号Linux 有哪些跨进程的通信方式&#xff1f; Binder 机制是Android基于Linux的一种独特的IPC机制。我们常用的AMS&#xff0c;PMS 等都是通过Binder机制来完成跨进程通信的&#xff0c;那么除了Bin…

【并发】深入理解Java线程的底层原理

线程基础知识 线程与进程 进程 操作系统会以进程为单位&#xff0c;分配系统资源&#xff08;CPU时间片、内存等资源&#xff09;&#xff0c;进程是资源分配的最小单位。 当一个程序被运行&#xff0c;从磁盘加载这个程序的代码至内存&#xff0c;这时就开启了一个进程。 线…

使用 Mason 创建自己的 Flutter brick

使用 Mason 创建自己的 Flutter brick 原文 https://medium.com/gytworkz/create-your-own-flutter-brick-using-mason-7abc70d0324e 前言 谁不喜欢用最少的努力完成大部分事情呢&#xff1f;我当然知道! &#xff01;Mason 帮我完成了几个简单的步骤。 在本文中&#xff0c;我…

Redis——》数据类型:List(列表)

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Redis——》数据类型&#xff1a;List&#xff08;列表&#xff09;一、简介…

复现黑客在后门中藏匿后门

PHP实现在后门中藏匿后门 在攻击渗透的时候会传入shell后门方便进行远控。其中的后门包括多种类型&#xff0c;大马是功能最全的直接提供了可视化的界面方便攻击者进行提权、扫描、上传等一系列的操作。 但有很多hacker不讲武德&#xff0c;在写好的大马中藏入自己的后门&…