读书笔记:第5章 Posix消息队列 (1)

《UNIX网络编程:卷2》P60:图5-2

-------------------------------------------------------------------

/* 
 * mqcreate1.c
 * P60 图5-2 指定排他性标志,创建一个消息队列
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <mqueue.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':               // 允许有一个指定排他性创建的-e选项
                flags |= O_EXCL;
                break;
        }
    }   
    // getopt在optind中存放下一个待处理参数的下标
    if (optind != argc - 1) {
        fprintf(stderr, "usage: mqcreate [-e] <name>\n");
        exit(1);
    }   
    // 创建一个消息队列
    if ((mqd = mq_open(argv[optind], flags, FILE_MODE, NULL)) < 0) {
        fprintf(stderr, "mq_open error: %s\n", strerror(errno));
        exit(1);
    }   
    // 关闭消息队列(消息队列并不会从系统中删除)
    mq_close(mqd);
    exit(0);
}

在Ubuntu 14.04中运行本程序:

$ ./mqcreate1 /temp.1234			第一次创建成功
$ ./mqcreate1 -e /temp.1234			指定e选项,第二次创建失败
mq_open error: File exists
$ ls /tmp/							在/tmp目录中没有创建该文件
fcitx-socket-:0  sni-qt_sogou-qimpanel_1942-BVpkIe  sogou-qimpanel:0.pid  sogou-qimpaneluser  ssh-WCzxVuQma9NU  unity_support_test.0

在Linux系统中,消息队列被实现为虚拟文件系统。更多信息:

$ man mq_overview

你可能感兴趣的:(读书笔记,《UNIX网络编程》)