【Linux】system V IPC 消息队列和信号量

SystemVIPC提供消息队列和信号量机制用于进程间通信。消息队列允许进程按类型发送和接收二进制数据,通过msgget,msgsnd,msgrcv,msgctl等系统调用管理。信号量则用于实现对公共资源的互斥访问,确保原子性操作,包括semget和semctl等接口。
摘要由CSDN通过智能技术生成

目录

system V IPC 消息队列

消息队列的结构分析​编辑

系统调用接口

msgget创建或者获取一个消息队列

msgsnd发送信息

msgrcv获取信息

msgctl 控制属性

system V IPC 信号量

互斥的四个概念

初识信号量 感性认识

 系统接口


system V IPC 消息队列

消息队列的结构分析

消息队列是在两个进程之间传递二进制块数据的一种简单有效的方式。每个数据块都有一个特定的类型,接收方可以根据类型来有选择地接收数据,而不一定像管道和命名管道那样必须以先进先出的方式接收数据。

系统调用接口

msgget创建或者获取一个消息队列

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

       int msgget(key_t key, int msgflg);

参数key用ftok()函数获取,msgflg使用IPC_CREAT and IPC_EXCL+权限

msgsnd发送信息

  

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

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

【参数说明】

  • msqid为消息队列的描述符
  • msgp为一个结构体的地址,该结构定义的类型为{long type; char mtext[0]},type标识数据类型,后面的为柔性数组,存储要发送的信息的
  • msgsz发送信息的大小
  • msgflg参数控制msgsnd的行为。它通常仅支持IPC_NOWAIT标志,即以非阻塞的方式发送消息。默认情况下,发送消息时如果消息队列满了,则msgsnd将阻塞。若IPCNOWAIT标志被指定,则msgsnd将立即返回并设置errno为EAGAIN。

msgrcv获取信息

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

msgtyp:表示读取数据块的类型

msgctl 控制属性

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

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

简单的用途就是用来释放消息队列IPC_RMID

system V IPC 信号量

互斥的四个概念

公共资源:所有进程之间都能看到。

  1. 互斥:任何一个时刻,都只允许一个执行流在进行共享资源的访问 - 加锁
  2. 我们把任何一个时刻,都只允许一个执行流在进行访问的共享资源,叫做 临界资源
  3. 临界资源是要通过代码访问的,凡是访问临界资源的代码,叫做临界区。
  4. 原子性:要么不做,要么做完,只有两种确定状态的属性

初识信号量 感性认识

类比小故事

 信号量/信号灯的本质就是一个计数器!描述资源数量的计数器。计数器为1则就是互斥功能!

任何一个执行流想要访问一个临界资源的一个子资源的时候,不能直接访问。

 系统接口

semget:创建或者打开一个信号量集

semctl:信号量控制操作

system V IPC 信号量详细介绍见:http://t.csdn.cn/1qv6w

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰深入学习计算机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值