在一定时间后中断主循环内的函数

时间:2017-01-19 12:18:17

标签: c timeout signals

我有一个主循环,我有一个功能,显示一个菜单,有一些选择,等待用户的输入。
关键是我还必须检查新事件是否发生 - 在我的特定情况下,收到一条新消息,但这根本不相关 - 我可以&# 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。我不认为这是重复的,因为正如我已经说过的,函数中断请求在循环内。或者至少对我而言,我认为这是另一回事。

1 个答案:

答案 0 :(得分:1)

既然你提到fork我假设你在POSIX系统上(比如Linux或macOS)?

这意味着您可以在执行等待的过程中为SIGALRM安装信号处理程序,并且信号的接收应该中断阻塞操作(使用errno == EINTR),您可以检查并具有menu_function返回一个表示“退出”的值。然后,循环中的代码可以检查此值,并在循环中检查break

另一种选择是不使用标准C输入函数,除非实际上有东西要读。您可以使用具有所需超时的select调用来执行此操作,并轮询FILENO_STDIN。如果select函数返回超时,再次让menu_function返回一个特殊值,意思是“退出”,否则它将使用标准C函数来读取和解析输入。

无需为输入处理程序或计时器分叉新进程。