【发布时间】:2014-09-06 19:09:59
【问题描述】:
父进程fork出两个子进程,每个子进程分别替换SIGUSR1和SIGUSR2信号。
父进程替换SIGINT信号,在捕获它时,分别向其子进程发送SIGUSR1和SIGUSR2。
按下 Ctrl-C 时的预期输出应该是:
Ctrl+C is pressed。
received SIGUSR1 signal
received SIGUSR2 signal
但是在 Ctrl-C 上我有
Ctrl+C is pressed。
我不知道为什么 sig_handler_1 和 sig_handler_2 没有被执行。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
void fun_ctrl_c(int);
void sig_handler_1(int);
void sig_handler_2(int);
pid_t pid1;
pid_t pid2;
int status;
int main() {
pid1 = fork();
if (pid1 == 0) { // child 1
// avoid to be killed
(void) signal(SIGINT, SIG_IGN);
// replace SIGUSR1
(void) signal(SIGUSR1, sig_handler_1);
raise(SIGSTOP);
} else {
pid2 = fork();
if (pid2 == 0) { // child 2
// avoid to be killed
(void) signal(SIGINT, SIG_IGN);
// replace SIGUSR2
(void) signal(SIGUSR2, sig_handler_2);
raise(SIGSTOP);
} else { // parent
(void) signal(SIGINT, fun_ctrl_c);
waitpid(-1, &status, 0);
}
}
return 0;
}
void fun_ctrl_c(int)
{
printf("Ctrl+C is pressed。\n");
kill(pid1 ,SIGUSR1);
kill(pid2 ,SIGUSR2);
(void) signal(SIGINT, SIG_DFL);
}
void sig_handler_1(int)
{
printf("received SIGUSR1 signal\n");
}
void sig_handler_2(int)
{
printf("received SIGUSR2 signal\n");
}
【问题讨论】:
-
使用“替换”不是常用的术语。您似乎在“处理”信号,或“用不同的信号处理程序替换当前的信号处理程序”。