mq_open permission denied问题

在UNIX网络编程:卷2-进程间通信中的一个例子如下:
#include 
#include 
#include 
#include 
#include 
#include 

#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 ] \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目录后,就解决了。

你可能感兴趣的:(c,linux)