kill() 函式詳解

2puT發表於2016-07-23
[ KILL ]功能描述:

用於向任何程式組或程式傳送訊號。

 

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


引數: 
pid:可能選擇有以下四種

1.pid>0時,pid是訊號欲送往的程式的標識。
2. pid=0時,訊號將送往所有與呼叫kill()的那個程式屬同一個使用組的程式。
3. pid=-1時,訊號將送往所有呼叫程式有權給其傳送訊號的程式,除了程式1(init)。
4. pid<-1時,訊號將送往以-pid為組標識的程式。

sig:準備傳送的訊號程式碼,假如其值為零則沒有任何訊號送出,但是系統會執行錯誤檢查,通常會利用sig值為零來檢驗某個程式是否仍在執行。

返回值說明:成功執行時,返回0。失敗返回-1,errno被設為以下的某個值 EINVAL:指定的訊號碼無效(引數 sig 不合法)EPERM;許可權不夠無法傳送訊號給指定程式 ESRCH:引數 pid 所指定的程式或程式組不存在

程式碼
 1 #include <</span>sys/wait.h>
 2 #include <</span>sys/types.h>
 3 #include <</span>stdio.h>
 4 #include <</span>stdlib.h>
 5 #include <</span>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

在確信fork呼叫成功後,子程式睡眠100秒,然後退出。
同時父程式在子程式上呼叫waitpid函式,但使用了WNOHANG選項(WNOHANG如果沒有任何已經結束的子程式則馬上返回,不予以等),
所以呼叫waitpid後立即返回。父程式接著殺死子程式,如果kill執行失敗,
返回-1,否這返回0。如果kill執行失敗,父程式第二次呼叫waitpid,
保證他在子程式退出後再停止執行。否則父程式顯示一條成功訊息後退出。

相關文章