1.msgget函数
使用msgget函数创建一个新的或打开一个已经存在的消息队列。不同的进程调用此函数,只要用相同的 key 值就能得到同一个消息队列的标识符。
函数原型
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
参数: key: ftok() 返回的 key 值 msgflg: 标识函数的行为及消息队列的权限,其取值如下: - IPC_CREAT:创建消息队列。 - IPC_EXCL: 检测消息队列是否存在。 - 位或权限位:消息队列位或权限位后可以设置消息队列的访问权限,格式和open() 函数的 mode_t 一样(open() 的使用请点此链接),但可执行权限未使用。
返回值: 成功:消息队列的标识符 失败:-1
2.实例
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
int main(int argc, char *argv[])
{
key_t key;
int msgqid;
key = ftok(".", 2021); // key 值
if (key == -1)
{
perror("error to ftok:");
exit(1);
}
// 创建消息队列
msgqid = msgget(key, IPC_CREAT | 0666);
if (msgqid == -1)
{
perror("error to create message queue:");
exit(1);
}
printf("key=%#x\n",key);
printf("msgqid=%d\n",msgqid);
system("ipcs -q");
return 0;
}
测试运行
[root@iz2zefozq9h39txdb8s7npz shelldemo]# ./a.out
key=0xe5010131
msgqid=32768
------ Message Queues --------
key msqid owner perms used-bytes messages
0xe5010131 32768 root 666 0 0
如何删除消息队列呢?可以使用ipcrm 命令
#根据key删除
[root@iz2zefozq9h39txdb8s7npz shelldemo]# ipcrm -Q 0xe5010131
#或者根据id删除
[root@iz2zefozq9h39txdb8s7npz shelldemo]# ipcrm -q 32768