2

fork() を試行したり、スレッドを生成したりして、EAGAIN が大量に発生したため、どこかでリソースをリークしていると思い込んでしまいました。

POSIX で、プロセス自体の内部から次のものを取得することは可能ですか。

  • アクティブな pthread の数
  • アクティブな子プロセスの数
  • アクティブなパイプの数
  • アクティブなソケットの数 (または、これとパイプがファイル記述子としてカウントされるのでしょうか?)

または、これらは手動でカウントする必要がありますか? それらのカウンターは既にありますが、そのうちの 1 つが漏れていると思います。

4

1 に答える 1

1

リソースの制限に達しているため、EAGAIN を取得していると思います。実行できるスレッド/プロセスの数にはシステム制限があります。あなたはそれを見ることができます

cat /proc/sys/kernel/threads-max

で変更します

echo 100000 > /proc/sys/kernel/threads-max

それぞれ。プロセスのユーザー制限に達している可能性が高くなります。man ページを読み、 および で検索しgetrlimitulimitください。ここSOには、それらに関する情報がたくさんあります。

これらすべてのプロセスを 1 つの親から生成していると仮定すると、それらを追跡するのは簡単です。の前に、親のカウンターをインクリメントしますfork()。子が子を生成している場合は、より複雑になり、共有メモリまたはその他の IPC メカニズムを使用する必要があります。いずれにせよ、システム コールとシステム コールを使用して子のステータスを判断し、wait()それwaitpid()に基づいてプロセス カウンタを減らすことができます。によって返されるステータス データは、wait各子の終了処理を示します。繰り返しますが、問題が発生した場合に SO についてかなり詳しく説明する質問がかなりあります。

あなたの主な質問への答えとして、関心のあるリソースの一部についてシステムに (通常は /proc を介して) クエリを実行する方法があります。自分のリソースが心配な場合、これはほとんどの場合間違った方法です。それらを自分で追跡することは十分にあなたの能力の範囲内であり、はるかに効率的です.

幸運を。これがあなたを正しい方向に向けてくれることを願っています。

于 2012-04-10T17:26:17.320 に答える