大家好,又见面了,我是你们的朋友全栈君。
让我们试着了解修改后的代码版本会发生什么:
#include
#include
void termination_handler(int signum)
{
printf(“Hello from handler\n”);
sleep(1);
}
int main (void)
{
//Structs that will describe the old action and the new action
//associated to the SIGINT signal (Ctrl+c from keyboard).
struct sigaction new_action,old_action;
//Set the handler in the new_action struct
new_action.sa_handler = termination_handler;
//Set to empty the sa_mask. It means that no signal is blocked
// while the handler run.
sigemptyset(&new_action.sa_mask);
//Block the SEGTERM signal.
// It means that while the handler run,the SIGTERM signal is ignored
sigaddset(&new_action.sa_mask,SIGTERM);
//Remove any flag from sa_flag. See documentation for flags allowed
new_action.sa_flags = 0;
//Read the old signal associated to SIGINT (keyboard,see signal(7))
sigaction(SIGINT,&old_action);
//If the old handler wasn’t SIG_IGN (it’s a handler that just
// “ignore” the signal)
if (old_action.sa_handler != SIG_IGN)
{
//Replace the signal handler of SIGINT with the one described by new_action
sigaction(SIGINT,NULL);
}
while(1)
{
printf(“In the loop\n”);
sleep(100);
}
return 0;
}
因此,如果您编译并启动它,然后按Ctrl C,那么您将执行处理程序消息,然后您立即返回主要的睡眠状态.您可以根据需要多次执行此操作,并且仍会显示处理程序消息和内联消息.
因此,您提供了一个函数,sigaction会执行将信号与处理程序挂钩所需的所有操作.
现在,sigterm怎么样?如果你在termination_handler中增加了睡眠时间,你可以在按下Ctrl C后键入类似“pkill –signal SIGTERM ./a.out”的内容.然后,会发生什么?没有!在termination_handler运行时,SIGTERM信号被阻止.但是一旦你回到主,现在SIGTERM将杀死应用程序.
(请记住,在测试此代码时,您仍然可以通过发送SIGKILL信号来终止应用程序.)
如果你想了解更多,并且对信号有更多的乐趣,你可以使用signal manual和sigaction manual来说明更多信息.请注意,您还具有sigaction结构的详细说明.
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141310.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...