显式关闭消息队列的最佳实践

3
gcc 4.72 c89

我正在使用这本书作为参考,来进行 mq_* POSIX 消息队列的操作。

The Linux Programming Interface by Michael Kerrisk page 1071

然而,在这个示例片段中,我已经注意到他们打开一个消息队列并从队列获取一些属性。但是,他们没有关闭它,这难道不是不良实践吗?如果不将其返回给操作系统,可能会发生资源泄漏,因为所有消息队列描述符都可能被耗尽。我猜,当进程死亡时,它会自动将所有资源返回给操作系统。但是,如果进程在服务器上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);
}
2个回答

3

是的,这是一种不好的做法。
但是一旦进程退出,操作系统会收回分配给进程的所有资源。
在这种情况下,资源只会在使用队列结束和程序结束之间泄漏出来,这段时间非常短暂,因此可以忽略不计。

对于持续运行的进程,您必须清理所有显式获取的资源,否则会导致资源泄漏


0
更令人担忧的是具有内核持久性的消息队列本身。只有在调用mq_unlink(3)或重新启动系统时,才会删除消息队列。与用户ID相关的限制规定了可以为消息队列分配多少内存,这由mq_open(3)执行-请参见getrlimit(2)/setrlimit(2)手册页,资源RLIMIT_MSGQUEUE。在现代桌面或服务器机器上,总可用内存方面的默认限制相对较低(对于我的现成Ubuntu 12.04/x86_64安装,具有16Gb RAM内存的ulimit -q819200),但可能存在未清除未使用的消息队列可能会为用户创建故障的情况,因为内核将拒绝允许打开更多的消息队列。

有关参考,请参阅mq_overview(7)手册页(包括上述手册页的链接)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接