Linux 操作系统IPC

目录

1、IPC简介

1.1、共享内存

1.1.1 创建/访问共享内存

1.1.2  映射

1.1.3 解除映射

1.1.4  删除/修改共享内存

1.2 信号量集

1.2.1 创建信号量集合

1.2.2 信号量的初始化

1.2.3  信号量的还原和消耗

1.3 消息队列

1.3.1 概念

1.3.3 添加消息队列

1.3.4 读取消息


1、IPC简介

IPC全称:Inter-Process Communication

功能:进程间通信多运用于多进程之间其中包括:共享内存,信号量集,消息队列;

查看系统的IPC的指令:

ipcs

分开查看:

        共享内存         Shared   memory   ipcs -m         函数 shm 开头的
        信号量集         Semaphore set      ipcs -s           函数 sem 开头的
        消息队列         Message Queue    pcs -q           函数 msg 开头的

删除:

        删除共享内存         ipcrm -m         共享内存的 id
        删除信号量集         ipcrm -s          信号量集的 id
        删除消息队列         ipcrm -q          消息队列的 id

获得键值:
        存在的意义:保证多个进程访问的共享内存是同一个;或者多个进程访问的信号集是同一个,再或者多个进程访问的消息队列是同一个;

头文件:

# include <sys/types.h>
# include <sys/ipc.h>

函数原型:

key_t ftok(const char *pathname, int proj_id);

参数:
        pathname:任何的存在的路劲/文件夹名;"/home/xxx"

        proj_id:任意一个0-255之间的数值;

返回值:当成功执行的时候,一个key_t值将会被返回,否则 -1被返回

1.1、共享内存

1.1.1 创建/访问共享内存

作用:用来获得共享内存区域的ID,如果不存在指定的共享区域就创建相应的区域

头文件:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

函数原型:

int shmget(key_t key, size_t size, int shmflg);

参数:

        key:键值,用ftok()获得;//任意进程均可使用

        size:共享内存的大小

        shmflg:IPC_CREAT|0600

                IPC_CREAT:如果内有就创建,有就直接获取

返回值:成功返回内存段标识符,失败:-1

1.1.2  映射

作用:把共享内存区域映射到调用进程的地址空间中去

头文件:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

函数原型:

void *shmat(int shmid, const void *shmaddr, int shmflg);

参数:

        shmid:要映射的共享内存区域标识符

        shmaddr:将共享内存映射到指定位置,一般填NULL

        shmflg:默认 0,共享内存可读写

返回值:
        成功:被映射的段地址,失败:返回NULL

1.1.3 解除映射

作用:解除调用用来解除进程对共享区域的映射

头文件:

 #include <sys/types.h>#include <sys/shm.h>

函数原型:

int shmdt(const void *shmaddr);

参数:被映射的共享内存段地址

返回值:成功返回0;失败返回-1

1.1.4  删除/修改共享内存

头文件:

#include <sys/ipc.h>
#include <sys/shm.h>

函数原型:

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

参数:

        shmid:shmget的返回值

        cmd:选择的操作

                IPC_STAT:获取共享内存属性

                IPC_SET:修改共享内存

                IPC_RMID:删除共享内存,此时第三个参数为NULL

返回值:
        成功0,失败-1

补充:
        memcpy-- 内存复制

函数原型:

void *memcpy(void *destin, void *source, unsigned n);

参数:

destin: 指向用于存储复制内容的目标数组, 类型强制转换为 void* 指针。
source-- 指向要复制的数据源, 类型强制转换为 void* 指针。 n-- 要被复制的字节数。
返回值: 该函数返回一个指向目标存储区 destin 的指针。


1.2 信号量集

1.2.1 创建信号量集合

作用:创建一个信号量集或访问一个已存在的信号量集

头文件:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

   函数原型:

int semget(key_t key, int nsems, int semflg);

   参数:

        key:键值

        nsems:信号量集合中创建几组信号量,通常取值为1;

        semflg:IPC_CREAT 表示若信号量已存在, 返回该信号量标识符; 不存在, 创建; IPC_CREAT|0600

        返回值: 如果成功, 则返回信号量集的 IPC 标识符。 如果失败, 则返回-1


