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