← 返回首页
Linux高级程序设计(六十)
发表时间:2021-12-16 23:21:18
创建消息队列

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