【问题标题】:Use of sigaction()使用 sigaction()
【发布时间】:2011-12-20 10:14:15
【问题描述】:

我必须向进程发送两个信号,SIGUSR1SIGUSR2,以便修改程序中的特定布尔变量(SIGUSR1 将其设置为 true,@987654325 @ 将其设置为 false)。所以我写了一个signalHandler()函数来控制SIGUSR1SIGUSR2的行为。问题是:如何设置sigaction() 来处理这个特定的任务? 我在谷歌上花了很多时间,我到处都看到我应该使用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有什么用?

【问题讨论】:

  • oldact 存储信号编号signum 的先前信号处理状态。
  • @moshbear 如果我不想使用它,我可以将它设置为 NULL 吗?
  • __ 是的,你可以。 (请原谅下划线,但 cmets 的最小长度限制为 15 个字符)。
  • @moshbear 谢谢!在这个问题中我看到他只是设置了结构的 .sa_handler 参数,可以吗? stackoverflow.com/questions/5113545/…
  • @Sorcipuppolo:您至少必须将其余部分归零。

标签: c signals


【解决方案1】:

请参阅sigaction(2) 手册页。那里都有描述。

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

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

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

最后,sa_restorer 无论如何都已过时且未使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多