簡體   English   中英

waitpid返回ECHILD - 但是pid是有效的

[英]waitpid returns ECHILD - but pid was valid

我有一個程序,用execve生成其他進程:

  s32 ret = execve( argv[0], argv.data(), (char* const*) req.posixEnv() );

然后在循環中我調用waitpid來監視進程何時終止:

while( 1 )
{
  readOutputFromChildProcess( pid );

  int status;
  s32 retPid = waitpid( pid, &status, WNOHANG );

  if ( retPid < 0 )
  {
     if ( errno == ECHILD )
     {
         // I don't expect to ever get this error - but I do. why?
         printf( "Process gone before previous wait. Return status lost.\n" );
         assert(0); 
     } else {
         // other real errors handled here.
         handleError();
         break;
     }
  }

  if ( retPid == 0 )
  {
     waitSomeTime();
     continue; 
  }

  processValidResults( status );
  break;
}

我已經大大簡化了代碼。 我的理解是,一旦你產生一個進程,進程表條目一直保持到調用者調用“waitpid”並獲得大於零的返回值和一個有效的返回狀態。

但在某些情況下似乎發生的事情是該進程自行終止,當我調用waitpid時,它返回-1,錯誤ECHILD

ECHILD意味着在我調用waitpid時,進程表中沒有具有該id的進程。 所以要么我的pid無效 - 我仔細檢查過 - 它是有效的。

或 - 在此過程完成后已經調用了waitpid - 在這種情況下,我無法從此過程獲取返回代碼。

該程序是多線程的。 另外,我已經檢查過我不是太早調用waitpid。 它發生在幾次“等待”之后。

有沒有其他方法可以在不調用waitpid的情況下清理進程表條目? 我如何確保始終獲得返回碼?

@明顯忽略SIGCHLD:

好的,所以我明白明確忽略它會導致waitpid()失敗。 我沒有明確地忽略它,但我確實設置了一些信號處理程序來捕獲崩潰在另一個地方,如下所示:

void kxHandleCrashes()
{
   struct sigaction sa;
   sa.sa_flags = SA_SIGINFO;
   sa.sa_sigaction = abortHandler;
   sigemptyset( &sa.sa_mask );

   sigaction( SIGABRT, &sa, NULL );
   sigaction( SIGSEGV, &sa, NULL );
   sigaction( SIGBUS,  &sa, NULL );
   sigaction( SIGILL,  &sa, NULL );
   sigaction( SIGFPE,  &sa, NULL );
   sigaction( SIGPIPE, &sa, NULL );

   // Should I add aline like this:
   // sigaction( SIGCHLD, &sa, NULL );
}

我有類似的問題 - waitpid會因ECHLD而失敗。 子進程正在運行,我沒有觸及SIGCHLD處理程序(默認處理程序),但仍然每次都在waitpid上獲取ECHLD。

經過幾個小時的調查后,我把孩子們分開了,然后妖魔化了父母(分叉了),這有效地將所有孩子變成了孤兒。

在父母分娩之前我移動了父母守護進程,一切都開始完美無缺。

因此,如果你得到這個神秘的ECHLD錯誤,並且你沒有弄亂SIGCHLD信號處理程序 - 檢查這些孩子是否真的仍然是你的孩子,並且孩子的PPID等於父母的PID。

您的程序示例缺少一條重要的信息:您如何聲明errno

您應該確保包含errno.h

請參閱Thread-safety和POSIX.1 的errno部分的重新定義

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM