3
gcc 4.72 c89

mq_* posix メッセージ キューを実行するためのリファレンスとしてこの本を使用しています。

The Linux Programming Interface by Michael Kerrisk page 1071

ただし、このスニペットの例では、メッセージ キューを開き、キューからいくつかの属性を取得していることに気付きました。しかし、彼らはそれを閉じることができませんでした。

OS に返されない場合、すべてのメッセージ キュー記述子が使い果たされる可能性があるため、リソース リークが発生する可能性があるため、これは悪い習慣ではありませんか? プロセスが終了すると、すべてのリソースが自動的に OS に返されると思います。ただし、プロセスがサーバー上で 24 時間年中無休で実行されている場合、これは大きな影響を与える可能性があります。

ご提案いただきありがとうございます。

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

はい、それは悪い習慣です。
ただし、プロセスに与えられたすべてのリソースは、プロセスが終了すると OS によって回収されます。
この場合、リソースは、キューの使用の終了とプログラムの終了の間のわずかな時間だけリークし
ますが、これは非常に短いため重要ではありません。

プロセスが継続的に実行されている場合は、明示的に取得したすべてのリソースを消去する必要があります。そうしないと、リソース リークが発生します。

于 2013-01-07T05:46:50.807 に答える
0

さらに懸念されるのは、カーネルの永続性を持つメッセージ キュー自体です。mq_unlink(3)メッセージ キューは、呼び出して削除するか、システムを再起動するまで削除されません。メッセージ キューに割り当てることができるメモリの量には、ユーザー ID に関連する制限があります。これは、/ man ページの resourcemq_open(3)を参照してください。最近のデスクトップまたはサーバー マシンでは、デフォルトの制限は、使用可能なメモリの合計に関して比較的低いです (私の市販の Ubuntu 12.04 / 16Gb の RAM メモリを使用したインストールに与えられます) が、未使用のメッセージ キューを消去しないシナリオが存在する可能性があります。カーネルがそれ以上のメッセージ キューを開くことを拒否するため、ユーザーに誤動作を引き起こす可能性があります。getrlimit(2)setrlimit(2)RLIMIT_MSGQUEUEulimit -q819200x86_64

参照mq_overview(7) 用のマニュアル ページを参照してください (上記のマニュアル ページへのリンクを含む)。

于 2013-12-09T09:21:41.483 に答える