【发布时间】:2017-01-13 06:46:18
【问题描述】:
我在 Mac OS 上运行我的 C 程序。我的程序的一部分如下。此代码在 sigint 信号上运行良好,但不能在 sigkill 信号上运行。
void sigkill(int sig){
/*some code neglected*/
exit(0);
}
void sigint(int sig){
flag=1;
}
void alive(void) {
signal(SIGINT, sigint);
signal(SIGKILL, sigkill);
alarm(10);
while(1){
//printf("%d\n",flag);
sleep(1);
if(flag==1){
printf("no\n");
flag=0;
}
}
}
我有四个问题:
一开始我没有写
sleep(1),可以进入函数sigint(),改变flag值,从printf中可以看出。但是,没有我预期的“否”输出。我添加睡眠功能后,效果很好。我想while循环会每1秒检查一次标志,如果标志=1则输出“否”。但是,每次按 ctrl+c 时似乎都是“否”输出。为什么不等一秒?
问题说“你不应该使用'sleep()'来等待10秒。使用alarm(),再加上一个循环。”我想知道如何在没有 sleep() 的情况下实现它。
kill命令无法调用sigkill函数,如何解决?
【问题讨论】:
-
你不能陷进去
SIGKILL——句号。您不能为SIGKILL设置陷阱。顺便提一下SIGSTOP。 -
你知道不用sleep()怎么实现吗?
-
混合使用
alarm()和sleep()并不是 100% 可靠的。您可以使用alarm()和pause()—pause()仅在中断且信号处理程序返回时返回。您可以使用select()和poll()以及特定于平台的变体进行亚秒级睡眠。您可以使用nanosleep()和usleep()进行纳秒和微秒分辨率的休眠(尽管精度通常不如分辨率)。如果你仔细看,某处可能有一毫秒的睡眠时间。 -
谢谢,你说得对!
标签: c linux macos signals kill