跟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消息队列)相关推荐

  1. System V消息队列

    简介 这篇笔记中介绍了消息队列的基本知识和Posix消息队列.这篇笔记主要学习记录System V消息队列,并对比两个消息队列. System V消息队列是更早的一个消息队列的实现.Posix消息队列 ...

  2. Linux进程通信之System V消息队列

    System V消息队列是Open Group定义的XSI,不属于POSIX标准.System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的 ...

  3. system V消息队列的使用

    最近在学习网络,主要是<UNIX网络编程>这本书,现在给大家分享以下我在学习消息队列这一部分的心得和体会,如果有不足之处希望大家批评指正. 大家知道linux中支持Posix消息队列和Sy ...

  4. linux进程间通信:system V消息队列

    文章目录 基本介绍 编程接口 代码实例 消息队列的发送和接收 消息队列中的消息对象的属性控制 基本介绍 支持不同进程之间以消息(messages)的形式进行数据交换,消息能够拥有自己的标识,且内核使用 ...

  5. System V 消息队列概念以及相关函数(msgget、msgsnd、msgrcv、msgctl)介绍

    System V 消息队列 消息队列是半双工的通信方式 1.1 创建一个消息队列 消息队列的特点:消息只能一条的读取,不能多读取,也不能少读取,每条消息有一个类型,可以按照消息的类型读取 创建或者打开 ...

  6. 细说linux IPC(十):system V 消息队列

    [版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途] system V消息队列和posix消息队列类 ...

  7. 【Linux】system V 消息队列 | system V 信号量(简单赘述)

    文章目录 1 . system V 消息队列(了解) 接口 查看消息队列 2.system V 信号量 (了解) 1.进程互斥等概念的理解 2.认识信号量 3. 接口 这两部分主要是了解即可,为后面学 ...

  8. System V 消息队列

    一.System V 消息队列 有一个队列,队列存放各种消息.每个进程可以把数据封存在消息中,再放入队列.每个进程都可以拿到消息队列,再从中取出/放入消息. 消息队列也有管道一样的不足,就是每个消息的 ...

  9. Linux网络编程之System V消息队列

    System V消息队列函数: #include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h> int ...

最新文章

  1. HashMap 你真的了解吗?
  2. Synchronize对象锁
  3. java io密集型任务_Java线程池讲解——针对IO密集型任务
  4. 【IntelliJ】IntelliJ IDEA常用设置及快捷键以及自定义Live templates
  5. (三)java的数据类型
  6. 一个程序员的一些想法(一)
  7. 阿里云上千规模节点项目提炼精华,全在这里了!
  8. DX10 Shadow Volumn Sample Code的Bug修正
  9. linux vmware 服务,学习笔记:在Linux虚拟机上搭建node服务
  10. Handler sendMessage 与 obtainMessage (sendToTarget)比较
  11. [NOIP2017 TG D2T2]宝藏(模拟退火)
  12. HTML:select、option中设置默认值,且默认值不在下拉框中出现
  13. quartz 配置 数据源
  14. Fluent材料属性之比热容计算方法
  15. 《机器学习》课后习题 3.4 选择两个 UCI 数据集,比较 10 折交叉验证法和留 法所估计出的对率回归的错误率.
  16. 数据库------MYSQL
  17. 2020-12-26[B]比赛总结
  18. C语言编程>第十二周 ③ 已知学生的记录由学号和学习成绩构成,M名学生的数据已存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数。
  19. Access to XMLHttpRequest at ‘XXX‘ from origin ‘XX‘ has been blocked by CORS policy: No ‘Access-Contr
  20. Beta阶段事后诸葛亮分析

热门文章

  1. difftime(转)
  2. Aduna ClusterMap 的说明
  3. 纯真IP数据库的应用!
  4. python简单代码画曲线图教程-Python绘制折线图和散点图的详细方法介绍(代码示例)...
  5. python爬虫入门实例-Python-入门的第一个爬虫例子
  6. python最高版本-Python学习路线图(2020年最新版)
  7. python代码壁纸-爬虫 抓取王者荣耀所有英雄皮肤高清壁纸+超强注释
  8. python下载网页里面所有的图片-Python批量下载网页图片详细教程
  9. 自学python需要多长时间-Python学习步骤如何安排?多长时间可以学会精通呢?
  10. 零基础学编程学java还是python-小白学编程选java、php、前端还是python