我有一个主循环,我有一个功能,显示一个菜单,有一些选择,等待用户的输入。
关键是我还必须检查新事件是否发生 - 在我的特定情况下,收到一条新消息,但这根本不相关 - 我可以&# 39;等待用户进行操作:我必须为该功能实现超时。
以下是我所谈论的一个简单示例:
int choice;
for(;;){
/* a new message could be arrived and we should read it now ... */
choice = menu_function();
/*
...but the user still hasn't made an action,
so the menu_function() hasn't returned yet.
*/
switch(choice){
case 1:
break;
case 2:
break;
default:
break;
}
}
到目前为止,我考虑在通过fork()
收到menu_function()
信号之后kill()
和SIGALRM
此过程之前使用alarm()
,但我没有&# 39;认为这是正确的解决方案,因为它在循环中。
我应该采用什么样的解决方案?
P.S。我不认为这是重复的,因为正如我已经说过的,函数中断请求在循环内。或者至少对我而言,我认为这是另一回事。
答案 0 :(得分:1)
既然你提到fork
我假设你在POSIX系统上(比如Linux或macOS)?
这意味着您可以在执行等待的过程中为SIGALRM
安装信号处理程序,并且信号的接收应该中断阻塞操作(使用errno == EINTR
),您可以检查并具有menu_function
返回一个表示“退出”的值。然后,循环中的代码可以检查此值,并在循环中检查break
。
另一种选择是不使用标准C输入函数,除非实际上有东西要读。您可以使用具有所需超时的select
调用来执行此操作,并轮询FILENO_STDIN
。如果select
函数返回超时,再次让menu_function
返回一个特殊值,意思是“退出”,否则它将使用标准C函数来读取和解析输入。
无需为输入处理程序或计时器分叉新进程。