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

Linux进程通信之System V消息队列SystemV消息队列是OpenGroup定义的XSI,不属于POSIX标准

System V消息队列是Open Group定义的XSI,不属于POSIX标准。System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的系统内核中,后来商用UNIX系统基本都加入了System V IPC的功能。

System V消息队列相对于POSIX消息队列的区别主要是:

  • POSIX消息队列的读操作总是返回消息队列中优先级最高的最早消息,而对于System V消息队列可以返回任意指定优先级(通过消息类型)的消息。
  • 当向一个空消息队列中写入一个消息时,POSIX消息队列允许产生一个信号或启动一个线程,System V消息队列不提供类似的机制。

系统内核都会为每一个System V消息队列维护一个信息结构,在Linux 2.6.18中的定义如下:

<bits/msq.h>

struct msqid_ds
{
  struct ipc_perm msg_perm;        /*IPC对象的属性信息和访问权限 */
  __time_t msg_stime;              /* time of last msgsnd command */
  __time_t msg_rtime;              /* time of last msgrcv command */
  __time_t msg_ctime;              /* time of last change */
  unsigned long int __msg_cbytes;  /* 当前队列中消息的字节数 */
  msgqnum_t msg_qnum;              /* 当前队列中消息的个数 */
  msglen_t msg_qbytes;             /* 队列允许存放的最大字节数 */
  __pid_t msg_lspid;               /* pid of last msgsnd() */
  __pid_t msg_lrpid;               /* pid of last msgrcv() */

//下面是保留字段
#if __WORDSIZE == 32
  unsigned long int __unused1;
  unsigned long int __unused2;
  unsigned long int __unused3;
#endif
  unsigned long int __unused4;
  unsigned long int __unused5;
};

消息队列的结构可能的设计如下:

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

1 System V消息队列的创建和打开

System V消息队列的创建和使用会使用下面的函数接口:

#include <sys/msg.h>
int msgget(key_t key, int oflg);
                //成功返回非负消息队列描述符,失败返回-1

key:消息队列的键,用来创建一个消息队列。System IPC都有一个key,作为IPC的外部标识符,创建成功后返回的描述符作为IPC的内部标识符使用。key的主要目的就是使不同进程在同一IPC汇合。key具体说可以有三种方式生成:

  • 不同的进程约定好的一个值;
  • 通过相同的路径名和项目ID,调用ftok()函数,生成一个键;
  • 还可以设置为IPC_PRIVATE,这样就会创建一个新的,唯一的IPC对象;然后将返回的描述符通过某种方式传递给其他进程;

oflg:指定创建或打开消息队列的标志和读写权限(ipc_perm中的mode成员)。我们知道System V IPC定义了自己的操作标志和权限设置标志,而且都是通过该参数传递,这和open函数存在差别,open

今天的文章Linux进程通信之System V消息队列分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/85966.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注