1.2.2 信号量的初始化

头文件:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

函数原型:

int semctl(int semid, int semnum, int cmd, ...);

参数:

        semid:是由semget返回的信号量标识符

        sumnum:你要操作的信号量集合中信号量的下标,第一组的下标是0;

        cmd:

                删除:IPC_RMID( 立即删除信号集, 唤醒所有被阻塞的进程)
                设置: SETVAL( 根据 semnum 指定的编号设定相应信号的值, 此时需要填充第四个参数(用联合体中 val 成员的值设置信号量集合中单个信号量的值))
                获取: GETVAL( 根据 semnum 指定的编号返回相应信号的值, 此时该函数返回值就是你要获得的信号量的值, 不再是 0 或-1)

如果有第四个参数类型
union semun {
        short val; /*SETVAL 用的值*/
        struct semid_ds* buf; /*IPC_STAT、 IPC_SET 用的 semid_ds 结构(则是一个内核结构体)*/
        nsigned short* array; /*SETALL、 GETALL 用的数组值*/
        struct seminfo *buf; /*为控制 IPC_INFO 提供的缓存(表示信号量系统资源配置信息)*/
} arg;
返回值
        成功: 返回相应的值, 失败: 返回-1

举例:

key = ftok();
semid = semget(key,1,IPC_CREAT|0600);
union semun text;
text.val = 1;//二值信号量
semctl(semid,0,SETVAL,text);

1.2.3  信号量的还原和消耗

        用于改变信号量对像中各个信号量的状态

函数原型:

int semop(int semid, struct sembuf *sops, unsigned nsops);

参数: semid: semget 返回值
                sops: 对信号量的操作
                struct sembuf{
                        unsigned short sem_num; //信号量的下标 0
                        short sem_op; //操作类型 +1 -1
                        sem_op > 0 信号加上 sem_op 的值, 表示进程释放控制的资源;
                        sem_op < 0 信号减去 sem_op 的值。
                        short sem_flg; //操作标志 0 设置信号量的默认操作
                        }
        nsops: 进行操作信号量的个数, 即 sops 结构变量的个数, 需大于或等于 1。 最常见设置此值
等于 1, 只完成对一个信号量的操作
返回值: 成功时, 返回 0; 失败时, 返回-1

1.3 消息队列

1.3.1 概念

        消息队列就是一个消息的链表,可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向其中按照一定的规则添加新信息,对消息队列有读权限的进程则可以从消息队列中读走消息。和队列的特点一样,遵从先进先出的原则。

1.3.2 创建新的消息队列获取已存在的消息队列

头文件:

#include <sys / types.h>
#include <sys / ipc.h>
#include <sys / msg.h>

函数原型:

int msgget(key_t key, int msgflg);

参数:key由ftok生成。

        msgflg:IPC_CREAT|0600

IPC_CREAT 值, 若没有该队列, 则创建一个并返回新标识符; 若已存在, 则返回原标识
符。
返回值:

成功执行:返回消息队列标识符。失败返回-1.

1.3.3 添加消息队列

作用:把消息添加到已打开的消息队列末尾(尾差法)。

函数原型:

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

参数:

        msgid:值明消息队列的ID,通常是msgget 函数成功的返回值

        msgp:发送数据缓冲区首地址,指向消息结构的指针。

该消息结构 msgbuf 为:
struct msgbuf{
        long mtype;//消息类型
        char mtext[1];//消息正文:可以是数值/数组/结构体
}

消息必须是一个结构体, 并且结构体的第一个成员必须是消息类型(long);

msgsz: 数据大小, 注意, 改大小仅仅是数据大小, 需要用结构体整体大小减去消息类型
的大小, 每个消息体最大不要超过 4K;

sizeof(struct msgbuf) - sizeof(long);

        msgflg: 一般赋 0, 阻塞方式
        IPC_NOWAIT : 非阻塞
返回值: 成功则返回 0, 出错则返回-1

1.3.4 读取消息

        作用:把消息从消息队列中取走,与FIFO不同的是,这里可以指定取走某种类型的消息(在该类型的消息中,依旧是FIFO)

