我必须向进程发送两个信号,SIGUSR1
和 SIGUSR2
,以便修改程序中的特定 bool 变量 (SIGUSR1
将其设置为 true,SIGUSR2
将其设置为 false)。所以我写了一个 signalHandler()
函数来控制 SIGUSR1
或 SIGUSR2
的行为。问题是:如何设置 sigaction()
来处理这个特定的任务?我在 Google 上花了很多时间,到处都读到我应该使用 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
,具体取决于您是否需要额外的信号信息。
如果设置的是后者,则需要在flags中添加SA_SIGINFO
。否则,对于您的情况,标志可能应该为 0。您可能希望系统调用在被信号中断时因 errno EINTR
而失败(默认行为),因此您可以在重新启动它们之前考虑变量的新值,但如果您最终想要重新启动它们自动(select
和 poll
永远不会重新启动),您可以设置 SA_RESTART
标志。
sa_mask
是信号处理程序运行时应延迟的一组信号。您至少应该设置两个信号,这样如果它们快速连续出现,它们就不会混淆。
最后一个 sa_restorer
已过时且未被使用。
关于c - sigaction() 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8573842/