【发布时间】:2013-10-07 08:00:11
【问题描述】:
我正在编写一个处理 Linux 信号的程序。更具体地说,我想在子进程中重新安装信号 SIGINT,结果发现它不起作用。
这是我的代码的一个更简单的版本:
void handler(int sig){
//do something
exit(0);
}
void handler2(int sig){
//do something
exit(0);
}
int main(){
signal(SIGINT, handler);
if ((pid = fork()) == 0) {
signal(SIGINT, handler2); // re-install signal SIGINT
// do something that takes some time
printf("In child process:\n");
execve("foo", argv, environ); // foo is a executable in local dir
exit(0);
}else{
int status;
waitpid(pid, &status, 0); // block itself waiting for child procee to exit
}
return 0;
}
当 shell 打印“在子进程中:”时,我按 ctrl+c。我发现函数handler 执行没有问题,但handler2 从未执行。
你能帮我解决我代码中的这个错误吗?
更新:
我希望子进程在foo运行过程中接收SIGINT信号,可以吗?
【问题讨论】:
-
调用 execve() 后,子进程不再有任何信号设置,它们都被重置为 SIG_DFL - 默认值。你问的是这个吗?
-
@jimmcnamara 我不知道信号设置已重置为默认值。谢谢!