函数原型:

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

参数:

msqid : 消息队列的队列 ID

msgp: 消息缓冲区 -- 提供空间 -- 结构体类型
msgsz: 消息的字节数 -- sizeof(结构体)-sizeof(long);
msgtyp: 消息类型
        =0 忽略类型
        >0 只接收指定类型的数据
        <0 只接受小于等于其绝对值的数据

msgflg: 0: msgsnd 调用阻塞直到条件满足为止
IPC_NOWAIT 不阻塞
返回值: 接收成功返回 0, 失败返回-1
1.3.5 控制消息队列

函数原型:

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

参数:

        msqid: 消息队列的队列 ID
        cmd:

                IPC_STAT: 读取消息队列的属性 msqid_ds, 并将其存储在 buf 指定的地址中
                IPC_SET: 设置消息队列的属性 msqid_ds 中的 ipc_perm 元素的值。 这个值取自 buf 参数。
                IPC_RMID: 从系统内核中移走消息队列, 此时最后一个写 NULL
                Buf: 消息队列缓冲区

返回值:接收成功返回0,失败返回-1.

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

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

相关文章

社区养老服务|基于Springboot+vue的社区养老服务平台设计与实现(源码+数据库+文档)

社区养老服务平台 目录 基于Java的社区养老服务平台设计与实现 一、前言 二、系统设计 三、系统功能设计 1用户信息管理 2 服务信息管理 3服务申请管理 4公告信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#…

【Linux系统化学习】网络套接字(编写简单的UDP服务端和客户端)

目录 理解源IP地址和目的IP地址 认识端口号 端口号和进程ID的区别 源端口号和目的端口号 认识TCP和UDP协议 TCP协议 UDP协议 网络字节序 socket编程接口 socket常见API sockaddr结构 简单的UDP网络程序 UDP服务端 创建套接字 填充本地网络信息 绑定 收取消息 …

Amine-PEG-Amine,956496-54-1在生物成像、生物传感器等领域具有广泛的应用

【试剂详情】 英文名称 Amine-PEG-Amine&#xff0c;NH2-PEG-NH2 中文名称 氨基-聚乙二醇-氨基&#xff0c;氨基PEG氨基&#xff0c; 双端氨基聚乙二醇 CAS号 956496-54-1 外观性状 由分子量决定&#xff0c;液体或者固体 分子量 0.4k&#xff0c;0.6k&#xff0c;1k&…

千古一帝秦始皇的一生

在中国历史上&#xff0c;秦始皇绝对是最有资格被称之为‘千古一帝’的皇帝。 这不光是因为&#xff0c;他是中国的第一个皇帝&#xff0c;更是因为他奠定了中国两千多年的政治格局&#xff0c;让中国从此有了大一统的意识。 1、赵国生涯 公元前259年&#xff0c;秦始皇嬴政…

利用PS中Lab颜色模式进行简单调色?

【原图】 详细步骤如下&#xff1a; Step 1 : 打开PS&#xff0c;打开素材&#xff0c;点菜单栏&#xff0c;【图像】-【模式】-【Lab颜色】&#xff0c;效果如下图 Step2&#xff1a;ctrl(或command)m打开曲线工具&#xff0c;选择a通道&#xff0c;效果如下图。 Step3: 把标…

SpringBoot---------Swagger

第一步&#xff1a;引入依赖 <!-- swagger--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId></dependency> 第二步&#xff1a;配置文件 import com.sky.intercept…

【刷题】代码随想录算法训练营第二十九天|491、递增子序列,46、全排列,47、全排列II

目录 491、递增子序列46、全排列47、全排列II 491、递增子序列 讲解&#xff1a;https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html class Solution { private:vector<vector<int>> result;vector<int> path;void backt…

pandas读取文件导致jupyter内核崩溃如何解决

读取execl文件出现以下问题: str_name "D:\\cao_use\\2017_2021(new).xlsx" train_df pd.read_excel(str_name, usecols[0])崩溃的指示图如下所示: bug原因:读入的文件太大&#xff0c;所需时间过长&#xff0c;在读取的过程中&#xff0c;使用中断按钮暂停会直…

