【问题标题】:What is the meaning of sigfillset? Do I really needed it in my implementation?sigfillset 是什么意思?在我的实施中我真的需要它吗?
【发布时间】:2014-08-15 02:42:39
【问题描述】:

我有以下配置:

static const signal_information signals_table [] =
{
    // ignored signals.

    { SIGTSTP , true , SA_RESTART , NULL },
    { SIGQUIT , true , SA_RESTART , NULL },
    { SIGINT  , true , SA_RESTART , NULL },
    { SIGTTOU , true , SA_RESTART , NULL },
    { SIGTTIN , true , SA_RESTART , NULL },
    { SIGHUP  , true , SA_RESTART , NULL },

    // non-ignored signals.

    { SIGTERM , false , SA_RESTART , signal_term_handler },
    { SIGCHLD , false , SA_RESTART | SA_NOCLDSTOP , signal_child_handler }
};

基于这个结构:

// signal information type definition.
typedef struct
{
    // the signal identifier.
    int signal;

    // flag indicating if the signal should be ignored.
    bool ignore;

    // signal action flags that will be used for the signal.
    int flags;

    // the handler of the signal.
    void (*handler) (void);
} signal_information;

以下函数获取配置并安装适当的信号:

const bool
setup_signals_support (void)
{
    struct sigaction signal_action;

    memset (&signal_action, 0, sizeof (signal_action));

    if (sigfillset (&signal_action.sa_mask) < 0)
    {
        log_error (failed_to_initialize_signal_set_message);
        return false;
    }

    for (int i = 0; i < (sizeof (signals_table) / sizeof (signals_table[0])); i++)
    {
        signal_action.sa_flags = signals_table[i].flags;

        signal_action.sa_handler = signals_table[i].ignore ? SIG_IGN : signal_dispatcher;

        if (sigaction (signals_table[i].signal, &signal_action, NULL) < 0)
        {
            log_error ("%s '%s'.", failed_to_change_signal_action_message, strsignal (signals_table[i].signal));
            return false;
        }
    }

    return true;
}

问题一:

我真正想知道的是函数中的以下部分代码是否真的有必要:

if (sigfillset (&signal_action.sa_mask) < 0)
{
    log_error (failed_to_initialize_signal_set_message);
    return false;
}

另外,我不明白 sigfillset 是什么意思。

问题 2:

我可以为所有信号重复使用相同的 sigaction (signal_action),还是必须为函数内的每个信号配置记录创建一个新的?我真正想避免的是在安装信号时共享通用配置。每个信号配置不应影响其他信号配置。我可以这样重用sigaction吗?

谢谢。

【问题讨论】:

    标签: c signals system handler


    【解决方案1】:

    问题 1

    'sigfillset' 初始化一个信号集以包含所有信号。信号集 sa_mask 是在执行信号处理程序时被阻塞的信号集。因此,在您的情况下,当您执行信号处理程序时,所有信号都被阻塞,您不必担心另一个信号会中断您的信号处理程序。当然,对于忽略 sa_mask 的信号,什么都不做。

    问题 2

    是的,您可以重用该结构(更改您想要更改的内容)。系统会读取它需要的所有信息并忘记它,因此实际上您甚至可以毫无问题地销毁结构(当您超出范围时会发生这种情况,因为它是一个自动变量)。

    【讨论】:

    • 那么,对于我的实现中的问题 1,sigfillset 引入了在另一个信号处理程序已经运行时阻塞信号的功能?而且,这不会影响被忽略的信号吗?如果是这样,它似乎很重要,我不应该删除它。正确的?对于问题 2:没有问题 :) 你回答了我 :) 谢谢。
    • 被忽略的信号没有信号处理程序,因此当它们的信号处理程序(无)正在执行时,无需阻塞所有信号。
    • 哦,我对此感到困惑。对不起..我应该留下这部分代码还是应该删除它?如果“if (sigfillset (&signal_action.sa_mask)
    • 如果您的信号处理程序可以安全中断,您可以将其移除。否则(或者如果你不是很确定)你应该离开它。请记住,您不应该阻塞信号处理程序,因为由于所有信号都被阻塞,您不能使用 SIGINT 或 SIGTERM 退出程序(仅 SIGKILL)。 :-)
    猜你喜欢
    • 1970-01-01
    • 2018-11-19
    • 2011-05-10
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    相关资源
    最近更新 更多