1

最近、 msggetについてそのような質問に出くわしました。

while(1)
{
     msqid = msgget(IPC_PRIVATE,IPC_CREAT);
     if(msqid<0)
           break;
     printf("msqid=%d\n",msqid);
}

したがって、カーネル内のすべてのmsqidを消費します。

msggetはカーネルに永続的であるため、次回、プロセスは実行され、ENOSPCですぐに終了します。

問題をコンパスするようにsysconfを構成しますが。しかし、悪意のあるコードが実行され続ける場合は、何度も再構成する必要があります。

私の意見では、これは深刻な種類のリークであり、他のプロセスにmsqidが不足しているようにします。

システム管理者はこれをどのように回避できますか?

4

2 に答える 2

3

すべてのSysVIPCイン​​ターフェイス(共有メモリ、セマフォなど)には、他の多くの問題の中でも特に同じ問題があります。最悪の問題は、すべての操作でカーネルスペースへの呼び出しが必要な設計不良によるひどいパフォーマンスです。可能であれば、これらのインターフェースを破棄し、同等のPOSIX置換(mq_*メッセージキュー用)を使用してください。

于 2010-11-26T15:26:02.797 に答える
0

topとstraceを使用して、メッセージキューを作成し続けるプロセスを見つけ、そのプロセスを強制終了します。(これはLinuxを想定しています。他のUNIXには同等のツールがあります)

于 2010-11-26T13:49:33.720 に答える