LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 658|回复: 4

2.4.21内核和2.4.26内核对信号的处理不一样吗?

[复制链接]
发表于 2005-1-2 09:51:53 | 显示全部楼层 |阅读模式
程序:
/*testsig.cpp*/
#include <signal.h>
#include <unistd.h>
int main(void)
{
    signal(SIGPIPE, SIG_IGN);
    for (;;) {
        sleep(1);
    }
    return 0;
}
编译:
g++ -g -o testsig testsig.cpp
测试:
$./testsig &
$./testsig &
$./testsig &
$killall -SIGPIPE testsig

结果在mandrake9.2 kernel2.4.21和slackware10 kernel2.4.26下表现不同。
在mandrake下三个testsig进程都被杀掉,而在slack下三个testsig进程没有被杀掉。
why?
 楼主| 发表于 2005-1-2 10:00:18 | 显示全部楼层
上面说的mandrake9.2 kernle2.4.21应该是mandrake9.1 kernel2.4.21。
我在mandrake9.2 kernel2.4.22上试了一下,killall的时候进程也不会中止。
为什么2.4.21这么奇怪呢?
 楼主| 发表于 2005-1-2 10:14:19 | 显示全部楼层
看来是killall这个命令的问题,因为我在mandrake9.1 kernel2.4.21下用如下命令就没有把进程杀掉:
$killall -13 testsig
看样子是killall把SIGPIPE当成SIGTERM了。kill命令没有这个问题。
发表于 2005-1-2 10:14:58 | 显示全部楼层
具体原因不太清楚。killall实际上也是通过扫描/proc目录来查找程序的。用strace来跟踪一下看看。
发表于 2005-1-2 10:17:46 | 显示全部楼层
Post by svenwang
看来是killall这个命令的问题,因为我在mandrake9.1 kernel2.4.21下用如下命令就没有把进程杀掉:
$killall -13 testsig
看样子是killall把SIGPIPE当成SIGTERM了。kill命令没有这个问题。

我查看了用strace killall -SIGPIPE a.out的结果,果然有kill(8065, SIGTERM)。呵呵。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表