红联Linux门户
Linux帮助

kill、killall与linux信号处理

发布时间:2007-06-23 16:00:32来源:红联作者:rmidable
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信号的处理过程。不过这样处理会扰乱系统的信号处理过程。如果你不是很清除地知道自己在干什么,最好不要这样搞。
文章评论

共有 2 条评论

  1. zhong110109 于 2010-08-26 13:12:50发表:

    顶

  2. yarges 于 2009-11-11 11:28:25发表:

    请问 如果使用killall的话 系统资源怎么处理啊