使用的sigaction(),C(Using sigaction(), c)

2019-07-30 09:45发布

我在做关于一些阅读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()

Answer 1:

让我们试着去了解什么是你的代码的修改版本发生:

#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的结构的详细描述。



文章来源: Using sigaction(), c