wait的函數原型是: 函數
#include<sys/types.h>spa
#include <sys/wait.h>指針
pid_t wait(int *status) 進程
進程一旦調用了wait,就當即阻塞本身,由wait自動分析是否當前進程的某個子進程已經退出,若是讓它找到了這樣一個已經變成殭屍的子進程, wait就會收集這個子進程的信息,並把它完全銷燬後返回;若是沒有找到這樣一個子進程,wait就會一直阻塞在這裏,直到有一個出現爲止。 參數status用來保存被收集進程退出時的一些狀態,它是一個指向int類型的指針。但若是咱們對這個子進程是如何死掉的絕不在乎,只想把這個殭屍進程消滅掉,(事實上絕大多數原型
狀況下,咱們都會這樣想),咱們就能夠設定這個參數爲NULL,就象下面這樣: it
pid = wait(NULL);io
若是成功,wait會返回被收集的子進程的進程ID,若是調用進程沒有子進程,調用就會失敗,此時wait返回-1,同時errno被置爲ECHILD。 gcc
waitpid系統調用在Linux函數庫中的原型是: 權限
#include <sys/types.h>#include <sys/wait.h>gc
pid_t waitpid(pid_t pid,int *status,int options)
● 當正常返回的時候,waitpid返回收集到的子進程的進程ID;
● 若是設置了選項WNOHANG,而調用中waitpid發現沒有已退出的子進程可收集,則返回0;
● 若是調用中出錯,則返回-1,這時errno會被設置成相應的值以指示錯誤所在;當pid所指示的子進程不存在,或此進程存在,但不是調用進程的子進程,waitpid就會出錯返回,這時errno被設置爲ECHILD
● pid 從參數的名字pid和類型pid_t中就能夠看出,這裏須要的是一個進程ID。但當pid取不一樣的值時,在這裏有不一樣的意義。
pid>0時,只等待進程ID等於pid的子進程,無論其它已經有多少子進程運行結束退出了,只要指定的子進程尚未結束,waitpid就會一直等下去。
pid=-1時,等待任何一個子進程退出,沒有任何限制,此時waitpid和wait的做用如出一轍。
pid=0時,等待同一個進程組中的任何子進程,若是子進程已經加入了別的進程組,waitpid不會對它作任何理睬。
pid<-1時,等待一個指定進程組中的任何子進程,這個進程組的ID等於pid的絕對值。
● options options提供了一些額外的選項來控制waitpid,目前在Linux中只支持WNOHANG和WUNTRACED兩個選項,這是兩個常數,能夠用"|"運算符把它們鏈接起來使用,好比:
ret=waitpid(-1,NULL,WNOHANG | WUNTRACED);
若是咱們不想使用它們,也能夠把options設爲0,如:
ret=waitpid(-1,NULL,0);
若是使用了WNOHANG參數調用waitpid,即便沒有子進程退出,它也會當即返回,不會像wait那樣永遠等下去。
waitpid的返回值比wait稍微複雜一些,一共有3種狀況:
● 當正常返回的時候,waitpid返回收集到的子進程的進程ID;
● 若是設置了選項WNOHANG,而調用中waitpid發現沒有已退出的子進程可收集,則返回0;
● 若是調用中出錯,則返回-1,這時errno會被設置成相應的值以指示錯誤所在;當pid所指示的子進程不存在,或此進程存在,但不是調用進程的子進程,waitpid就會出錯返回,這時errno被設置爲ECHILD;
這兩個
函數返回的子進程狀態都保存在status指針中, 用如下3個宏能夠檢查該狀態:
WIFEXITED(status): 若爲正常終止, 則爲真. 此時可執行 WEXITSTATUS(status): 取子進程傳送給exit或_exit.
WIFSIGNALED(status): 若爲異常終止, 則爲真. 此時可執行 WTERMSIG(status): 取使子進程終止的信號編號.
WIFSTOPPED(status): 若爲當前暫停子進程, 則爲真. 此時可執行 WSTOPSIG(status): 取使子進程暫停的信號編號
KILL功能描述:
用於向任何進程組或進程發送信號。
參數:
pid:可能選擇有如下四種
1. pid大於零時,pid是信號欲送往的進程的標識。
2. pid等於零時,信號將送往全部與調用kill()的那個進程屬同一個使用組的進程。
3. pid等於-1時,信號將送往全部調用進程有權給其發送信號的進程,除了進程1(init)。
4. pid小於-1時,信號將送往以-pid爲組標識的進程。
sig:準備發送的信號代碼,假如其值爲零則沒有任何信號送出,可是系統會執行錯誤檢查,一般會利用sig值爲零來檢驗某個進程是否仍在執行。
返回值說明:
成功執行時,返回0。
失敗返回-1,errno被設爲如下的某個值
EINVAL:指定的信號碼無效(參數 sig 不合法)
EPERM:權限不夠沒法傳送信號給指定進程
ESRCH:參數 pid 所指定的進程或進程組不存在