在 C 中,linux,关于 kill signal 和循环中的 sleep()
In C, linux, about kill signal and sleep() in loop
我 运行 我的 C 程序在 Mac OS 上。我的程序的一部分如下。此代码 运行 在 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(),改变标志值,从printf可以看出。但是,没有我预期的 "no" 输出。
我添加了休眠功能后,效果很好。我想 while 循环会每 1 秒检查一次 flag,如果 flag=1 则输出 "no"。但是,似乎每次按 ctrl+c 时都会输出 "no"。为什么不等待一秒钟?
问题说"You should not use 'sleep()' to wait 10 seconds. Use alarm(), coupled with a loop."我想知道如何在没有sleep()的情况下实现这个。
kill命令无法调用sigkill函数,如何解决?
- 一般来说,信号只能在您的应用程序对内核进行系统调用时被 "caught"。如果你做一个普通的
while(1) { if (flag==1){...} }
,那将永远不会调用内核。理论上,当您在 while(1)
循环中执行外部 printf
时,应该会调用内核,因此可以捕获信号。
sleep()
被任何信号打断。查看 sleep(3)
. 的手册页
- 查看
alarm(2)
的手册页。
您不能更改 SIGKILL
或 SIGSTOP
的信号处理程序。这些信号效果被硬编码到内核中。来自 sigaction(2)
:
signum specifies the signal and can be any valid signal except SIGKILL
and SIGSTOP
.
没有参数的kill
命令不会产生SIGKILL
信号;它生成 SIGTERM
.
我 运行 我的 C 程序在 Mac OS 上。我的程序的一部分如下。此代码 运行 在 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(),改变标志值,从printf可以看出。但是,没有我预期的 "no" 输出。我添加了休眠功能后,效果很好。我想 while 循环会每 1 秒检查一次 flag,如果 flag=1 则输出 "no"。但是,似乎每次按 ctrl+c 时都会输出 "no"。为什么不等待一秒钟?
问题说"You should not use 'sleep()' to wait 10 seconds. Use alarm(), coupled with a loop."我想知道如何在没有sleep()的情况下实现这个。
kill命令无法调用sigkill函数,如何解决?
- 一般来说,信号只能在您的应用程序对内核进行系统调用时被 "caught"。如果你做一个普通的
while(1) { if (flag==1){...} }
,那将永远不会调用内核。理论上,当您在while(1)
循环中执行外部printf
时,应该会调用内核,因此可以捕获信号。 sleep()
被任何信号打断。查看sleep(3)
. 的手册页
- 查看
alarm(2)
的手册页。 您不能更改
SIGKILL
或SIGSTOP
的信号处理程序。这些信号效果被硬编码到内核中。来自sigaction(2)
:signum specifies the signal and can be any valid signal except
SIGKILL
andSIGSTOP
.没有参数的
kill
命令不会产生SIGKILL
信号;它生成SIGTERM
.