概述:消息队列是进程通信的一种方式。
头文件:
#include<sys/types.h> #include<sys/msg.h>
一、创建或打开一个消息队列
int msgget(key_t key, int msgflg);
参数 key 是一个键,用于生成唯一的标识符。可由 IPC_PRIVATE或 ftok() 生成.
参数 msgflg 是权限位和下面这些位组成:
- IPC_CREAT:如果你要与指定的key对应的消息队列,那么就创建一个新队列。
- IPC_EXCL:同时设置了 IPC_CREAT 并且 key 已经存在,那么调用失败返回EEXIST。
返回值:成功返回消息队列的标识符,它是消息队列的句柄。失败返回-1和设置error。
二、发送消息
int msgsnd(int msgid, const void *msgp, size_t msgsz, int msgflg);
参数msgid是消息队列的标识符。
参数msgp是一个void*类型,可以传入任何结构的指针,msgp指向需要发送的消息的数据结构。这个数据结构定义如下:
struct mymsg { long mtype;//消息类型 char mtext[];//消息内容,长度和结构任意,无需是一个字符数组 }
参数msgsz指定mymsg.mtext部分的字节数。
参数msgflg是一组标记的位掩码,用于控制msgsnd()的操作,目前只定义了一个IPC_NOWAIT,作用是执行非阻塞的发送操作。
返回值:成功返回0,失败返回-1
三、接收消息
ssize_t msgrcv(int msgid, void *msgp, size_t maxmsgsz, long msgtyp, int msgflg);
参数msgid和msgp与前面的意思相同。
参数maxmsgsz表示mymsg.mtext的最大可用空间。
参数msgtyp:读取消息的顺序无需跟发送的顺序一致,可以根据msgtyp的值来选择消息。
- 0:删除消息队列的第一条消息并将其返回给调用进程。
- 大于0:将消息队列第一条mtype等于msgtyp的消息删除并将其返回给调用进程。
- 小于0:将等待消息当成优先队列来处理,队列 mytype 最小并且其值小于或等于 msgtyp 的绝对值的第一条消息会被删除并返回给调用者。
参数msgflg是一个位掩码,它的值通过将下列标记的零个或多个取or来确定。
- IPC_NOWAIT:执行一个非阻塞接收
- MSG_EXCEPT:msgtyp大于0时才起作用,将消息队列中第一条 mtype 不等于 msgtyp 的消息删除并将其返回给调用者
MSG_NOERROR:默认情况 mtext 大小超过了 maxmsgsz ,则会调用失败。指定了该标志则会把 mtext 截断为 maxmsgsz 字节。然后返回给调用者,被截取的数据丢失
返回值:成功返回消息内容的字节数,失败返回-1并设置error
四、控制操作
int msgctl(int msgid, int cmd, struct msqid_ds *buf);
参数cmd指定在消息队列上执行的操作,其取值是下列值的一个:
- IPC_RMID:立即删除消息队列对象及其关联的msqid_ds数据结构。队列中的所有剩余消息都会丢失,所有被阻塞的读者和写者进程会立即醒来。msgsnd()和msgrcv()会失败并返回错误EIDRM。这个操作会忽略传递给msgctl()的第三个参数。
- IPC_STAT:将与这个消息队列关联的msqid_ds数据结构的副本放到buf指向的缓冲区中。
- IPC_SET:用buf指向的缓冲区的值更新与这个消息队列关联的msqid_ds数据结构中被选中的字段。
返回值:成功返回0,失败返回-1并设置error
五、消息队列关联数据结构
struct msqid { struct ipc_perm msg_perm; /* Ownership and permissions */ time_t msg_stime; /* Time of last msgsnd() */ time_t msg_rtime; /* Time of last msgrcv() */ time_t msg_ctime; /* Time of last change */ unsigned long _msg_cbytes; /* Number of bytes in queue */ msgqnum_t msg_qnum; /* Number of messages in queue */ msglen_t msg_qbytes; /* Maximum bytes in queue */ pid_t msg_lspid; /* PID of last msgsnd() */ pid_t msg_lrpid; /* PID of last msgrcv() */ }
标签:返回,IPC,队列,System,int,消息,msg From: https://www.cnblogs.com/ekux127/p/17085789.html