while 循环中的 raise()

raise() in while loop

我很难处理一小段代码:

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

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

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

通过像这样声明结构:

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);
};