原程序中,child1, child2都收到SIGINT信号,调用stop(), 之后被唤醒,打印"child process ... is killed by parent!",事实上kill这两个child的不是parent,是它们自己的SIGINT。
放到①处,child1收到SIGINT信号,默认的行为是把自己杀了,当然也来不及打印任何东西了。child2收到SIGINT信号,打断waiting(),打印"child process 2 ...",然后退出。杀死它的也不是SIGUSR2信号。
放到②处,child1, child2收到SIGINT信号,默认的行为是立即把自己杀了,也来不及打印任何东西了。
测试方法:
// 打印谁执行、被什么信号打断
static void stop(int signal) {
printf("stop %d by signal %d\n", getpid(), signal)
wait_mark=0
}
// 在parent进程中,打印各进程id
printf("parent %d, child1 %d, child2 %d\n",getpid(),p1,p2)
如果让parent成为杀死child的凶手,可以在child1,child2中加入:
signal(SIGINT, keep_me_alive)
// 不理睬SIGINT信号
static void keep_me_alive(int signal) {
}
这时打印结果就一样了
请参考,希望能帮到你。
测试了一下,三个进程都会收到SIGINT信号。原程序中,child1, child2都收到SIGINT信号,调用stop(), 之后被唤醒,打印"child process ... is killed by parent!",事实上kill这两个child的不是parent,是它们自己的SIGINT。
放到①处,child1收到SIGINT信号,默认的行为是把自己杀了,当然也来不及打印任何东西了。child2收到SIGINT信号,打断waiting(),打印"child process 2 ...",然后退出。杀死它的也不是SIGUSR2信号。
放到②处,child1, child2收到SIGINT信号,默认的行为是立即把自己杀了,也来不及打印任何东西了。
测试方法:
// 打印谁执行、被什么信号打断
static void stop(int signal) {
printf("stop %d by signal %d\n", getpid(), signal)
wait_mark=0
}
// 在parent进程中,打印各进程id
printf("parent %d, child1 %d, child2 %d\n",getpid(),p1,p2)
如果让parent成为杀死child的凶手,可以在child1,child2中加入:
signal(SIGINT, keep_me_alive)
// 不理睬SIGINT信号
static void keep_me_alive(int signal) {
}
这时打印结果就一样了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)