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);
};
我很难处理一小段代码:
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); };