[英]WEXITSTATUS(childStatus) returns 0 but waitpid returns -1
據我所知,如果waitpid返回-1,那么這是錯誤情況。 如何在WEXITSTATUS(childStatus)的子進程中獲得成功(EXIT_SUCCUSS)?
waitpid中的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.
}
當使用選項WNOHANG
,我希望在大多數情況下, waitpid
將返回-1
,而errno
設置為ECHILD
。
在任何情況下,每當waitpid
不會返回-1
,你不應該看childStatus
,其中(據我所知)可能只是垃圾。 相反,請查看errno
並進行適當處理。
否則,就目前而言,您的代碼似乎還可以,並且您應該能夠從childStatus
提取0
或EXIT_SUCCESS
。
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");
}
盡管最好在此語句后添加一個else printf("oops?\\n")
語句。
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和朋友獲得所需的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.