使用sigaction()

时间:2011-12-20 10:14:16

标签: c signals

我必须向进程SIGUSR1SIGUSR2发送两个信号,以便修改程序中的特定布尔变量(SIGUSR1将其设置为 true < / em>,SIGUSR2将其设置为 false )。所以我写了一个signalHandler()函数来控制SIGUSR1SIGUSR2的行为。问题是:如何设置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

1 个答案:

答案 0 :(得分:7)

请参阅sigaction(2)手册页。这一切都在那里描述。

基本上,您可以设置sa_handlersa_sigaction,具体取决于您是否需要额外的信号信息。

如果设置较晚,则需要在标志中添加SA_SIGINFO。否则,对于您的情况,标志应该可能为0。当信号中断(默认行为)时,您可能希望系统调用失败并显示错误EINTR,因此您可以在重新启动变量之前考虑变量的新值,但是如果您最终想要自动重启它们({ {1}}和select永远不会重新启动),您可以设置poll标记。

SA_RESTART是在这个单一处理程序运行时应该被推迟的一组信号。你应该至少设置两个信号,这样如果它们快速连续,它们就不会混淆。

最后,sa_mask已经过时且未使用过。