首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sigaction()

使用sigaction()
EN

Stack Overflow用户
提问于 2011-12-20 10:14:15
回答 1查看 6.6K关注 0票数 6

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

代码语言:javascript
复制
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);

在signum中,我必须将我想要处理的信号类型,然后我有一个sigaction参数:

代码语言:javascript
复制
  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的用途是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-20 12:14:52

请参阅印钞(2)手册页面。都是在这里描述的。

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

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

sa_mask是一组信号,在此信号处理程序运行时,应该延迟这些信号。你至少应该设置这两个信号,这样如果它们很快接连出现,它们就不会混淆。

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8573842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档