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