kill、killall与linux信号处理

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值