【发布时间】:2021-09-03 20:56:40
【问题描述】:
我的代码设置了一个计时器,它每 x 秒发送一次 SIG_ALRM。然后它进入一个调用 getch() 的输入处理循环。
int total_keys = 0;
while (1) {
inputchar = wgetch(mywindow);
mvprintw(LINES - 2, 2, "%d", total_keys++);
refresh();
switch (inputchar) {
...
}
}
由于我将 getch() 设置为阻塞 (wtimeout(mywindow, -1);),因此我希望 total_keys 仅在我按下某个键时才会上升,但我发现每次收到 SIG_ALRM 时,getch() 都会返回并且 total_keys 会递增。有谁知道为什么会这样?
编辑:这是我的 SIG_ALRM 处理程序
void alarm_handler(int signum, siginfo_t *si, void *ucontext) {
timer_t *timeridp = si->si_value.sival_ptr;
if (*timeridp == *update_timerp) {
update();
}
}
【问题讨论】:
-
您有
SIG_ALRM的处理程序吗?文档说“在 ncurses 实现下,处理的信号永远不会中断 getch。” -
这是我的 SIG_ALRM 处理程序你的
update()函数异步信号安全吗? -
我对 C 很陌生,不知道这个概念。我正在阅读它,我不确定,但可能不是。基本上我的
update()函数调用malloc和一些诅咒函数,如wmove、winch和printw。它还设置了一些主循环使用的数据。如果printf和其他缓冲 IO 函数不安全,我想 ncurses 对应的函数也不安全。