Linux下的kill函式的用法

2021-08-22 06:07:09 字數 4098 閱讀 9546

功能描述:用於向任何程序組或程序傳送訊號。

標頭檔案用法:

#include

#include

int kill(pid_t pid, int sig);

引數: 

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 所指定的程序或程序組不存在。

#include #include #include #include #include int main( void )

else if ( 0 == childpid )

else

else}}

exit(exit_success);

}

//-----------------

[root@localhost src]# gcc killer.c

[root@localhost src]# ./a.out

in child process

4545 killed

在確信fork呼叫成功後,子程序睡眠100秒,然後退出。

同時父程序在子程序上呼叫waitpid函式,但使用了wnohang選項,

所以呼叫waitpid後立即返回。父程序接著殺死子程序,如果kill執行失敗,

返回-1,否這返回0。如果kill執行失敗,父程序第二次呼叫waitpid,

保證他在子程序退出後再停止執行。否則父程序顯示一條成功訊息後退出。

sig的值有:

1) sighup

本訊號在使用者終端連線(正常或非正常)結束時發出, 通常是在終端的控制程序結束時, 通知同一session內的各個作業, 這時它們與控制終端不再關聯。

此外,對於與終端脫離關係的守護程序,這個訊號用於通知它重新讀取配置檔案。

2) sigint

程式終止(interrupt)訊號, 在使用者鍵入intr字元(通常是ctrl-c)時發出,用於通知前台程序組終止程序。

3) sigquit

和sigint類似, 但由quit字元(通常是ctrl-\)來控制. 程序在因收到sigquit退出時會產生core檔案, 在這個意義上類似於乙個程式錯誤訊號。

4) sigill

執行了非法指令. 通常是因為可執行檔案本身出現錯誤, 或者試圖執行資料段. 堆疊溢位時也有可能產生這個訊號。

5) sigtrap

由斷點指令或其它trap指令產生. 由debugger使用。

6) sigabrt

呼叫abort函式生成的訊號。

7) sigbus

非法位址, 包括記憶體位址對齊(alignment)出錯。比如訪問乙個四個字長的整數, 但其位址不是4的倍數。它與sigsegv的區別在於後者是由於對合法儲存位址的非法訪問觸發的(如訪問不屬於自己儲存空間或唯讀儲存空間)。

8) sigfpe

在發生致命的算術運算錯誤時發出. 不僅包括浮點運算錯誤, 還包括溢位及除數為0等其它所有的算術的錯誤。

9) sigkill

用來立即結束程式的執行. 本訊號不能被阻塞、處理和忽略。如果管理員發現某個程序終止不了,可嘗試傳送這個訊號。

10) sigusr1

留給使用者使用

11) sigsegv

試圖訪問未分配給自己的記憶體, 或試圖往沒有寫許可權的記憶體位址寫資料.

12) sigusr2

留給使用者使用

13) sigpipe

管道破裂。這個訊號通常在程序間通訊產生,比如採用fifo(管道)通訊的兩個程序,讀管道沒開啟或者意外終止就往管道寫,寫程序會收到sigpipe訊號。此外用socket通訊的兩個程序,寫程序在寫socket的時候,讀程序已經終止。

14) sigalrm

時鐘定時訊號, 計算的是實際的時間或時鐘時間. alarm函式使用該訊號.

15) sigterm

程式結束(terminate)訊號, 與sigkill不同的是該訊號可以被阻塞和處理。通常用來要求程式自己正常退出,shell命令kill預設產生這個訊號。如果程序終止不了,我們才會嘗試sigkill。

17) sigchld

子程序結束時, 父程序會收到這個訊號。

如果父程序沒有處理這個訊號,也沒有等待(wait)子程序,子程序雖然終止,但是還會在核心程序表中占有表項,這時的子程序稱為殭屍程序。這種情況我們應該避免(父程序或者忽略sigchild訊號,或者捕捉它,或者wait它派生的子程序,或者父程序先終止,這時子程序的終止自動由init程序來接管)。

