2013-01-07 48 views
2
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); 
} 

回答

3

是的,這是一種不好的做法。
但是,一旦進程退出,所有提供給進程的資源都將被OS收回。
在這種情況下,資源只在隊列的使用結束和程序結束之間泄漏很少的時間,
,這是非常小的,因此是非重要的。

在連續運行過程中的情況下,你必須明確收購或者導致資源泄漏乾淨的所有資源。

0

更多的問題是具有內核持久性的消息隊列本身。通過調用mq_unlink(3)或重新啓動系統來刪除它們之前,不會刪除消息隊列。有多少內存可以分配給消息隊列的用戶ID相關限制是由mq_open(3)強制執行 - 請參見getrlimit(2)/setrlimit(2)手冊頁,資源RLIMIT_MSGQUEUE。在現代臺式機或服務器機器中,默認限制在總可用內存方面相對較低(ulimit -q給出我的現成Ubuntu 12.04/x86_64安裝帶有16Gb RAM內存的819200),但可能出現以下情況:未清理未使用的消息隊列可能會爲用戶造成故障,因爲內核會拒絕打開更多消息隊列。

請參閱mq_overview(7)手冊頁以供參考(包括指向上述手冊頁的鏈接)。