进程通信学习笔记(System V消息队列)
跟Posix消息队列一样,不存在这样的要求:某个进程往一个队列中写入一个消息,另外一个进程下在等待该队列上一个消息的到达
系统中的消息队列,定义在<sys/msg.h>头文件中的信息结构:
struct msqid_ds
{
struct ipc_perm msg_perm;读写权限
struct msg *msg_first;队列中的第一个消息
struct msg *msg_last;队列中的最后一个消息
msglen_t msg_cbytes;队列中的字节数
msgqnum_t msg_qnum;队列中的消息数
msglen_t msg_qbytes;队列上的允许的最大字节数
pid_t msg_lspid;前一个用msgsnd()的进程id
pid_t msg_lrpid;前一个用msgrcv()的进程id
time_t msg_stime;前一个用msgsnd()的时间
time_t msg_rtime;前一个用msgrcv()的时间
time_t msg_ctime;前一个msgctl()的时间
};
1、msgget函数
用于创建一个新的消息队列或访问一个已存在的消息队列
#include <sys/msg.h>
int msgget(key_t key, int oflag);
成功返回非负标识符,失败返回-1
返回值是一个整数标识符,key可以是ftok的返回值 ,也可以是常值IPC_PRIVATE,oflag可以有MSG_R(0400),MSG_W(0200),MSG_R>>3(0040),MSG_W>>3(0020),MSG_R>>6(0004),MSG_W(0002),也可以与IPC_CREAT和IPC_EXCL按位或
MSG_R:用户(属主)读
MSG_W:用户(属主)写
MSG_R>>3:由(属)组成员读
MSG_W>>3:由(属)组成员写
MSG_R>>6:由其他用户读
MSG_W>>6:由其他用户写
当创建一个新的消息队列时,msqid_ds结构的如下成员被初始化:
(1)msg_perm结构的uid和cuid成员被设置成当前进程的有效用户ID,gid和cgid成员被设置成当前进程的有效组ID
(2)oflags中的读写权限位存放在msg_perm.mode中
(3)msg_qnum,msg_lspid,msg_lrpid,msg_stime,msg_rtime被置为0
(4)msg_ctime被设置成当前时间
(5)msg_qbytes被设置成系统限制值
2、msgsnd函数
往队列中放入一个消息
#include <sys/msg.h>
int msgsnd(int msqid, const void *ptr, size_t length, int flag);
成功返回0,失败返回-1
ptr是一个结构指针,该结构有如下模板,定义在<sys/msg.h>中
struct msgbuf
{
long mbyte; 消息类型
char mtext[1]; 消息数据
};
消息类型要大于0
flag参数可以是0,也可以是IPC_NOWAIT。IPC_NOWAIT标志使得msgsnd调用非阻塞,如果没有存放消息的可有空间,函数立即返回。发生情况包括:
(1)在队列中已有太多的字节 msqid_ds结构中的msg_qbytes
(2)在系统范围存在太多的消息
如果这两个条件中有一个存在,而且IPC_NOWAIT标志已指定,msgsnd返回一个EAGAIN错误
3、msgrcv函数
从队列中读出一个消息
#include <sys/msg.h>
ssize_t msgrcv(int msqid, void *ptr, size_t length, long byte, int flag);
成功返回读入缓冲区数据的字节数,失败返回-1
type指定希望从给定的队列中读出什么样的消息
(1)type == 0,返回该队列中的第一个消息
(2)type > 0,返回类型值为type的第一个消息
(3)type < 0,返回类型值<=type参数的绝对值的消息中类型值最小的第一个消息
flag指定所请求的消息不在队列时的处理。在没有消息可得的情况下,如果设置了IPC_NOWAIT位,立即返回一个ENOMSG错误,否则阻塞到下列某个事件发生为止
(1)有一个所请求类型的消息可获取
(2)由msqid标识的消息队列被从系统中删除
(3)调用线程被某个捕获的信号所中断
flag参数中另有一位可以指定MSG_NOERROR,当所接收消息的真正数据部分大于length参数时,如果设置了该位,msgrcv函数只是截短数据部分,而不返回错误,否则,返回一个E2BIG错误
4、msgctrl函数
在消息队列上的控制操作
#include <sys/msg.h>
int msgctl(int msqid, int cmd, struct msqid_ds *buff);
成功返回0,失败返回-1
有三个命令:
(1)IPC_RMID:从系统中删除msqid指定的消息队列。当前在该队列上的任何消息都被丢弃
(2)IPC_SET:给队列设置其中的msqid_ds结构的四个成员:msg_perm.uid, msg_perm.gid, msg_perm.mode和msg_qbytes
(3)IPC_STAT:给调用者返回指定队列的当前msqid_ds结构
进程通信学习笔记(System V消息队列)相关推荐
- System V消息队列
简介 这篇笔记中介绍了消息队列的基本知识和Posix消息队列.这篇笔记主要学习记录System V消息队列,并对比两个消息队列. System V消息队列是更早的一个消息队列的实现.Posix消息队列 ...
- Linux进程通信之System V消息队列
System V消息队列是Open Group定义的XSI,不属于POSIX标准.System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的 ...
- system V消息队列的使用
最近在学习网络,主要是<UNIX网络编程>这本书,现在给大家分享以下我在学习消息队列这一部分的心得和体会,如果有不足之处希望大家批评指正. 大家知道linux中支持Posix消息队列和Sy ...
- linux进程间通信:system V消息队列
文章目录 基本介绍 编程接口 代码实例 消息队列的发送和接收 消息队列中的消息对象的属性控制 基本介绍 支持不同进程之间以消息(messages)的形式进行数据交换,消息能够拥有自己的标识,且内核使用 ...
- System V 消息队列概念以及相关函数(msgget、msgsnd、msgrcv、msgctl)介绍
System V 消息队列 消息队列是半双工的通信方式 1.1 创建一个消息队列 消息队列的特点:消息只能一条的读取,不能多读取,也不能少读取,每条消息有一个类型,可以按照消息的类型读取 创建或者打开 ...
- 细说linux IPC(十):system V 消息队列
[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途] system V消息队列和posix消息队列类 ...
- 【Linux】system V 消息队列 | system V 信号量(简单赘述)
文章目录 1 . system V 消息队列(了解) 接口 查看消息队列 2.system V 信号量 (了解) 1.进程互斥等概念的理解 2.认识信号量 3. 接口 这两部分主要是了解即可,为后面学 ...
- System V 消息队列
一.System V 消息队列 有一个队列,队列存放各种消息.每个进程可以把数据封存在消息中,再放入队列.每个进程都可以拿到消息队列,再从中取出/放入消息. 消息队列也有管道一样的不足,就是每个消息的 ...
- Linux网络编程之System V消息队列
System V消息队列函数: #include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h> int ...
最新文章
- HashMap 你真的了解吗?
- Synchronize对象锁
- java io密集型任务_Java线程池讲解——针对IO密集型任务
- 【IntelliJ】IntelliJ IDEA常用设置及快捷键以及自定义Live templates
- (三)java的数据类型
- 一个程序员的一些想法(一)
- 阿里云上千规模节点项目提炼精华,全在这里了!
- DX10 Shadow Volumn Sample Code的Bug修正
- linux vmware 服务,学习笔记:在Linux虚拟机上搭建node服务
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- [NOIP2017 TG D2T2]宝藏(模拟退火)
- HTML:select、option中设置默认值,且默认值不在下拉框中出现
- quartz 配置 数据源
- Fluent材料属性之比热容计算方法
- 《机器学习》课后习题 3.4 选择两个 UCI 数据集,比较 10 折交叉验证法和留 法所估计出的对率回归的错误率.
- 数据库------MYSQL
- 2020-12-26[B]比赛总结
- C语言编程>第十二周 ③ 已知学生的记录由学号和学习成绩构成,M名学生的数据已存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数。
- Access to XMLHttpRequest at ‘XXX‘ from origin ‘XX‘ has been blocked by CORS policy: No ‘Access-Contr
- Beta阶段事后诸葛亮分析
热门文章
- difftime(转)
- Aduna ClusterMap 的说明
- 纯真IP数据库的应用!
- python简单代码画曲线图教程-Python绘制折线图和散点图的详细方法介绍(代码示例)...
- python爬虫入门实例-Python-入门的第一个爬虫例子
- python最高版本-Python学习路线图(2020年最新版)
- python代码壁纸-爬虫 抓取王者荣耀所有英雄皮肤高清壁纸+超强注释
- python下载网页里面所有的图片-Python批量下载网页图片详细教程
- 自学python需要多长时间-Python学习步骤如何安排?多长时间可以学会精通呢?
- 零基础学编程学java还是python-小白学编程选java、php、前端还是python