在C、linux中,关于循环中的kill signal和sleep()
我在Mac OS上运行我的C程序。我的部分计划如下。此代码在sigint信号上运行良好,但在sigkill信号上无法运行在C、linux中,关于循环中的kill signal和sleep(),c,linux,macos,signals,kill,C,Linux,Macos,Signals,Kill,我在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
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;
}
}
}
我有四个问题:
,它将永远不会调用内核。理论上,当您在while(1)
循环中执行外部printf
时,应该会调用内核,从而捕获信号
sleep()
被任何信号中断。检查手册页中的睡眠(3)SIGKILL
或SIGSTOP
的信号处理程序。这些信号效果被硬编码到内核中。从sigaction(2)
:
signum指定信号,可以是除SIGKILL
和SIGSTOP
之外的任何有效信号
不带参数的kill
命令不会生成SIGKILL
信号;它生成SIGTERM
,它将永远不会调用内核。理论上,当您在while(1)
循环中执行外部printf
时,应该会调用内核,从而捕获信号
sleep()
被任何信号中断。检查手册页中的睡眠(3)SIGKILL
或SIGSTOP
的信号处理程序。这些信号效果被硬编码到内核中。从sigaction(2)
:
signum指定信号,可以是除SIGKILL
和SIGSTOP
之外的任何有效信号
不带参数的kill
命令不会生成SIGKILL
信号;它生成SIGTERM
您不能捕获
SIGKILL
-句点。不能为SIGKILL
设置陷阱。顺便提一下,同上。你知道如何在没有睡眠的情况下实现它吗?alarm()
和sleep()
的混合不是100%可靠的。您可以使用alarm()
和pause()
-pause()
仅在中断且信号处理程序返回时返回。您可以使用select()
和poll()
以及特定于平台的变体进行亚秒睡眠。您可以使用nanosleep()
和usleep()
进行纳秒和微秒分辨率睡眠(尽管精度通常不如分辨率好)。如果你仔细看的话,你可能会在某个地方睡上一毫秒。谢谢,你说的对!您不能捕获SIGKILL
-句点。不能为SIGKILL
设置陷阱。顺便提一下,同上。你知道如何在没有睡眠的情况下实现它吗?alarm()
和sleep()
的混合不是100%可靠的。您可以使用alarm()
和pause()
-pause()
仅在中断且信号处理程序返回时返回。您可以使用select()
和poll()
以及特定于平台的变体进行亚秒睡眠。您可以使用nanosleep()
和usleep()
进行纳秒和微秒分辨率睡眠(尽管精度通常不如分辨率好)。如果你仔细看的话,你可能会在某个地方睡上一毫秒。谢谢,你说的对!我不太明白第三个答案。如何在没有睡眠的情况下实现它?从报警(2)
的手册页:报警()安排在几秒钟内将信号发送到进程。
我不太理解第三个答案。如何在无睡眠的情况下实现它?从报警(2)
的手册页:报警()安排在几秒钟内将SIGALRM信号发送到进程。