来源:http://www.linuxdiyf.com/viewarticle.php?id=50191
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信号的处理过程。不过这样处理会扰乱系统的信号处理过程。如果你不是很清除地知道自己在干什么,最好不要这样搞。