2012-12-06 34 views
4

我试图确定执行是否通过检查waitpid函数的结果失败()。但是,即使当我跑,我知道失败并写入这个问题到stderr命令,检查以下从未登记。这段代码可能有什么错误?叉/ EXEC/waitpid函数问题

感谢您的任何帮助。

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. 
    { 

    } 
} 
+1

'WIFEXITED'用于区分'WIFSIGNALED'和'WIFSTOPPED'。在正常情况下,当孩子失败时,“WIFEXITED”为真(以非零状态退出)。你需要检查'WIFEXITED'和'WEXITSTATUS'。 –

回答

4

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! */ 
} 
+0

感谢您的回复。这是第一次,它实际上拿起一个执行,这是不成功的 - 但是,现在看来要考虑所有执行不成功......如果我不在乎到底是什么子进程失败的原因是,不应该加入代码在我第一次更新的第一篇文章是所需要的? –

+0

哇不知何故,我错过了代码片断你贴出来,是我不好。 –

+0

您的解决方案完美无缺,谢谢您的好先生! –