【发布时间】: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吗?
谢谢。
【问题讨论】: