LINUX软中断通信

生活 时间:2026-04-06 16:59:56 阅读:9064
LINUX软中断通信

最佳回答

聪明的黑米

沉默的中心

2026-04-06 16:59:56

我验证下阿...一不小心就fork多了.. 刚开始我把kill的参数弄反了,信号和pid位置弄错了,调了半个小时,很郁闷.. 你只是忽略了一点...,我也给忽略了。。。后来才想起来 你按下ctrl+C的时候,另外两个fork出来的进程,他们也会接到SIGINT。。。就退出了。。所以你要先在子进程里面忽略这个SIGINT信号,用signal(SIGINT,SIG_IGN)就OK了.... 程序如下... 有解释,你可以自己看看... #include"stdio.h" #include"unistd.h" #include"signal.h" #include"sys/types.h" #include"stdlib.h" int k=0; pid_t child1=0,child2=0; void func_main(int sig); void func_child1(int sig); void func_child2(int sig); int main() { while((child1=fork())==-1); if(child1==0) { printf("child1 OK\n"); signal(SIGINT,SIG_IGN); signal(SIGUSR1,func_child1); sleep(60); } else if(child1 >0) { while((child2=fork())==-1); if(child2==0) { printf("child 2 OK\n"); signal(SIGINT,SIG_IGN);//你按下ctrl+C,子进程也会接受到ctrl的信号...所以,子进程忽略 //所提子进程要忽略掉这个SIGINT信号 signal(SIGUSR2,func_child2); sleep(60); //这里为了验证,如果进程没退出,40妙之后自动会退出的 //不然就得手动在终端里面kill掉这个进程了... //有时候成了僵尸进程需要kill -9 才能杀死 } else if(child2 >0) { signal(SIGINT,func_main); printf("children forked OK...\n"); wait(0); printf("child return...\n"); sleep(100); return 0; } } } void func_main(int sig) { k++; printf("to send signal\n"); //printf("child1=%d,child2=%d\n",child1,child2); //if(k==1) kill(child1,SIGUSR1); //if(k==2) 加上这句,再按一次ctrl C,子进程2才会退出 就是你想要的效果了 kill(child2,SIGUSR2); signal(SIGINT,SIG_DFL); //这里恢复ctrl+C的效果 //子进程退出之后,我们再按一次ctrl+C,当前的父进程就会像平常一样,退出。 } void func_child1(int sig) { printf("child1 is killed by parent!\n"); exit(0); } void func_child2(int sig) { printf("child2 is killed by parent!\n"); exit(0); }

最新回答共有2条回答

  • 大方的钻石
    回复
    2026-04-06 16:59:56

    我验证下阿...一不小心就fork多了.. 刚开始我把kill的参数弄反了,信号和pid位置弄错了,调了半个小时,很郁闷.. 你只是忽略了一点...,我也给忽略了。。。后来才想起来 你按下ctrl+C的时候,另外两个fork出来的进程,他们也会接到SIGINT。。。就退出了。。所以你要先在子进程里面忽略这个SIGINT信号,用signal(SIGINT,SIG_IGN)就OK了.... 程序如下... 有解释,你可以自己看看... #include"stdio.h" #include"unistd.h" #include"signal.h" #include"sys/types.h" #include"stdlib.h" int k=0; pid_t child1=0,child2=0; void func_main(int sig); void func_child1(int sig); void func_child2(int sig); int main() { while((child1=fork())==-1); if(child1==0) { printf("child1 OK\n"); signal(SIGINT,SIG_IGN); signal(SIGUSR1,func_child1); sleep(60); } else if(child1 >0) { while((child2=fork())==-1); if(child2==0) { printf("child 2 OK\n"); signal(SIGINT,SIG_IGN);//你按下ctrl+C,子进程也会接受到ctrl的信号...所以,子进程忽略 //所提子进程要忽略掉这个SIGINT信号 signal(SIGUSR2,func_child2); sleep(60); //这里为了验证,如果进程没退出,40妙之后自动会退出的 //不然就得手动在终端里面kill掉这个进程了... //有时候成了僵尸进程需要kill -9 才能杀死 } else if(child2 >0) { signal(SIGINT,func_main); printf("children forked OK...\n"); wait(0); printf("child return...\n"); sleep(100); return 0; } } } void func_main(int sig) { k++; printf("to send signal\n"); //printf("child1=%d,child2=%d\n",child1,child2); //if(k==1) kill(child1,SIGUSR1); //if(k==2) 加上这句,再按一次ctrl C,子进程2才会退出 就是你想要的效果了 kill(child2,SIGUSR2); signal(SIGINT,SIG_DFL); //这里恢复ctrl+C的效果 //子进程退出之后,我们再按一次ctrl+C,当前的父进程就会像平常一样,退出。 } void func_child1(int sig) { printf("child1 is killed by parent!\n"); exit(0); } void func_child2(int sig) { printf("child2 is killed by parent!\n"); exit(0); }

上一篇 我每次打坐先是全身动弹不得而后渐渐的舌头没感觉最后感觉自己没了身体一般,但意识还清醒。到这是初禅吗

下一篇 关于美国心理学书籍有没推荐的