C 是否可以更改信号处理器返回点?
我的第一篇帖子在这里,如果有不符合规定的事情,我很抱歉。 需要为C中的问题提供建议 我正在使用一个信号处理程序(SIGALRM),在用户输入(Stdin)时超时。 如果用户没有键入任何内容,则:C 是否可以更改信号处理器返回点?,c,C,我的第一篇帖子在这里,如果有不符合规定的事情,我很抱歉。 需要为C中的问题提供建议 我正在使用一个信号处理程序(SIGALRM),在用户输入(Stdin)时超时。 如果用户没有键入任何内容,则: 超时已过期 调用的信号处理程序 (问题)->它在超时发生之前返回到同一行 重要: 我不能使用select和poll函数,因为这是我使用的第三方机制,必须使用它们的方法。 他们最终使用select,但这并不简单,我只需要使用他们的方法 问题是: 从信号处理器返回后,我仍然“卡在”同一行等待输入。 我不能使
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()
ReadLineMethod()
已干净地运行到完成,则让计时器线程不执行任何操作并完成当然,这是复杂的,因为需要。如果基本需求已知,可能会有更好的选择。是的。您可以使用
setjmp()
和longjmp()的组合
。为什么不打印并退出处理程序函数本身?如果退出该程序,您可以这样做。您可以通过sigcrupt(SIGALRM,1)中断read
调用
并测试EINTR
错误分支中的取消标志。然后再次强调longjmp
也应该是信号安全的。但是,如果ReadLineMethod
不在您自己的控制之下,事情就会变得棘手,在这种情况下,您可能需要一些痛苦的黑客操作,例如关闭标准输入文件描述符。第三个问题是什么-如果在sigaction
结构中的信号标志中省略了SA_RESTART
,参与方代码该怎么办?这可能会导致read()
调用因EINTR
而失败,然后ReadLineMethod()
将返回一个错误。谢谢大家的评论。@user1952500这不是程序的直接退出。我这里已经有很多线程了,最好不要为此使用更多线程。谢谢。条件设置在哪里?因为处理程序返回到我卡在的If(ReadLineMethod()>0)行。