函數wait和waitpid
阿新 • • 發佈:2019-01-13
操作系統 父進程 變量 導致 信息 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來保存進程的退出狀態,借助宏函數來進一步判斷進程終止的具體原因,宏函數可分為三組:
- WIFEXITED(status):為非0,進程正常結束;WEXITSTATUS(status) :如上宏為真,使用此宏 獲取進程退出狀態(exit的參數)
- WIFSIGNALED(status):為非0,進程異常終止;WTERMSIG(status):如上宏為真,使用此宏 獲取進程終止的那個信號編號
- 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