OpenAI神秘模型,再次被Sam Altman提及

5月6日&#xff0c;OpenAI首席执行官Sam Altman在社交平台分享了一条推文“我是一个优秀的GPT-2聊天机器人”。 而在4月30日&#xff0c;Altman就提起过该模型非常喜欢GPT-2。按道理说一个只有15亿参数在2019年发布的开源模型&#xff0c;被反复提及两次就很不寻常。 更意外的…

volatile原理

文章目录 如何保证可见性如何保证有序性double-checked locking 问题double-checked locking 解决 volatile 的底层实现原理是内存屏障&#xff0c;Memory Barrier&#xff08;Memory Fence&#xff09; 对 volatile 变量的写指令后会加入写屏障对 volatile 变量的读指令前会加…

正则表达式_字符匹配/可选字符集

正则表达式&#xff08;Regular Expression&#xff09;也叫匹配模式(Pattern)&#xff0c;用来检验字符串是否满足特 定规则&#xff0c;或从字符串中捕获满足特定规则的子串。 字符匹配 最简单的正则表达式由“普通字符”和“通配符”组成。比如“Room\d\d\d”就这样 的正则…

短网址短链接哪个好用?2024年最好的缩短链接短网址推荐

短网址&#xff0c;又称短链接&#xff0c;英文名为Short URL&#xff0c;是一种形式上比较短的网址&#xff0c;使用跳转到方式代替长网址链接&#xff0c;形式美观&#xff0c;而且更容易分享。最出名的短网址服务有国外的bit.ly和谷歌goo.gl&#xff0c;以及国内的百度短网址…

AI+客服行业落地应用

一、客服行业变迁 1.传统客服时代 &#xff08;1&#xff09;客服工作重复性高&#xff0c;技术含量低 &#xff08;2&#xff09;呼出效率低&#xff0c;客服水平参差不齐 &#xff08;3&#xff09;管理难度高&#xff0c;情绪不稳定 &#xff08;4&#xff09;服务质量…

《视觉十四讲》例程运行记录(1)—— 课本源码下载和3rdparty文件夹是空的解决办法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、第二版十四讲课本源码下载1. 安装git工具 二、Pangolin下载和安装1. 源码下载2. Pangolin的安装(1) 安装依赖项(2) 源码编译安装(2) 测试是否安装成功 二、…

4:分配器测试

文章目录 分配器作用容器中默认的分配器分配器测试程序这节课并没有总结各种分配器的使用结果 分配器作用 负责分配和管理容器的空间的 不需要用户手动创建 容器中默认的分配器 第二个参数表示默认的分配器 每一个容器初始化的时候 带一个默认的分配器 分配器测试程序 右边的…

商城数据库88张表结构完整示意图61~70(十四)

六十一&#xff1a; 六十二&#xff1a; 六十三&#xff1a; 六十四&#xff1a; 六十五&#xff1a; 六十六&#xff1a; 六十七&#xff1a; 六十八&#xff1a; 六十九&#xff1a; 七十&#xff1a;

深度学习之基于YOLOv5的山羊行为识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习之基于YOLOv5的山羊行为识别系统是一个创新的项目&#xff0c;旨在通过深度学习和目标检测技术&#xff0c…

【数据结构(邓俊辉)学习笔记】列表04——排序器

文章目录 0. 统一入口1. 选择排序1.1 构思1.2 实例1.3 实现1.4 复杂度 2. 插入排序2.1 构思2.2 实例2.3 实现2.4 复杂度分析2.5 性能分析 3. 归并排序3.1 二路归并算法3.1.1 二路归并算法原理3.1.2 二路归并算法实现3.1.3 归并时间 3.2 分治策略3.2.1 实现3.2.2 排序时间 4. 总…

【Java】基本程序设计结构(二)

前言&#xff1a;上一篇我们详细介绍了Java基本程序设计结构中前半部分&#xff0c;一个简单的Java应用&#xff0c;注释&#xff0c;数据类型&#xff0c;变量与常量&#xff0c;运算符&#xff0c;字符串。包括本篇将延续上篇内容介绍后续内容&#xff0c;包括输入输出&#…