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

2 回答 2

3

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

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

于 2013-01-07T05:46:50.807 回答
0

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

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

于 2013-12-09T09:21:41.483 回答