一、wait和waitpid函數(shù)

  當(dāng)一個(gè)進(jìn)程正?;虍惓=K止時(shí)會(huì)向父進(jìn)程發(fā)送SIGCHLD信號(hào)。對(duì)于這種信號(hào)系統(tǒng)默認(rèn)會(huì)忽略。調(diào)用wait/waidpid的進(jìn)程可能會(huì):

  • 阻塞(如果其子進(jìn)程都還在運(yùn)行);

  • 立即返回子進(jìn)程的終止?fàn)顟B(tài)(如果一個(gè)子進(jìn)程已經(jīng)終止正等待父進(jìn)程存取其終止?fàn)顟B(tài));

  • 出錯(cuò)立即返回(如果它沒有任何子進(jìn)程);
    如果進(jìn)程由于收到SIGCHLD信號(hào)而調(diào)用wait,則可期望wait會(huì)立即返回。但是在任一時(shí)刻調(diào)用則進(jìn)程可能阻塞。

#include <sys/types.h>#include <sys/wait.h>pid_t wait(int *statloc);pid_t waitpid(pid_t pid, int *statloc, int options);
返回值: 成功返回進(jìn)程ID, 出錯(cuò)-1.

  這兩個(gè)函數(shù)區(qū)別:

  • wait如果在子進(jìn)程終止前調(diào)用則會(huì)阻塞,而waitpid有一選項(xiàng)可以使調(diào)用者不阻塞。

  • waitpid并不等待第一個(gè)終止的子進(jìn)程--它有多個(gè)選項(xiàng),可以控制它所等待的進(jìn)程。

如果調(diào)用者阻塞而且它有多個(gè)子進(jìn)程,則在其一個(gè)子進(jìn)程終止時(shí),wait就立即返回。因?yàn)閣ait返回子進(jìn)程ID,所以調(diào)用者知道是哪個(gè)子進(jìn)程終止了。
  參數(shù)statloc是一個(gè)整型指針。如果statloc不是一個(gè)空指針,則終止?fàn)顟B(tài)就存放到它所指向的單元內(nèi)。如果不關(guān)心終止?fàn)顟B(tài)則將statloc設(shè)為空指針。
  這兩個(gè)函數(shù)返回的整型狀態(tài)由實(shí)現(xiàn)定義。其中某些位表示退出狀態(tài)(正常退出),其他位則指示信號(hào)編號(hào)(異常返回),有一位指示是否產(chǎn)生了一個(gè)core文件等等。POSIX.1規(guī)定終止?fàn)顟B(tài)用定義在<sys/wait.h>中的各個(gè)宏來查看。有三個(gè)互斥的宏可用來取得進(jìn)程終止的原因,它們的名字都已WIF開始?;谶@三個(gè)宏中哪一個(gè)值是真,就可選用其他宏(這三個(gè)宏之外的其他宏)來取得終止?fàn)顟B(tài)、信號(hào)編號(hào)等。
  平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

  下面的程序中pr_exit函數(shù)使用上表中的宏以打印進(jìn)程的終止?fàn)顟B(tài)。

#include <sys/types.h>#include <sys/wait.h>#include <stdio.h>#include <stdlib.h>void pr_exit(int status)
{    if (WIFEXITED(status)) {        printf("normal termination, exit status=%d\n", WEXITSTATUS(status));
    } else if (WIFSIGNALED(status)) {        printf("abnormal termination, signal number = %d\n", WTERMSIG(status), 
    #ifdef WCOREDUMP
        WCOREDUMP(status) ? &
        
		

網(wǎng)友評(píng)論