mq_open permission denied问题

本文详细介绍了UNIX网络编程中利用mqueue.h进行消息队列的创建和基本操作,包括权限控制、读写模式以及错误处理。通过实例演示了如何通过命令行创建、验证和关闭消息队列,并解释了Linux系统下消息队列的虚拟文件系统挂载过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在UNIX网络编程:卷2-进程间通信中的一个例子如下:
#include <mqueue.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

#define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)

int main(int argc, char **argv) {
    int c, flags;
    mqd_t mqd;

    flags = O_RDWR | O_CREAT;
    while ( (c = getopt(argc, argv, "e")) != -1) {
        switch(c) {
        case 'e':
            flags |= O_EXCL;
            break;
        }
    }   

    if (optind != argc - 1) {
        printf("usage: mqcreate [ -e ] <name>\n");  
        exit(1);
    }   

    mqd = mq_open(argv[optind], flags, FILE_MODE, NULL);
    if (mqd == -1) {
        printf("mq_open error:%s %s\n", argv[optind],strerror(errno));
        exit(1);
    }   
    
    mq_close(mqd);
    return 0;
}

编译:

$:gcc mqcreate.c -omqcreate -lrt
执行:
$:./mqcreate -e /temp.1234
提示:
mq_open error:/test.1234 Permission denied
通过man 7 mq_overview可以查看到:

在Linux上,消息队列是通过一个虚拟文件系统创建(其他系统也可能提供了一个类似的实现)。这个文件系统可以通过以下命令被挂载(root权限):

#mkdir /dev/mqueue
#mount -t mqueue none /dev/mqueue
mq_open的name被自动设置在挂载目录(/dev/mqueue)。

在文件系统被挂载后,消息队列就可以在系统上通过例如ls和rm这样的命令查看,操作。


按照上面描述,挂载/dev/mqueue目录后,就解决了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值