5

waitpid() の結果をチェックして、実行が失敗したかどうかを判断しようとしています。ただし、失敗することがわかっているコマンドを実行して問題を stderr に書き込んでも、以下のチェックは登録されません。このコードの何が間違っている可能性がありますか?

助けてくれてありがとう。

pid_t pid;  // the child process that the execution runs inside of.
int ret;      // exit status of child process.

child = fork();

if (pid == -1)
{
   // issue with forking
}
else if (pid == 0)
{
   execvp(thingToRun, ThingToRunArray); // thingToRun is the program name, ThingToRunArray is
                                        //    programName + input params to it + NULL.

   exit(-1);
}
else // We're in the parent process.
{
   if (waitpid(pid, &ret, 0) == -1)
   {
      // Log an error.
   }

   if (!WIFEXITED(ret)) // If there was an error with the child process.
   {

   }
}
4

1 に答える 1

6

waitpidでエラーが発生した場合にのみ-1を返しますwaitpid。つまり、誤ったpidを指定した場合、または中断された場合などです。子の終了ステータスが失敗した場合、waitpidは成功し(pidを返します)ret、子のステータスを反映するように設定されます。

子のステータスを確認するには、とを使用WIFEXITED(ret)WEXITSTATUS(ret)ます。例えば:

if( waitpid( pid, &ret, 0 ) == -1 ) {
  perror( "waitpid" );
} else if( WIFEXITED( ret ) && WEXITSTATUS( ret ) != 0 ) {
    ; /* The child failed! */
}
于 2012-12-06T01:29:43.290 に答える