<返回更多

多进程编程 - 消息队列

2020-08-20    
加入收藏

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

linux消息队列的API都定义在sys/msg.h头文件中,包括4个系统调用:msgget、msgsnd、msgrcv、msgctl

msgget系统调用

msgget系统调用创建一个消息队列,或者获取一个已有的消息队列。定义如下:

#include <sys/msg.h>
int msgget(key_t key, int msgflg);

和semegt系统调用一下,key参数是一个键值,用来标识一个全局唯一的消息队列。

msgflg参数使用的含义与semget系统调用的sem_flags参数相同。

多进程编程 - 信号量

msgget成功时返回一个正整数值,它是消息队列u的标识符。msgget失败时返回-1,并设置errno。

如果msgget用于创建消息队列,则与之关联的内核数据结构msqid_ds将被创建并初始化,msqid_ds结构体的定义如下:

sturct msqid_ds
{
    struct ipc_perm msg_perm;   /*消息队列的操作权限*/
    time_t msg_stime;           /*最后一次调用msgsnd时间*/
    time_t msg_rtime;           /*最后一次调用msgrcv时间*/
    time_t msg_ctime;           /*最后一次被修改的时间*/
    unsigned long __msg_cbytes; /*消息队列中已有的字节数*/
    msgqnum_t msg_qnum;         /*消息队列中已有的消息数*/
    msglen_t msg_qbytes;        /*消息队列允许的最大字节数*/
    pid_t msg_lspid;            /*最后执行msgsnd的进程的PID*/
    pid_t msg_lrpid;            /*最后执行msgrcv的进程的PID*/
};

msgsnd系统调用

msgsnd系统调用把一条消息添加到消息队列中。定义如下:

#include <sys/msg.h>
int msgsnd(int msqid, const void* msg_ptr, size_t msg_sz, int msgflg);

msqid参数是由msgget调用返回的消息队列标识符

msg_ptr参数指向一个准备发送的消息,消息必须被定义为如下类型:

struct msgbuf
{
    long mtype; //消息类型
    char mtext[512]; //消息数据
};

其中:

msg_sz参数是消息的数据部分(mtext)的长度。这个长度可以为0,表示没有数据。

msgflg参数空值msgsnd的行为,它通常仅支持IPC_NOWAIT标志,即非阻塞的方式发送消息。默认情况下,发送消息时如果消息队列满了,则msgsnd将阻塞。

若IPC_NOWAIT标志被指定,则msgsnd将立即返回并设置errno为EAGAIN。

处于阻塞状态的msgsnd调用可能被如下两种异常情况所中断:

msgsnd成功时返回0,失败则返回-1,并设置errno。msgsnd成功时将修改内核数据结构msqid_ds的部分字段,如下所示:

msgrcv系统调用

msgrcv系统调用从消息队列中获取消息,定义如下:

#include <sys/msg.h>
int msgrcv(int msqid, void* msg_ptr, size_t msg_sz,long int msgtype, int msgflg);

msqid参数是由msgget调用返回的消息队列标识符

msg_ptr参数用于存储接受的消息,msg_sz参数指定的是消息数据部分的长度

msgtype参数指定接受何种类型的消息。有如下几种方式来指定消息类型:

参数msg空值msgrcv函数的行为。它可以是如下一些标志的按位或:

处于阻塞状态的msgrcv调用还可能被如下两种异常情况所中断:

msgrcv成功时返回0,失败则返回-1,并设置errno。msgrcv成功时将修改内核数据结构msqid_ds的部分字段,如下所示:

msgctl系统调用

msgctl系统调用控制消息队列的某些属性,定义如下:

#include <sys/msg.h>
int msgctl(int msqid, int command, struct msqid_ds * buf);

msqid参数是由msgget调用返回的共享内存标识符。command参数指定要执行的命令。msgctl支持的所有命令如下表:

多进程编程 - 消息队列

 

msgctl成功时的返回值取决于command参数,如上表所示。msgctl函数失败时返回-1并设置errno。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>