はい、親からwaitpid()を呼び出す必要があります。 waitpid()は、現在終了している状態の親プロセスの子プロセスをクリーンアップします。
あなたはあなたのプログラムにコードの下に追加することができます。
if(c>0)
{
while(1){
ret = waitpid(-1,&status,0);
if(ret>0){
if(WIFEXITED(status)){
if(WEXITSTATUS(status) == 0){
printf("child process terminated normally and successfully\n");
}
else{
printf("child process terminated normally and unsuccessfully\n");
}
}
else{
printf("child process terminated abnormally and unsuccessfully\n");
}
}
if(ret<0) {
break;
}
}
}
FYI:続きをwaitpidの上。
waitpid()がこの親プロセスの子プロセスをクリーンアップするように、最初のパラメータは-1に設定されています。このプロセスは現在終了状態です。最初のパラメータは+ ve - この場合はwaitpid )は、特定の子プロセスのみをクリーンアップします。ほとんどの場合、最初のパラメータを-1に設定すると、waitpid()のマニュアルページも参照されます。 2番目のパラメータは、子プロセスの終了/終了ステータスコードを抽出するために使用されます。 - waitpid()システムコールAPIは、システムコールAPIが呼び出されたときにステータスフィールドを埋めます。 最後のフィールドはフラグフィールドです - 現在は使用されていません - ほとんどの場合、flagsフィールドは0に設定されます。つまり、システムコールAPIのデフォルトの動作です。実際にフラグを使用する必要がある場合は、waitpid()のマニュアルページを参照してください。
注:送信したコードでは、execlp()が失敗した場合に_exit(1)が呼び出されます。 execlp()が失敗し、その状態_exit()を呼び出すことができます。 Reasonは、execlp()関数はエラーが発生した場合にのみ返します。
変更されたコードは以下のようにすることができます:
c = fork();
if(c==0) {
close(fd[READ]);
if (dup2(fd[WRITE],STDOUT_FILENO) != -1)
ret_execlp = execlp("ssh", "ssh", host, "ls" , NULL);
if(ret_execlp == -1) {
printf("execlp is failed");
_exit(1);
}
}
close(fd[WRITE]);
私は上記の2件の回答を感謝しています。この答えがより明確になることを願っています。ありがとうございました。