使用sigaction()

Sic*_*ldr 6 c signals

我必须向进程发送两个信号,SIGUSR1并且SIGUSR2为了修改程序中的特定布尔变量(SIGUSR1将其设置为true,SIGUSR2将其设置为false).所以我写了一个signalHandler()函数来控制SIGUSR1或的行为SIGUSR2.问题是:如何设置sigaction()处理这个特定的任务? 我花了很多时间在谷歌上,我到处读到我应该使用sigaction()而不是过时的signal().在手册页中我找到了这个

int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
Run Code Online (Sandbox Code Playgroud)

在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);
   };
Run Code Online (Sandbox Code Playgroud)

在第一个字段中我认为我应该设置我的信号处理程序的名称,但我不知道如何设置其他字段.

最后,有什么用struct sigaction *oldact?:

Jan*_*dec 7

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

基本上你设置sa_handler或者sa_sigaction取决于你是否想要额外的信号信息.

如果设置后者,则需要添加SA_SIGINFO到标志中.否则,对于您的情况,标志应该可能为0.您可能希望系统调用EINTR在信号中断时使用errno失败(默认行为),因此您可以在重新启动之前考虑变量的新值,但如果您最终想要自动重启它们(select并且poll从不重新启动),你可以设置SA_RESTART标志.

sa_mask设置的应同时这葛处理器运行来延迟执行信号.你应该至少设置两个信号,所以如果它们快速连续,它们就不会混淆.

最后,sa_restorer无论如何都是过时的和未使用的.