mq_open permission denied問題

在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目錄後,就解決了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章