Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否可以更改信号处理器返回点?_C - Fatal编程技术网

C 是否可以更改信号处理器返回点?

C 是否可以更改信号处理器返回点?,c,C,我的第一篇帖子在这里,如果有不符合规定的事情,我很抱歉。 需要为C中的问题提供建议 我正在使用一个信号处理程序(SIGALRM),在用户输入(Stdin)时超时。 如果用户没有键入任何内容,则: 超时已过期 调用的信号处理程序 (问题)->它在超时发生之前返回到同一行 重要: 我不能使用select和poll函数,因为这是我使用的第三方机制,必须使用它们的方法。 他们最终使用select,但这并不简单,我只需要使用他们的方法 问题是: 从信号处理器返回后,我仍然“卡在”同一行等待输入。 我不能使

我的第一篇帖子在这里,如果有不符合规定的事情,我很抱歉。 需要为C中的问题提供建议

我正在使用一个信号处理程序(SIGALRM),在用户输入(Stdin)时超时。 如果用户没有键入任何内容,则:

  • 超时已过期

  • 调用的信号处理程序

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

  • 重要: 我不能使用select和poll函数,因为这是我使用的第三方机制,必须使用它们的方法。 他们最终使用select,但这并不简单,我只需要使用他们的方法

    问题是: 从信号处理器返回后,我仍然“卡在”同一行等待输入。 我不能使用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 */
    
    while用于请求特定的输入,直到他输入正确或者超时将他踢出

    void handler (int signum) 
    {
    inputErr==1;// global parameter
    } 
    
    在从处理程序返回后,是否有什么方法可以让我跳过读取输入的那一行? 或者至少设法向用户打印一条发生超时的正确消息?而不仅仅是返回并再次卡在输入上lol


    非常感谢。

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

    如果不允许重新实现
    ReadLineMethod()
    更合理地说,使用线程如何?我不是pthread方面的专家,但您可能可以设置在一个线程上执行
    ReadLineMethod
    ,在另一个线程上执行错误轮询。甚至似乎有一个pthread\u cancel函数,可以在需要时强制停止读线程:

    因为e您有这么多限制,获得对该系统的完全控制的一种方法是:

  • 创建一个线程并在该线程中运行
    ReadLineMethod()
  • 创建另一个线程,并在该线程中使用计时器。不要使用信号,但要检测出该线程已用完
  • 当计时器线程知道计时器已经运行了我们的线程时,让它在(1)中杀死线程
  • 否则,如果
    ReadLineMethod()
    已干净地运行到完成,则让计时器线程不执行任何操作并完成

  • 当然,这是复杂的,因为需要。如果基本需求已知,可能会有更好的选择。

    是的。您可以使用
    setjmp()
    longjmp()的组合
    。为什么不打印并退出处理程序函数本身?如果退出该程序,您可以这样做。您可以通过
    sigcrupt(SIGALRM,1)中断
    read
    调用
    并测试
    EINTR
    错误分支中的取消标志。然后再次强调
    longjmp
    也应该是信号安全的。但是,如果
    ReadLineMethod
    不在您自己的控制之下,事情就会变得棘手,在这种情况下,您可能需要一些痛苦的黑客操作,例如关闭标准输入文件描述符。第三个问题是什么-如果在
    sigaction
    结构中的信号标志中省略了
    SA_RESTART
    ,参与方代码该怎么办?这可能会导致
    read()
    调用因
    EINTR
    而失败,然后
    ReadLineMethod()
    将返回一个错误。谢谢大家的评论。@user1952500这不是程序的直接退出。我这里已经有很多线程了,最好不要为此使用更多线程。谢谢。条件设置在哪里?因为处理程序返回到我卡在的If(ReadLineMethod()>0)行。