gpt4 book ai didi

c - sigfillset 是什么意思?在我的实现中我真的需要它吗?

转载 作者:太空狗 更新时间:2023-10-29 14:58:56 25 4
gpt4 key购买 nike

我有以下配置:

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是什么意思。

问题二:

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

谢谢。

最佳答案

问题一

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

问题2

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

关于c - sigfillset 是什么意思?在我的实现中我真的需要它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24393363/

25 4 0
文章推荐: java - GeoWebCache 和 osmdroid
文章推荐: java - 玩家丢失时如何启动 "new Game.class"?
文章推荐: html -
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com