プロセスがいつ終了したかをどうやって知ることができますか?

プロセスがいつ終了したかをどうやって知ることができますか?

次のコードは長いnmapプロセスを開始し、基本プログラムがそれを終了しようとします。私はそれをシェルで実行し、すべてが成功したことを確認するために別のウィンドウでGTOPも実行しました。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include <sys/wait.h>

int main()
{
int ret,childpid=0;
ret = fork();
if (ret == 0)
   {
   printf("Here A %d.. \n", ret);
   char *params[5]  = {"nmap","-sS","-A","192.168.0.1/24",0}; //cmd params filled
   childpid = execv( "/usr/bin/nmap" , params);  //parameters for cmd
   printf("\n child exiting (%d) (%d).. \n", childpid,errno); //on successful execution of cmd, this exit never appears
   }
else
   {
   childpid=ret;  
   printf("parent exiting\n");
   if (childpid!=0)
      { 
      printf("child %d about to be killed wait 15 so that htop has time to see it\n",childpid);
      sleep(15);
      kill(childpid, SIGTERM);  
      sleep(2);
      kill(childpid, SIGKILL);
      printf("killed wait 15 HTOP should have time to update\n");
      sleep(15);
      }
   }
return 1;
}

HTOP では nmap が起動することを確認しますが、プロセスを終了しても HTOP ディスプレイに表示されます。 HTOPは、メインプログラムが終了するとプロセスリストからnmapを削除します。私が何か間違っていたか、HTOPを誤解しましたか?

ベストアンサー1

子プロセスを作成して終了しましたが、wait(2)実行を続行しませんでした。プロセスは、親プロセスのために待機するゾンビプロセスです。親プロセスが終了すると、ゾンビプロセスは孤立プロセスになり、initによって処理されます。 ~からman 2 waitLinuxの場合:

子プロセスがシャットダウンした場合に待機を実行すると、システムは子プロセスに関連するリソースを解放できます。待機が実行されない場合、シャットダウンされた子プロセスは「ゾンビ」状態のままになります(下記の注を参照)。

そしてコメントから:

終了してもまだ待機していないサブプロセスは「ゾンビ」になります。カーネルは、親プロセスが後で子プロセスに関する情報を取得するために待機を実行できるように、ゾンビプロセスに関する最小限の情報セット(PID、終了ステータス、リソース使用量情報)を保持します。ゾンビプロセスは待機してシステムから削除されない限り、カーネルプロセステーブルのスロットを消費し、テーブルがいっぱいになるとプロセスを作成できなくなります。親プロセスが終了すると、対応する「ゾンビ」子プロセス(存在する場合)は、init(1)(またはpctl(2)PR_SET_CHILD_SUBREAPER操作を使用して定義された最も近い「子リッパー」プロセス)によって自動的に採用されます。ゾンビを削除するには、スタンバイを実行してください。

したがってwait()、子プロセスの場合、親プロセスが終了するまで停止し続けます。

おすすめ記事