Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 尽管使用了signal()函数,为什么SIGUSR1终止我的子进程?_C_Linux_Signals - Fatal编程技术网

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秒?