WEXITSTATUS(childStatus)返回0但waitpid返回-1

时间:2014-04-04 14:36:13

标签: c linux waitpid wexitstatus

据我所知,如果waitpid返回-1,那么它是错误条件。如何从WEXITSTATUS(childStatus)中的子进程获得成功(EXIT_SUCCUSS)?

waitpid和amp;中的childStatus有什么区别?从WEXITSTATUS(childStatus)返回值?它一样吗?

pid_t returnValue = waitpid(Checksum_pid, &childStatus, WNOHANG);
printf("return value = %d", returnValue);
printf("return value = %d", childStatus);

if (WIFEXITED(childStatus))
        {
            printf("Exit Code: _ WEXITSTATUS(childStatus)") ;    
            //Proceed with other calculation.  
        }

2 个答案:

答案 0 :(得分:4)

使用选项WNOHANG时,我期待时间waitpid大多数将返回-1,{ {1}}设置为errno

在任何情况下,只要ECHILD 返回waitpid,您就不应该查看-1,(据我所知)可能只是垃圾。相反,请查看childStatus,并对其进行适当处理。

否则,您的代码似乎没问题,并且您应该能够从errno中提取0EXIT_SUCCESS

childStatus的手册页建议使用以下示例代码:

waitpid

尽管最后添加 if (WIFEXITED(status)) { printf("exited, status=%d\n", WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf("killed by signal %d\n", WTERMSIG(status)); } else if (WIFSTOPPED(status)) { printf("stopped by signal %d\n", WSTOPSIG(status)); } else if (WIFCONTINUED(status)) { printf("continued\n"); } 语句可能是个好主意。

答案 1 :(得分:2)

WIFEXITED将读取存储在childStatus中的任何值,这只是一个整数,因此它不必来自waitpid() - 尝试例如

for(i = 0; i < 1234; i++)
        printf("WIFEXITED(%d) %s\n", i, WIFEXITED(i) ? "yes" : "no");

childSTatus和WIFEXITED(childStatus)之间的区别有点棘手...... 基本上退出状态已经被滥用来告诉退出状态杀死进程的信号:你想要像

这样的东西
struct exitstatus {
        int status;
        int signalnumber;
        enum { exited, signaled };
};

但是这些信息已经以某种方式被压缩成一个整数(我不确定是否在任何地方定义了确切的细节):例如,在我的计算机上,低8位用于信号编号(如果有的话)和位8-15用于退出代码。 重要的一点是,您不需要知道它是如何发生的,只需要通过WIFEXITED&amp; amp;朋友。