【问题标题】:raise() in while loop在while循环中提高()
【发布时间】:2016-04-01 18:20:43
【问题描述】:

我很难用一小段代码:

act_therm.sa_handler=handler_therm;
    sigaction(SIGUSR1,&act_thermom,NULL);
    while(1){
        raise(SIGUSR1);
        sleep(1);
        }

代码正在完美编译,但函数 handler_term 仅启动一次。信号的行为似乎在首次引发后被重置为默认值。

【问题讨论】:

  • 我有一种感觉,一旦调用了信号处理程序,就会恢复默认操作,除非您摆弄act_therm 结构的其他部分。也许阅读手册页sigaction
  • 我尝试添加 sigaction(SIGUSR1,&temp,NULL);在while循环中,它的工作。就像 sigaction 只工作一次......
  • 问题也可能出在处理程序本身,见Minimal Complete Verifiable Example
  • 谢谢,但这并不能解释为什么它与 while 循环中的 sigaction 一起工作
  • 当您在循环中反复调用 sigaction 时它起作用的事实向我表明 Ed 是正确的并且您设置了 SA_RESETHAND 因为您没有在设置 @ 之前将您的 struct sigaction 归零987654327@.

标签: c signals raise


【解决方案1】:

我终于在一本书中找到了完整的答案:

通过像这样声明结构:

struct sigaction act_therm; 
act_therm.sa_handler=handler_therm;

标志 SA_RESETHAND(默认情况下)附加到结构。每次调用 sigaction 时,都会恢复信号的默认行为。

有两种方法可以解决这个问题:

  • 糟糕的是,每次使用 sigaction 调用信号时重新定义信号的行为
  • 定义完整的结构(来自 man)并创建 sa_flags 以便不调用 SA_RESETHAND:
struct sigaction {
    void     (*sa_handler) (int);
    void     (*sa_sigaction) (int, siginfo_t *, void *);
    sigset_t   sa_mask;
    int        sa_flags;
    void     (*sa_restorer) (void);
};

【讨论】:

    猜你喜欢
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    相关资源
    最近更新 更多