私は親から子プロセスを殺そうと必死に努力してきました。
私が試した:1。-15pidを殺す
キルショットガンpid
-9pidを殺す
Linuxでps-Aの場合、子プロセスを「defunct」(ゾンビ)と書くことですべて解決しました。
プロセスを強制終了し、プロセステーブルから強制的に削除するにはどうすればよいですか。プロセステーブルにレコードがないため、コードでプロセスが停止していることを確認する方法であるため、クリーンアップする必要があります。
ありがとう :-)
私は親から子プロセスを殺そうと必死に努力してきました。
私が試した:1。-15pidを殺す
キルショットガンpid
-9pidを殺す
Linuxでps-Aの場合、子プロセスを「defunct」(ゾンビ)と書くことですべて解決しました。
プロセスを強制終了し、プロセステーブルから強制的に削除するにはどうすればよいですか。プロセステーブルにレコードがないため、コードでプロセスが停止していることを確認する方法であるため、クリーンアップする必要があります。
ありがとう :-)
子プロセスを収集する場合は、を使用してその終了コードを要求する必要がありますwaitpid
。マンページから:
終了するが待たされていない子は「ゾンビ」になります。カーネルは、親が子に関する情報を取得するために後で待機を実行できるようにするために、ゾンビプロセスに関する最小限の情報セット(PID、終了ステータス、リソース使用情報)を維持します。ゾンビが待機によってシステムから削除されない限り、ゾンビはカーネルプロセステーブルのスロットを消費し、このテーブルがいっぱいになると、それ以上のプロセスを作成できなくなります。
使用法は次のようになります。
#include <sys/types.h>
#include <sys/wait.h>
...
waitpid(child_pid, 0, 0);
子供がまだ退出していない場合でも、すぐに戻りたい場合:
waitpid(child_pid, 0, WNOHANG);
特定の子に関する情報を見つけることなく、すべてのゾンビの子を収集したい場合は、次のようにします。
waitpid(-1, 0, WNOHANG);
waitpid
負の数(つまりエラー)で戻り、errnoがECHILDを示すまで、ループでこれを行うことができます。
ちなみに、これにより、プロセスの状態を実際に確認することもできます。詳細については、マンページを参照してください。