簡體   English   中英

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

[英]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提取0EXIT_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM