有4个问题:
问题1
设置信号处理程序的代码是错误的.
这两行的顺序错误:
sigaction(SIGUSR1, &action, NULL);
action.sa_handler = handler_sigusr1;
他们应该是
action.sa_handler = handler_sigusr1;
sigaction(SIGUSR1, &action, NULL);
问题2
您的父进程在发送SIGUSR1后立即将SIGKILL发送给您的孩子. SIGKILL将终止您的子进程 – 并且不能阻止或忽略它.
除非你很幸运,否则你的孩子的sigusr1处理程序将无法在父发送SIGKILL之前运行或完成 – 这会立即终止子进程.
您可以通过插入延迟来大大增加SIGUSR1交付和处理的机会:
kill(child1, SIGUSR1);
sleep(1);
kill(child1, SIGKILL);
问题3
您已阻止SIGUSR1,因此不会将其传递给您的流程.
删除该行
sigaddset(&new_mask, SIGUSR1);
请注意,当使用sigprocmask()或sigsuspend()设置信号掩码时,掩码中设置的信号是被阻塞的信号.
问题4
您无法在信号处理程序中安全地使用printf().
printf()不是信号异步安全,也不能在信号处理程序中使用.如果你运气不好,它可能不会像在信号处理程序中使用时那样表现.使用write()代替直接写入stdout,例如
write(1, "Signal SIGUSR1\n", 15);