是否可以更改信号处理程序返回点?

时间:2017-01-21 20:16:07

标签: c

我在这里的第一篇文章,如果不符合规则,那就很抱歉。 需要有关C中问题的建议。

我使用信号处理程序(SIGALRM)对用户输入的超时(Stdin)。 如果用户没有输入任何内容,那么:

  1. 超时已过期

  2. 信号处理程序名为

  3. (问题) - >它在超时发生之前返回到同一行。

  4. 重要提示: 我无法使用select并且无法使用轮询功能,因为它是我使用的第三方机制,必须使用他们的方法。 他们最终使用select,但它并不简单,我只需要使用他们的方法。

    问题是: 从信号处理程序返回后,我仍然“卡住了”#39;在同一条线上等待输入。 我无法使用longjmp,无法调用其他方法,无法向用户打印消息,无法使用goto。 处理程序和创建错误都是不安全的。

    代码看起来像这样:

    sa.sigaction(SIGALRM, &handler,Null):
    .
    . 
    While(done! =1)
    {
       alarm(20); //20 seconds timeout started
       If(ReadLineMethod()>0)  //wait for successful input from stdin
       {
            If(inputErr ==1)
             {
              **here(for example)  I want to print user that timeout        occured and return from the program (exit) **
               } 
        alarm(0);
        done==1;
        // Do stuff here
        } 
    }
    
    
    
    /* Rest of the program before exit */
    

    同时是要求特定输入,直到他输入正确或超时将他踢出去。

    void handler (int signum) 
    {
    inputErr==1;// global parameter
    } 
    

    从处理程序返回后,是否有任何工作可以跳过读取输入的行? 或者至少设法向用户打印正确的消息,发生超时?而不仅仅是返回并再次卡在输入上lol。

    提前多多感谢。

3 个答案:

答案 0 :(得分:0)

使用处理程序引发的标志。使用此标志调节打印。您需要使用互斥锁来保护此标志。

答案 1 :(得分:0)

如果您不允许重新实现ReadLineMethod()更合理,那么如何使用线程?我不是pthread的专家,但是你可以设置一下,以便在一个线程上发生ReadLineMethod并在另一个线程上发生错误轮询。甚至似乎有一个pthread_cancel函数可以强制停止读者线程,如果需要:http://man7.org/linux/man-pages/man3/pthread_cancel.3.html

答案 2 :(得分:0)

由于您有这么多限制,一种完全控制此系统的方法是:

  1. 创建一个线程并在该线程中运行ReadLineMethod()
  2. 创建另一个线程并在该线程中使用计时器。不要使用信号,否则会检测到雾已经用完了。
  3. 当计时器线程知道计时器已经运行了我们的时候,让它杀死(1)中的线程。
  4. 否则,如果ReadLineMethod()干净地运行完毕,请让计时器线程不做任何事情并完成。
  5. 当然,由于要求,这是令人费解的。如果已知基本要求,可能会有更好的选择。