【发布时间】:2016-12-25 09:08:33
【问题描述】:
APUE 书上说:如果信号发生在sig_int_flag 的测试之后但在调用pause 之前,则进程可能永远进入休眠状态。
我不知道为什么,有人可以告诉我吗? 非常感谢。
int sig_int(); /* my signal handling function */
int sig_int_flag; /* set nonzero when signal occurs */
int main() {
signal(SIGINT, sig_int) /* establish handler */
.
.
.
while (sig_int_flag == 0)
pause(); /* go to sleep, waiting for signal */
}
int sig_int() {
signal(SIGINT, sig_int); /* reestablish handler for next time */
sig_int_flag = 1; /* set flag for main loop to examine */
}
【问题讨论】:
-
如果在处理
SIGNT之前测试了while条件,则代码将运行到UB,因为sig_int_flag被读取为未初始化。 -
"...永远休眠",直到处理下一个
SIGINT。 -
@alk 不会因为全局而为零吗?不过,我并不是说这是正确的。