while循环中的raise()

时间:2016-04-01 18:20:44

标签: c signals raise

我在使用一小段代码时遇到了困难:

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

代码编译完美但函数handler_term仅启动一次。看起来信号的行为在第一次被提升后被重置为默认值。

1 个答案:

答案 0 :(得分:0)

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

通过声明结构:

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