wait
を使用するにはどうすればよいですか?それは私に終わりを告げるだけです。再帰を伴うprocのツリーをfork
し、pstreeを実行している間、procツリーを印刷できるように、子は一時停止(待機/スリープ)する必要があります。
私は使うべきですか
_int status;
wait(&status);
_
というより
_wait(NULL)
_
これをどこに置けばいいですか?親のif(pid > 0)
または子のif(pid==0)
?多分ifsの終わりにあるので、すべてのpid
sを配列に格納してから、それらに対してfor
を実行し、待機を使用しますか?
私のコードテンプレート:
_void ProcRec(int index)
{
pid_t pid;
int noChild = getNChild(index);
int i= 0;
for(i = 0; i < noChild; i++)
{
pid = fork();
if (pid > 0)
{
/* parent process */
}
else if (pid == 0)
{
/* child process. */
createProc(index+1);
}
else
{
/* error */
exit(EXIT_FAILURE);
}
}
if(getpid() == root)
{
sleep(1);
pid = fork();
if(pid == 0)
execl("/usr/bin/pstree", "pstree", getppid(), 0);
}
}
_
wait
システムコールはプロセスをスリープ状態にし、子プロセスが終了するのを待ちます。次に、引数に子プロセスの終了コードを入力します(引数がNULL
でない場合)。
したがって、親プロセスにある場合
_int status;
if (wait(&status) >= 0)
{
if (WEXITED(status))
{
/* Child process exited normally, through `return` or `exit` */
printf("Child process exited with %d status\n", WEXITSTATUS(status));
}
}
_
子プロセスでは、たとえばexit(1)
の場合、上記のコードが出力されます
子プロセスは1つのステータスで終了しました
また、すべての子プロセスを待つことが重要であることにも注意してください。待機しない子プロセスは、親プロセスがまだ実行されている間、いわゆるゾンビ状態になり、親プロセスが終了すると、子プロセスは孤立し、プロセス1の子になります。