C SIGINT被多个进程忽略
我想创建三个进程,在按下ctrl+c之前打印一些内容。下面您可以看到我的尝试,但当尝试停止程序时,什么也没有发生。当唯一的一个孩子被叉起来时,效果很好。哪里会有问题?提前谢谢C SIGINT被多个进程忽略,c,linux,signals,fork,signal-handling,C,Linux,Signals,Fork,Signal Handling,我想创建三个进程,在按下ctrl+c之前打印一些内容。下面您可以看到我的尝试,但当尝试停止程序时,什么也没有发生。当唯一的一个孩子被叉起来时,效果很好。哪里会有问题?提前谢谢 void my_handler(int s){ printf("Caught signal %d, I am dying\n",s); exit(1); } void doChild(int count){ fprintf(stdout,"Chil
void my_handler(int s){
printf("Caught signal %d, I am dying\n",s);
exit(1);
}
void doChild(int count){
fprintf(stdout,"Child %d with pid: %d\n",count, getpid());
}
int main(int argc, char **argv){
int count = 0;
pid_t pid;
struct sigaction sigIntHandler;
sigIntHandler.sa_handler = my_handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGINT, &sigIntHandler, NULL);
fprintf(stdout, "Ahoj svjete!\n");
for(;count < 3;count++){
pid = fork();
switch(pid){
case -1:
perror("Fork :(");
exit(EXIT_FAILURE);
case 0:
while(1){
doChild(count);
}
}
}
exit(EXIT_SUCCESS);
}
void my_处理程序(int s){
printf(“捕捉到信号%d,我要死了\n”,s);
出口(1);
}
void doChild(整数计数){
fprintf(stdout,“带pid的子%d:%d\n”,count,getpid());
}
int main(int argc,字符**argv){
整数计数=0;
pid_t pid;
结构sigaction sigIntHandler;
sigIntHandler.sa_handler=my_handler;
SIGEptySet(&sigIntHandler.sa_mask);
sigIntHandler.sa_标志=0;
sigaction(SIGINT,&sigintmhandler,NULL);
fprintf(标准“Ahoj svjete!\n”);
对于(;计数<3;计数++){
pid=fork();
开关(pid){
案例1:
佩罗尔(“福克:(”);
退出(退出失败);
案例0:
而(1){
多奇尔德(伯爵);
}
}
}
退出(退出成功);
}
在此循环中:
for(;count < 3;count++){
pid = fork();
}
正如REACHUS所指出的,您得到的是8个进程,而不是3个。此外,该开关测试每个进程中最后一个fork calll的结果,因此其中4个进程立即退出,而其他4个仍在
doChild
循环中运行
现在,由于顶级进程(执行第一个fork的初始进程)是退出的进程之一(其
fork
调用全部返回子进程的PID,从不为0),因此shell将再次接管,这意味着当您点击ctrl-C时,它将进入shell,而不是进入分叉的子进程。这些子进程永远看不到SIGINT(除非使用kill
)显式发送给他们,否则不要退出。main()、'argc'和'argv'的参数未使用。编译器将为每个未使用的参数发出警告。建议1)在启用所有警告的情况下编译,修复这些警告。对于上述警告对,建议使用'int main(void)';检查来自“fork()的返回值'仅在最后一次调用fork时检查,而不是在以前的调用中检查。建议将pid值的检查移到“for”循环内部。正如您在发布的代码中所看到的,使用制表符进行缩进是一个非常糟糕的主意。为了我们人类读者的利益,一致建议缩进。建议在每个大括号后缩进4个空格'{'在每个右括号前取消缩进'}'首先,它只是代码的一部分…我将编写一些getopt和东西:)其次,你是对的,我没有意识到。我解决了进程数量的问题…但信号处理仍然不起作用。
void my_handler(int s){
printf("Caught signal %d, I am dying, my PID=%d\n",s, (int)getpid());
exit(1);
}
void doChild(int count){
fprintf(stdout,"Child %d with pid: %d\n",count, getpid());
}
int main(int argc, char **argv){
int count = 0;
int status;
pid_t pid;
for(;count < 2;count++){
pid = fork();
}
printf("My PID=%d\n", (int)getpid());
fprintf(stdout, "Ahoj svjete!\n");
switch(pid){
case -1:
perror("Fork :(");
exit(EXIT_FAILURE);
case 0:
signal(SIGINT, my_handler);
while(1){
doChild(count);
}
default:
printf("Parent\n");
sigignore(SIGINT);
wait(&status);
}
printf("Process %d ended life.\n", (int)getpid());
exit(EXIT_SUCCESS);
}