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.hqwc.cn/news/669711.html

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

相关文章

五一反向旅游,景区“AI+视频监控”将持续助力旅游业发展

一、建设背景 每年五一劳动节出去旅游都是人挤人状态&#xff0c;这导致景区的体验感极差。今年“五一反向旅游”的话题冲上了热搜&#xff0c;好多人选择了五一之后再出去旅游&#xff0c;避开拥挤的人群&#xff0c;这个时候景区的监管力度和感知能力就更要跟上去&#xff0…

SQL 基础 | AVG 函数的用法

在SQL中&#xff0c;AVG()是一个聚合函数&#xff0c;用来计算某个列中所有值的平均值。 它通常与GROUP BY子句一起使用&#xff0c;以便对分组后的数据进行平均值计算。 AVG()函数在需要了解数据集中某个数值列的中心趋势时非常有用。 以下是AVG()函数的一些常见用法&#xff…

萤瓴优选:一键带货,轻松赚取佣金!短视频素材软件助你快速上手!

在如今的电商时代&#xff0c;137短视频带货9766成为了一种3209越来越流行的购物方式。想要通过短视频带货赚取佣金&#xff0c;但又苦恼于找不到合适的素材和发布平台&#xff1f;别担心&#xff0c;现在有一款专业的软件可以解决这个问题&#xff01;&#xff08;上面数字可联…

学习记录:AUTOSAR R20-11的阅读记录(五)【CP(5.11-5.19)】完

接上回&#xff1a;学习记录&#xff1a;AUTOSAR R20-11的阅读记录&#xff08;四&#xff09;【CP&#xff08;5.6-5.10&#xff09;】 五、CP 11、General&#xff08;4个&#xff09; 5.11 File Name 说明 1 AUTOSAR_EXP_ LayeredSoftwareArchitecture.pdf 描述了AUTO…

艾体宝方案 | 加密USB金融解决方案

在现代金融行业中&#xff0c;保护敏感数据和合规性已成为至关重要的任务。为了帮助金融公司应对移动性风险和合规挑战&#xff0c;我们提供了一种高效的加密USB解决方案。 一、为什么金融公司需要加密USB解决方案 1、降低移动性风险 金融服务公司正在迅速过渡到一种模式&a…

银价下跌怎么办?现货白银买卖分析方法要掌握

现货白银买卖分析是进行现货白银投资的基础&#xff0c;尤其是近几个交易日现货白银价格出现了下跌后&#xff0c;更加凸显了买卖分析能力在市场中的重要性。不光要会买&#xff0c;还得懂得如何卖。下面我们来介绍2个现货白银买卖分析的方法。 基于RSI指标的现货白银买卖分析。…

目标检测——铁路轨道故障数据集

一、重要性及意义 安全性保障&#xff1a;铁路作为重要的交通工具&#xff0c;其安全性能直接关系到乘客和货物的安全。铁路轨道故障&#xff0c;如裂缝、变形、错位、缺失紧固件等&#xff0c;都可能引发列车脱轨、倾覆等严重事故。因此&#xff0c;及时发现和修复这些故障&a…

[Kubernetes] 安装KubeSphere

选择4核8G&#xff08;master&#xff09;、8核16G&#xff08;node1&#xff09;、8核16G&#xff08;node2&#xff09; 三台机器&#xff0c;按量付费进行实验&#xff0c;CentOS7.9安装Docker安装Kubernetes安装KubeSphere前置环境: nfs和监控安装KubeSphere masternode1no…

连锁店收银系统为什么贵

连锁店收银系统会比单机收银系统价格高一些&#xff0c;主要有三个方面的原因&#xff1a; 复杂的功能需求 连锁店收银系统需要管理多个分店的进销存、库存调拨、门店订货等操作&#xff0c;以及会员管理&#xff0c;商淘云连锁收银系统还提供了连锁线上商城等功能。这些功能的…

TCP粘包拆包问题解决之道

文章目录 1. TCP粘包/拆包问题2. TCP粘包/拆包发生的原因3. TCP粘包解决策略 1. TCP粘包/拆包问题 假设客户端分别发送了两个数据包D1和D2&#xff0c;由于服务端一次读取到的字节数是不确定的&#xff0c;故存在以下四种情况。 服务端分两次读取到了两个独立的数据包&#xf…

金三银四面试题(二十五):策略模式知多少?

什么是策略模式 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;旨在定义一系列算法&#xff0c;将每个算法封装到一个独立的类中&#xff0c;使它们可以互换。策略模式让算法的变化独立于使用它们的客户端&#xff0c;使得客户端可以根据…

【ACM出版】第四届控制与智能机器人国际学术会议(ICCIR 2024)

第四届控制与智能机器人国际学术会议&#xff08;ICCIR 2024&#xff09; 2024 4th International Conference on Control and Intelligent Robotics 2024年6月21日-23日 | 中国-广州 官网&#xff1a;www.ic-cir.org EI、Scopus双检索 投稿免费参会、口头汇报及海报展示 四…