据我所知,如果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.
}
答案 0 :(得分:4)
使用选项WNOHANG
时,我期待时间waitpid
的大多数将返回-1
,{ {1}}设置为errno
。
在任何情况下,只要ECHILD
返回waitpid
,您就不应该查看-1
,(据我所知)可能只是垃圾。相反,请查看childStatus
,并对其进行适当处理。
否则,您的代码似乎没问题,并且您应该能够从errno
中提取0
或EXIT_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;朋友。