C 尽管使用了signal()函数,为什么SIGUSR1终止我的子进程?
我有以下代码:C 尽管使用了signal()函数,为什么SIGUSR1终止我的子进程?,c,linux,signals,C,Linux,Signals,我有以下代码: void sig_handler(int sig) { printf("Hello child\n"); } int main() { pid_t child = fork(); if (child > 0) { printf("Hello parent\n"); kill(child, SIGUSR1); } else if (child == 0) { signal
void sig_handler(int sig) {
printf("Hello child\n");
}
int main()
{
pid_t child = fork();
if (child > 0)
{
printf("Hello parent\n");
kill(child, SIGUSR1);
}
else if (child == 0)
{
signal(SIGUSR1, sig_handler);
printf("In child\n");
}
else
{
printf("Error\n");
}
return 0;
}
我希望代码运行:
Hello parent
Hello child
In child
但在父节点发送kill(child,SIGUSR1)后,子节点立即被杀死代码>,结果就是:
Hello parent
我已经阅读了文件,说明SIGUSR1
的dafault操作是终止,但是,我已经实现了信号处理程序signal(SIGUSR1,sig_处理程序)
为了捕获SIGUSR1
,那么为什么子进程仍然被杀死?我认为有两种可能性:要么子进程在主进程发送信号之前死亡,要么主进程在设置处理程序之前发送信号
编辑:如果您只收到“Hello parent”,它不可能是第一个。信号可能在信号处理程序启动之前到达installed@Kninnug你能给我解释一下信号处理程序的安装吗?顺便说一句,你不能在信号处理程序中安全地使用printf()
。你能给我解释一下信号处理程序的设置吗?因为如果第一种可能性发生,它也会在child中打印,对吗?因此,我认为这应该是第二种可能性。事实上,如果你只得到“Hello parent”,这意味着孩子在打印之前就被杀了,可能是在发出信号之前。尝试在kill()之前和之后添加sleep(以避免子对象结束)。我已经在kill()之前和signal()之后添加了sleep(4)
,结果是:Hello parent
和在child
中添加了Hello child
。尽管未终止子进程,但不会调用信号处理程序。你能给我解释一下原因吗ẨMBùiĐình您仍然有一个比赛条件,即孩子可以在信号发送之前退出。将孩子的睡眠(4)
改为暂停()
,看看这是否有帮助。@Shawn OMG它可以工作,但需要很长时间,我能问一下安装信号()的原因吗?信号()的时间超过4秒?