明确关闭消息队列的最佳实践

时间:2013-01-07 05:40:28

标签: c message-queue

gcc 4.72 c89

我使用本书作为mq_ * posix消息队列的参考。

The Linux Programming Interface by Michael Kerrisk page 1071

但是,在这个示例代码段中,我注意到他们打开了一个消息队列,从队列中获取了一些属性。但是,他们未能将其关闭。

这不是一种不好的做法,因为如果没有将它们返回给操作系统,所有的消息队列描述符都可以用完,因此可能会发生资源泄漏吗?我想当进程死亡时会自动将所有资源返回给操作系统。但是,如果进程在服务器上全天候运行,那么这可能会产生重大影响。

非常感谢任何建议,

int main(int argc, char *argv[])
{
    mqd_t mqd;
    struct mq_attr attr;
    if (argc != 2 || strcmp(argv[1], "--help") == 0)
        usageErr("%s mq-name\n", argv[0]);

    mqd = mq_open(argv[1], O_RDONLY);
    if (mqd == (mqd_t) -1)
        errExit("mq_open");

    if (mq_getattr(mqd, &attr) == -1)
        errExit("mq_getattr");

    printf("Maximum # of messages on queue: %ld\n", attr.mq_maxmsg);
    printf("Maximum message size: %ld\n", attr.mq_msgsize);
    printf("# of messages currently on queue: %ld\n", attr.mq_curmsgs);

    exit(EXIT_SUCCESS);
}

1 个答案:

答案 0 :(得分:0)

更令人关注的是具有内核持久性的消息队列本身。在通过调用mq_unlink(3)或重新启动系统删除消息队列之前,不会删除消息队列。有一个与用户ID相关的限制,可以为消息队列分配多少内存,这由mq_open(3)强制执行 - 请参阅getrlimit(2) / setrlimit(2)手册页,资源RLIMIT_MSGQUEUE。在现代桌面或服务器计算机中,默认限制在总可用内存方面相对较低(ulimit -q为我的现成Ubuntu 12.04 / 819200安装提供x86_64,具有16Gb RAM内存),但有些情况下,清除未使用的消息队列可能会给用户造成故障,因为内核会拒绝再打开任何消息队列。

请参阅mq_overview(7)手册页以供参考(包括上述手册页的链接)。