我在做关于一些阅读sigaction()
来源都出自我的课堂笔记),我不知道我理解这样的文字:
信号掩码被计算并且仅用于信号处理程序的持续时间安装。
默认情况下,信号“sig”的时候,信号发生也被阻止。
一旦一个动作安装使用sigaction的一个特定的信号,直到另一个动作是明确要求它仍然安装。
这是否意味着默认的信号掩码形式返回的信号处理后恢复? 此外,我必须使用它后重新安装该处理程序,就好像我是用signal()
此外,还有这一段代码:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void termination_handler(int signum) {
exit(7);
}
int main (void) {
struct sigaction new_action,old_action;
new_action.sa_handler = termination_handler;
sigemptyset(&new_action.sa_mask);
sigaddset(&new_action.sa_mask, SIGTERM);
new_action.sa_flags = 0;
sigaction(SIGINT, NULL, &old_action);
if (old_action.sa_handler != SIG_IGN) {
sigaction(SIGINT,&new_action,NULL);
}
sleep(10);
return 0;
}
那么-究竟是如何将SIGTERM
处理? 我可以看到安装的处理程序是termination handler()
但随后SIGTERM
添加到信号屏蔽没有使用sigprocmask()
。 这是什么意思? 谢谢!
PS最后一个问题:为什么if
声明中main()
让我们试着去了解什么是你的代码的修改版本发生:
#include <signal.h>
#include <stdio.h>
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, NULL, &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,&new_action,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信号杀死应用程序。)
如果您想了解更多,并与信号更多的乐趣,你有信号手动和sigaction的手册 ,告诉了很多。 请注意,你也有sigaction的结构的详细描述。