0
父进程分叉两个子进程,分别代替SIGUSR1
和SIGUSR2
信号。发送和处理带子进程信号的问题C
父进程取代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
不excuted 。
#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");
}
使用'替换'不是通常的术语。你似乎在'处理'这些信号,或者'用不同的信号处理器来代替'。 – 2014-09-06 19:37:52