2017-01-01 80 views
0

我正在嘗試使用fork系統調用創建進程,然後等待子進程。我已經使用了以下內容:使用Linux系統調用等待的進程等待

waitpid(pid,& status,0);

1)第一個問題是狀態是8位向左移動,例如,如果子進程返回1,則waitpid函數返回狀態變量中狀態的值爲256.請讓我知道爲什麼它這樣做。

2)根據手冊,waitpid等待子進程改變狀態。但隨後又表示:

「等待()系統調用掛起調用進程的執行,直到 它的一個子終止呼叫等待(&狀態)相當於 到:

waitpid函數( - 1,& status,0);「

我在這裏有點困惑waitpid和等待調用是否等待狀態更改或子進程終止。請清楚這一點。

第三個參數中的零是什麼意思? 3)如果我把子進程置於睡眠狀態,那麼通過等待5秒等等,子進程的狀態不會變成等待狀態嗎?

以下是我的程序:

int main(int argc, char ** argv) 
{ 
pid_t pid = fork(); 
pid_t ppp; 

if (pid==0) 
{ 
    sleep(8); 
    printf ("\n I am the first child and my id is %d \n", getpid()); 
    printf ("The first child process is now exiting now exiting\n\n"); 
    exit (1); 
} 

else { 
      int status = 13; 
      printf ("\nI am now waiting for the child process %d\n", pid); 
      waitpid (pid, &status, 0); 
      printf ("\n the status returned by the exiting child is %d\n", status>>8); 
     } 

printf("\nI am now exiting"); 
exit(0); 

}

感謝

回答

1

status參數編碼的不僅僅是孩子的退出代碼更多。從man waitpid

WIFEXITED(status)
返回true,如果孩子正常終止,也就是通過調用exit(3)_exit(2),或者從main()返回。
WEXITSTATUS(status)
返回孩子的退出狀態。這包括子進程在exit(3)_exit(2)的調用中指定的狀態參數的最低有效8位或作爲main()中的return語句的參數。僅當WIFEXITED返回true時才應使用此宏。

main waitpid解釋了第三個參數的作用。

選項的值是以下常量零以上的OR:如果
WNOHANG
立即返回沒有孩子已經退出。
WUNTRACED
如果孩子已停止(但未通過ptrace(2)跟蹤),也會返回。即使未指定此選項,也會提供已停止的跟蹤孩子的狀態。
WCONTINUED(因爲Linux 2.6.10)
也返回,如果停止的孩子已經通過交付的SIGCONT恢復。

狀態的變化是非常精確和狹義的。從man waitpid

狀態變化被認爲是:孩子終止;孩子被一個信號阻止了;或者這個孩子被一個信號恢復了。

睡覺不是一個國家的變化。通過SIGSTOP/SIGTSTP停止的。