あなたの子プロセスは殺されています。無効なプロセスはゾンビプロセスとも呼ばれます。ゾンビは死んでいます!ゾンビプロセスは、プロセステーブルのエントリにすぎず、コードやメモリはありません。
プロセスが(呼び出しによって_exit
、またはシグナルによって強制終了されて)停止した場合、そのプロセスはその親によって刈り取られなければなりません。プロセステーブルのエントリ以外のプロセスで使用されているすべてのリソースが表示されなくなります。親はwait
またはを呼び出す必要がありますwaitpid
。親が子プロセスの終了を通知され、子の終了ステータスを読み取る機会が得られると、プロセステーブル内の子のエントリも表示されなくなります。ゾンビが刈り取られます。
子供の死亡を通知したくない場合は、SIGCHLD
信号を無視してください。これは、あなたがあなたの子供の運命を知ることに興味がなく、ゾンビが自動的に刈り取られることをカーネルに伝えます。
signal(SIGCHLD, SIG_IGN)
特定の状況での子供の死亡についてのみ通知を受けたい場合は、旗を持って電話sigaction
してください。SA_NOCLDWAIT
子が死亡したときに、親がwait
機能ファミリーの1つを実行している場合、子の死亡が通知され、終了ステータスが通知されます。それ以外の場合、子の終了ステータスは破棄されます。
struct sigaction sa;
sa.sa_handler = &my_sigchld_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_NOCLDWAIT;
sigaction(SIGCHLD, &sa, NULL);
出力に関しては、明示的にリダイレクトされていない限り、子は親と同じ場所に書き込みます(close
and 、、、、open
またはdup
他の多くの可能性があります)。あなたの子供はおそらく標準エラーに診断メッセージを印刷しています(結局のところ、それが目的です)。
./spawnbot >logging.txt 2>&1
さらに、子供たちをターミナルから切り離したいと思われるので、ターミナルを殺した場合に子供たちがSIGHUPを受け取らないようにする必要があります。したがって、使用しますnohup
:
nohup ./spawnbot >logging.txt 2>&1 &
disown