linux的waiat和kill

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功能描述:

用於向任何進程組或進程發送信號。

1  #include  < sys / types.h >
2 
3  #include  < signal.h >
4 
5  int  kill(pid_t pid,  int  sig);
6 
7 


參數: 
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 所指定的進程或進程組不存在

代碼
 1  #include  < sys / wait.h >
 2  #include  < sys / types.h >
 3  #include  < stdio.h >
 4  #include  < stdlib.h >
 5  #include  < signal.h >
 6 
 7  int  main(  void  )
 8  {
 9      pid_t childpid;
10       int  status;
11       int  retval;
12      
13      childpid  =  fork();
14       if  (  - 1  ==  childpid )
15      {
16          perror(  " fork() "  );
17          exit( EXIT_FAILURE );
18      }
19       else  if  (  0  ==  childpid )
20      {
21          puts(  " In child process "  );
22          sleep(  100  ); // 讓子進程睡眠,看看父進程的行爲
23          exit(EXIT_SUCCESS);
24      }
25       else
26      {
27           if  (  0  ==  (waitpid( childpid,  & status, WNOHANG )))
28          {
29              retval  =  kill( childpid,SIGKILL );
30              
31               if  ( retval )
32              {
33                  puts(  " kill failed. "  );
34                  perror(  " kill "  );
35                  waitpid( childpid,  & status,  0  );
36              }
37               else
38              {
39                  printf(  " %d killed\n " , childpid );
40              }
41              
42          }
43      }
44      
45      exit(EXIT_SUCCESS);
46  }
47  // -----------------
48  [root@localhost src]# gcc killer.c
49  [root@localhost src]# . / a. out
50  In child process
51  4545  killed
相關文章
相關標籤/搜索