我必须向进程发送两个信号,SIGUSR1和SIGUSR2,以便在程序中修改特定的布尔变量(SIGUSR1将其设置为true,SIGUSR2将其设置为false)。因此,我编写了一个signalHandler()函数来控制SIGUSR1或SIGUSR2的行为。问题是:如何设置sigaction() 来处理这个特定的任务?--我在谷歌上花了很多时间,我到处读到我应该使用sigaction()而不是过时的signal()。在手册里我找到了这个
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);在signum中,我必须将我想要处理的信号类型,然后我有一个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的用途是什么?
发布于 2011-12-20 12:14:52
请参阅印钞(2)手册页面。都是在这里描述的。
基本上,您设置sa_handler或sa_sigaction取决于您是否需要额外的信号信息。
如果设置后者,则需要将SA_SIGINFO添加到标志中。否则,对于您的情况,标志可能应该是0。您可能希望使用errno EINTR在被信号中断时系统调用失败(默认行为),因此可以在重新启动变量之前考虑变量的新值,但如果最终希望自动重新启动它们(select和poll永远不会重新启动),则可以设置SA_RESTART标志。
sa_mask是一组信号,在此信号处理程序运行时,应该延迟这些信号。你至少应该设置这两个信号,这样如果它们很快接连出现,它们就不会混淆。
最后,无论如何,sa_restorer都是过时的和未使用的。
https://stackoverflow.com/questions/8573842
复制相似问题