1. Linux wait
1) 功能:等待子進程中斷或結束
2) 標頭檔
#include<sys/types.h>
#include<sys/wait.h>
3) 函數定義: pid_t wait (int * status);
4) 函數說明
wait()會暫時停止目前進程的執行,直到有訊號來到或子進程結束。如果在調用 wait()時子進程已經結束,則 wait()會立即返回子進程結束狀態值。子進程的結束狀態值會由參數 status 返回,而子進程的進程識別碼也會一快返回。如果不在意結束狀態值,則 參數 status 可以設成 NULL。 子進程的結束狀態值請參考 waitpid( ),如果執行成功則返回子進程識別碼(PID) ,如果有錯誤發生則返回
5)傳回值
-1。失敗原因存於 errno 中。
2. Linux waitpid
1) 功能:等待子進程中斷或結束
2) 標頭檔
#include<sys/types.h>
#include<sys/wait.h>
3) 函數定義: pid_t waitpid(pid_t pid,int * status,int options);
4) 函數說明
waitpid()會暫時停止目前進程的執行,直到有訊號來到或子進程結束。如果在調用 wait()時子進程已經結束,則wait()會立即返回子進程結束狀態值。子進程的結束狀態值會由參數 status 返回, 而子進程的進程識別碼也會一快返回。如果不在意結束狀態值,則參數 status 可以設成 NULL。參數 pid 為欲等待的子進程識別碼,其他數值意義如下:
pid<-1 等待進程組識別碼為 pid 絕對值的任何子進程。
pid=-1 等待任何子進程,相當於 wait()。
pid=0 等待進程組識別碼與目前進程相同的任何子進程。
pid>0 等待任何子進程識別碼為 pid 的子進程。
參數 option 可以為 0 或下面的 OR 組合:
WNOHANG 如果沒有任何已經結束的子進程則馬上返回, 不予以等待。
WUNTRACED 如果子進程進入暫停執行情況則馬上返回,但結束狀態不予以理會。
子進程的結束狀態返回後存於 status,底下有幾個宏可判別結束情況:
WIFEXITED(status)如果子進程正常結束則為非 0 值。
WEXITSTATUS(status)取得子進程 exit()返回的結束代碼,一般會先用 WIFEXITED 來判斷是否正常結束才能使用此宏。
WIFSIGNALED(status)如果子進程是因為訊號而結束則此宏值為真
WTERMSIG(status) 取得子進程因訊號而中止的訊號代碼,一般會先用 WIFSIGNALED 來判斷後才使用此宏。
WIFSTOPPED(status) 如果子進程處於暫停執行情況則此宏值為真。一般只有使用 WUNTRACED 時才會有此情況。
WSTOPSIG(status) 取得引發子進程暫停訊號代碼,一般會先用 WIFSTOPPED 來判斷後才使用此宏。
5) 傳回值
如果執行成功則返回子進程PID,如果有錯誤發生則返回-1。失敗原因存於 errno 中。
3. wait與waitpid的區別
waitpid提供了wait所沒有的三個特性:
1) waitpid使我們可以等待指定的進程
2) waitpid提供了一個無阻塞的wait
3) waitpid支援工作控制
4. SIGCHLD
核心對子進程終止(SIGCHLD)訊號的處理方法與其他訊號有所區別。當進程檢查出收到了一個子進程終止的訊號時,預設情況下,該進程 就象沒有收到該訊號似的,如果父進程執行了系統調用wait,進程將從系統調用wait中醒來並返回wait調用,執行一系列wait調用的後續操作(找
出僵死的子進程,釋放子進程的進程表項),然後從wait中返回。SIGCHLD訊號的作用是喚醒一個睡眠在可被中斷優先順序上的進程。如果該進程捕捉了這個 訊號,就象普通訊號處理一樣轉到處理常式。如果進程忽略該訊號,那麼系統調用wait的動作就有所不同,因為SIGCHLD的作用僅僅是喚醒一個睡眠在可被
中斷優先順序上的進程,那麼執行wait調用的父進程被喚醒繼續執行wait調用的後續操作,然後等待其他的子進程。
如果一個進程調用signal系統調用,並設定了SIGCHLD的處理方法,並且該進程有子進程處於僵死狀態,則核心將向該進程發一個SIGCHLD訊號。
5. Linux kill
1) 功能:用於向任何進程組或進程發送訊號。
2) 標頭檔
#include <sys/types.h>
#include <signal.h>
3) 函數定義:int kill(pid_t pid, int sig);
4) 函數說明
pid:可能選擇有以下四種
1) pid大於零時,pid是訊號欲送往的進程的標識。
2) pid等於零時,訊號將送往所有與調用kill()的那個進程屬同一個使用組的進程。
3) pid等於-1時,訊號將送往所有調用進程有權給其發送訊號的進程,除了進程1(init)。
4) pid小於-1時,訊號將送往以-pid為組標識的進程。
sig:準備發送的訊號代碼,假如其值為零則沒有任何訊號送出,但是系統會執行錯誤檢查,通常會利用sig值為零來檢驗某個進程是否仍在執行。
5) 傳回值
成功執行時,返回0。
失敗返回-1,errno被設為以下的某個值
EINVAL:指定的訊號碼無效(參數 sig 不合法)
EPERM:許可權不夠無法傳送訊號給指定進程
ESRCH:參數 pid 所指定的進程或進程組不存在