使用sigaction()
我必须向进程SIGUSR1
和SIGUSR2
发送两个信号,以便修改程序中的特定布尔变量( SIGUSR1
将其设置为true , SIGUSR2
将其设置为false )。 所以我写了一个signalHandler()
函数来控制SIGUSR1
或SIGUSR2
的行为。 问题是: 如何设置sigaction()
来处理这个特定的任务? 我花了很多时间在谷歌上,我到处读到我应该使用sigaction()
而不是过时的signal()
。 在手册页中我找到了这个
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
在signum我必须把我想要处理的信号类型,然后我有一个struct sigaction参数:
struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t sa_mask; int sa_flags; void (*sa_restorer)(void); };
在第一个字段中我认为我应该设置我的信号处理程序的名称,但我不知道如何设置其他字段。
最后,有什么用: struct sigaction *oldact
?
请参见sigaction(2)手册页。 这一切都在那里描述。
基本上你可以设置sa_handler
或sa_sigaction
具体取决于你是否需要额外的信号信息。
如果设置后者,则需要将SA_SIGINFO
添加到标志中。 否则,对于您的情况,标志应该可能为0。 您可能希望系统调用在信号中断时使用errno EINTR
失败(默认行为),因此您可以在重新启动它之前考虑变量的新值,但是如果您最终想要自动重启它们( select
and poll
never重启),您可以设置SA_RESTART
标志。
sa_mask
是在该单一处理程序运行时应该被推迟的信号集。 你应该至少设置两个信号,所以如果它们连续快速发生,它们就不会混淆。
最后, sa_restorer
已经过时且未使用过。