關於Unix第二卷60頁的mq_open 函數的參數非法問題

utili.h文件:

#ifndef _UTILI_H
#define _UTILI_H


#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<stdlib.h>
#include<assert.h>  
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<string.h>
#include<mqueue.h>
#include<wait.h>
#define MAXLEN 1024

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

#endif

mqcreate.c 文件:

#include"../utili.h"



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>");
        exit(0);
    }
    mqd = mq_open(argv[optind],flags,FILE_MODE,NULL);
    if(mqd == -1)
    printf("mq_opem Fail. errno = %d\n",errno);
    assert(mqd!=-1);

    mq_close(mqd);
    exit(0);
}


編譯的時候:  gcc -o mqcreate   mqcreate.c  -lrt

如果編譯出錯執行以下兩條命令:

           # mkdir /dev/mqueue
           # mount -t mqueue none /dev/mqueue
原因是:在Linux系統,消息隊列是創建在虛擬文件系統上,而虛擬文件需要掛載

編譯通過後  執行:  ./mqcreate  /mq_name

需要注意的是命令行參數的 /mq_name   必須以這種格式: /mq_name

原因是:每一個消息隊列是有一個name來定義的,即是以空字符結尾的字符串形如: /somename

這麼命名,原因詳細參見Unix第二卷的14頁  2.2節 IPC名字:這一小節詳細闡述了IPC 名字的規則和移植性問題.

如果還有問題請仔細閱讀:  man  7 mq_overview






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