1. 程式人生 > >函數wait和waitpid

函數wait和waitpid

操作系統 父進程 變量 導致 信息 tst top term 清除

函數wait

一個進程在終止時會關閉所有文件描述符,釋放在用戶空間釋放的內存,但它的PCB還保留著,內核在其中保存一些信息:如果是正常終止時則保存著退出狀態,如果是異常終止則保存著導致該進程終止的信號是哪個,這個進程的父進程可以調用wait或waitpid獲取這些信息,然後徹底清除這個進程,我們知道一個進程的退出狀態可以在shell用特殊變量$?查看,因為shell是它的父進程,當它終止時shell調用wait或waitpid得到它的退出狀態同時徹底清除這個進程。

1. 函數wait:一次只能回收一個子進程

pid_t wait(int *status);   status傳出參數

進程終止時,操作系統隱式回收機制會:1. 關閉所有的文件描述符 2. 釋放用戶空間分配的內存。內核PCB仍存在,其中保存該進程的退出狀態。(正常終止--------退出值;異常終止-------終止信號)

可使用wait函數傳出參數status來保存進程的退出狀態,借助宏函數來進一步判斷進程終止的具體原因,宏函數可分為三組:

  1. WIFEXITED(status):為非0,進程正常結束;WEXITSTATUS(status) :如上宏為真,使用此宏 獲取進程退出狀態(exit的參數)
  2. WIFSIGNALED(status):為非0,進程異常終止;WTERMSIG(status):如上宏為真,使用此宏 獲取進程終止的那個信號編號
  3. WIFSTOPPED(status) :為非0,進程處於暫停狀;WSTOPSIG(status):如上宏為真,使用此宏 獲取進程暫停的那個信號編號

1. 測試代碼

 1 #include <stdio.h> 
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <sys/wait.h>
 5  
 6 int main(void)
 7 {
 8     pid_t pid, wpid;
 9     pid = fork();
10     
11     if(pid == 0) 
12     {
13         printf("---child, my parent = %d, going to sleep 10s\n
", getpid()); 14 sleep(10); 15 printf("---------child die --------------\n"); 16 } 17 else if(pid > 0) 18 { 19 wpid = wait(NULL); 20 if(wpid == -1) 21 { 22 perror("wait error: "); 23 exit(1); 24 } 25 while(1) 26 { 27 printf("I am parent, pid = %d, my son = %d\n", getpid(), pid); 28 sleep(1); 29 } 30 } 31 else 32 { 33 perror("fork"); 34 return 1; 35 } 36 return 0; 37 }

輸出結果

技術分享圖片

函數wait和waitpid