【问题标题】:Explicitly closing message queues best practices显式关闭消息队列最佳实践
【发布时间】:2013-12-09 17:21:41
【问题描述】:
gcc 4.72 c89

我将这本书作为做 mq_* posix 消息队列的参考。

The Linux Programming Interface by Michael Kerrisk page 1071

然而,在这个例子中我注意到sn-p 他们打开一个消息队列从队列中获取一些属性。但是,他们未能关闭它。

如果不将所有消息队列描述符返回给操作系统,可能会发生资源泄漏,这不是不好的做法吗?我猜如果进程终止时会自动将所有资源返回给操作系统。但是,如果一个进程在服务器上 24/7 全天候运行,那么这可能会产生重大影响。

非常感谢您的任何建议,

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);
}

【问题讨论】:

    标签: c message-queue


    【解决方案1】:

    是的,这是一种不好的做法。
    但是一旦进程退出,操作系统会回收分配给进程的所有资源。
    在这种情况下,资源只会在很短的时间内泄漏,
    在队列使用结束和程序结束之间,这非常小,因此无关紧要。

    如果进程持续运行,您必须清除所有明确获取的资源,否则会导致资源泄漏

    【讨论】:

      【解决方案2】:

      更令人担忧的是消息队列本身具有内核持久性。直到您通过调用mq_unlink(3) 删除它们或重新启动您的系统,消息队列才会被删除。可以为消息队列分配多少内存有一个与用户 ID 相关的限制,由 mq_open(3) 强制执行 - 请参阅 getrlimit(2) / setrlimit(2) 手册页,资源 RLIMIT_MSGQUEUE。在现代台式机或服务器机器中,就总可用内存而言,默认限制相对较低(ulimit -q 为我的现成 Ubuntu 12.04 / x86_64 提供了819200 安装和 16Gb RAM 内存),但可能不清理未使用的消息队列可能会给用户造成故障,因为内核将拒绝允许打开更多的消息队列。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-22
        • 1970-01-01
        • 2011-01-01
        • 2012-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多