具体详见:
msgget(2) - Linux manual page
1、函数原型
int msgget(key_t key, int msgflg); /创建或打开消息队列
参数:
key:和消息队列关联的key值
msgflg:是一个权限标志,表示消息队列的访问权限,它与文件的访问权限一样。msgflg可以与IPC_CREAT做或操作,表示当key所命名的消息队列不存在时创建一个消息队列,如果key所命名的消息队列存在时,IPC_CREAT标志会被忽略,而只返回一个标识符。
返回值:成功返回队列ID,失败则返回‐1,
2、头文件
#include <sys / types.h>
#include <sys / ipc.h>
#include <sys / msg.h>
3、示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/msg.h>
#include <errno.h>
struct msg_st
{
long int msg_type;
char text[BUFSIZ];
};
int main(int argc, char **argv)
{
int msgid = -1;
struct msg_st data;
long int msgtype = 0; // 注意1
// 建立消息队列
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
if (msgid == -1)
{
fprintf(stderr, "msgget failed width error: %d\n", errno);
exit(EXIT_FAILURE);
}
// 从队列中获取消息,直到遇到end消息为止
while (1)
{
if (msgrcv(msgid, (void *)&data, BUFSIZ, msgtype, 0) == -1)
{
fprintf(stderr, "msgrcv failed width erro: %d", errno);
}
printf("You wrote: %s\n", data.text);
// 遇到end结束
if (strncmp(data.text, "end", 3) == 0)
{
break;
}
}
// 删除消息队列
if (msgctl(msgid, IPC_RMID, 0) == -1)
{
fprintf(stderr, "msgctl(IPC_RMID) failed\n");
}
exit(EXIT_SUCCESS);
}