歡迎您光臨本站 註冊首頁

kill、killall與linux信號處理

←手機掃碼閱讀     火星人 @ 2014-03-26 , reply:0

Linux中一般都提供了kill與 killall兩個命令,前者可根據pid殺掉一個線程,後者則通常根據名稱殺掉一組線程。對於大多數人來說,這兩者的不同僅此而已。

如果我們打算在自己的程序中使用signal函數「接管」某些系統信號,那麼注意了:有些信號在兩者之間的行為可能是不同的。出現這種情況的原因大概是因為POSIX.1定義的信號較少,因此在POSIX.1之後擴展的一些信號在各種實現內部具有不同的ID。使用-l參數可以查看兩個命令支持的信號列表。下面是slackware8.1上兩個命令支持的信號列表。

kill ?l killall -l

1) SIGHUP 1) HUP

2) SIGINT 2) INT

3) SIGQUIT 3) QUIT

4) SIGILL 4) ILL

5) SIGTRAP 5) TRAP

6) SIGABRT 6) ABRT

7) SIGBUS 7) EMT

8) SIGFPE 8) FPE

9) SIGKILL 9) KILL

10) SIGUSR1 10) BUS

11) SIGSEGV 11) SEGV

12) SIGUSR2 12) SYS

13) SIGPIPE 13) PIPE

14) SIGALRM 14) ALRM

15) SIGTERM 15) TERM

17) SIGCHLD 17) STOP

18) SIGCONT 18) TSTP

19) SIGSTOP 19) CONT

20) SIGTSTP 20) CHLD

21) SIGTTIN 21) TTIN

22) SIGTTOU 22) TTOU

23) SIGURG 23) IO

24) SIGXCPU 24) XCPU

25) SIGXFSZ 25) XFSZ

26) SIGVTALRM 26) VTALRM

27) SIGPROF 27) PROF

28) SIGWINCH 28) WINCH

29) SIGIO 29) INFO

30) SIGPWR 30) USR1

31) SIGSYS 31) USR2

事實上slackware8.1上的kill命令一共支持大約64種信號,不過由於killall只支持32個,因此就不列出kill ?l命令的其他部分了。

對比可以看到,一些信號的ID是不對應的,而signal函數處理的信號一般是與kill命令的信號ID對應。

因此如果我們在程序中接管USR1信號,那麼只能用kill命令才能進入正確的信號處理過程:

kill ?USR1 pid

如果一定要使用killall ?USR1 name,你還需要接管SIGPWR信號的處理過程。不過這樣處理會擾亂系統的信號處理過程。如果你不是很清除地知道自己在幹什麼,最好不要這樣搞。

[火星人 ] kill、killall與linux信號處理已經有788次圍觀

http://coctec.com/docs/linux/show-post-188339.html