最佳回答
最新回答共有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); }
热门文章
- 康达学院专转本五年制
- 高考一个考场分ab卷吗
- not only but also用法
- 某物体做自由落体运动,从释放开始计时,则物体在前2s内的平均速度为______m/s,物体下落2m时的速度大小为______m/s.
- 三角函数公式大全表格
- 地理中考必背知识点2022
- 2013-2014学年小学六年级科学上学期期末考试试卷及答案
- 人教版2014-2015学年小学五年级英语第二学期期中教学质量检测试卷及答案
- 【Linux驱动开发】设备树详解(二)设备树语法详解
- 别跟客户扯细节
- 在别的城市买房子能落户吗
- 卖房前要把装修贷还完吗
- 高中政治教学提高教学效果的方法探究
- “互联网+”背景下的初中英语课堂教学改革与创新策略研究
- 2022年终止合同范本
- 租房合同范本范文
- 如何挑选土豆
- 如何挑选土鸡
