2009-04-17 108 views
1

我用posix_spawnp來執行不同的流程,我檢查狀態(與waitpid函數),以確保孩子正確創建催生孩子狀態退出= 127

int iRet = posix_spawnp(&iPID, zPath, NULL, NULL, argv, environ);  

    if (iRet != 0) 
    { 
     return false; 
    } 

    int iState; 
    waitpid(static_cast<pid_t>(iPID), &iState, WNOHANG); 
    cout << "Wait: PID " << iPID << " | State " << iState << endl; 

    if (WIFEXITED(iState)) { 
     printf("Child exited with RC=%d\n",WEXITSTATUS(iState)); 
    } 
    else if (WIFSIGNALED(iState)) { 
     printf("Child exited via signal %d\n",WTERMSIG(iState)); 
    } 
    else 
    { 
     printf("Child is NORMAL"); 
    } 

起初,這執行正確,我也得到了以下消息:

等待:PID 15911 |國家0兒童退出 與RC = 0

執行相同的過程幾次之後,孩子過程開始狀態127

等待退出:PID 15947 |州32512兒童 退出,RC = 127

發生這種情況後,我不能讓孩子再次產卵。我在for循環中附上了上面給出的代碼段,但它不會正確產生。 如果我重新啓動父進程,它會工作一段時間,但同樣的問題在一段時間後再次出現。

我在這裏做錯了什麼?

回答

1

檢查this link

例如:

EINVAL通過file_actions或attrp指定的值是無效的。

爲的posix_spawn和posix_spawnp子程序的錯誤代碼是受以下條件: 如果以後調用進程成功地從的posix_spawn或posix_spawnp函數返回出現此錯誤,子進程可能會退出狀態退出127

它看起來好像它可能與127退出的原因有一大堆。

+0

我重新寫使用叉子和execvp獲得錯誤的更明確的把握代碼和事實證明,實際的錯誤信息是: 錯誤號= 14(無效地址) 一些周圍挖透露,這是因爲我沒結束我的參數列表最後一項爲「NULL」。 argv = new char [iSize + 1]; argv [iSize] = NULL; 修復了這個問題。 – Gayan 2009-04-20 03:56:20

0

檢查從waitpid()返回代碼,以確保它是不是有問題。

代碼讀取的方式表明您一次只產生一個子進程(否則不需要在循環內調用waitpid())。但在這種情況下,我不希望使用WNOHANG

+0

的waitpid函數調用返回的值> 0,這意味着有一個有效的孩子。 – Gayan 2009-04-17 08:13:14