18) sigcont

讓乙個停止(stopped)的程序繼續執行. 本訊號不能被阻塞. 可以用乙個handler來讓程式在由stopped狀態變為繼續執行時完成特定的工作. 例如, 重新顯示提示符

19) sigstop

停止(stopped)程序的執行. 注意它和terminate以及interrupt的區別:該程序還未結束, 只是暫停執行. 本訊號不能被阻塞, 處理或忽略.

20) sigtstp

停止程序的執行, 但該訊號可以被處理和忽略. 使用者鍵入susp字元時(通常是ctrl-z)發出這個訊號

21) sigttin

當後台作業要從使用者終端讀資料時, 該作業中的所有程序會收到sigttin訊號. 預設時這些程序會停止執行.

22) sigttou

類似於sigttin, 但在寫終端(或修改終端模式)時收到.

23) sigurg

有」緊急」資料或out-of-band資料到達socket時產生.

24) sigxcpu

超過cpu時間資源限制. 這個限制可以由getrlimit/setrlimit來讀取/改變。

25) sigxfsz

當程序企圖擴大檔案以至於超過檔案大小資源限制。

26) sigvtalrm

虛擬時鐘訊號. 類似於sigalrm, 但是計算的是該程序占用的cpu時間.

27) sigprof

類似於sigalrm/sigvtalrm, 但包括該程序用的cpu時間以及系統呼叫的時間.

28) sigwinch

視窗大小改變時發出.

29) sigio

檔案描述符準備就緒, 可以開始進行輸入/輸出操作.

30) sigpwr

power failure

31) sigsys

非法的系統呼叫。

在以上列出的訊號中,程式不可捕獲、阻塞或忽略的訊號有:sigkill,sigstop

不能恢復至預設動作的訊號有:sigill,sigtrap

缺省會導致程序流產的訊號有:sigabrt,sigbus,sigfpe,sigill,sigiot,sigquit,sigsegv,sigtrap,sigxcpu,sigxfsz

缺省會導致程序退出的訊號有:sigalrm,sighup,sigint,sigkill,sigpipe,sigpoll,sigprof,sigsys,sigterm,sigusr1,sigusr2,sigvtalrm

缺省會導致程序停止的訊號有:sigstop,sigtstp,sigttin,sigttou

預設程序忽略的訊號有:sigchld,sigpwr,sigurg,sigwinch

kill、killall

這兩個命令是用來向程序傳送訊號的。kill 命令需要程序號作為引數,而 killall 需要程序名稱。

$ kill 785

如果您要向它傳送訊號 19 (stop),請輸入:

$ kill -19 785

假設您知道想要終止的程序的命令名稱。您可以通過該名稱來終止它,而不用再使用 ps 找出該程序的程序號:

$ killall -9 mozilla

Linux 下的KILL函式的用法

kill 功能描述 用於向任何程序組或程序傳送訊號。標頭檔案用法 include include int kill pid t pid,int sig 引數 pid 可能選擇有以下四種 1.pid大於零時,pid是訊號欲送往的程序的標識。2.pid等於零時,訊號將送往所有與呼叫kill 的那個程序屬...

Linux下Kill函式用法

kill 功能描述 用於向任何程序組或程序傳送訊號。標頭檔案用法 1 include sys types.h 23 include signal.h 45 intkill pid t pid,intsig 引數 pid 可能選擇有以下四種 1.pid大於零時,pid是訊號欲送往的程序的標識。2.pi...

Linux下Kill函式用法

kill 功能描述 用於向任何程序組或程序傳送訊號。1 include sys types.h 23 include signal.h 45 intkill pid t pid,intsig 67 引數 pid 可能選擇有以下四種 1.pid大於零時,pid是訊號欲送往的程序的標識。2.pid等於零...