我在这里的第一篇文章,如果不符合规则,那就很抱歉。 需要有关C中问题的建议。
我使用信号处理程序(SIGALRM)对用户输入的超时(Stdin)。 如果用户没有输入任何内容,那么:
超时已过期
信号处理程序名为
(问题) - >它在超时发生之前返回到同一行。
重要提示: 我无法使用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。
提前多多感谢。
答案 0 :(得分:0)
使用处理程序引发的标志。使用此标志调节打印。您需要使用互斥锁来保护此标志。
答案 1 :(得分:0)
如果您不允许重新实现ReadLineMethod()
更合理,那么如何使用线程?我不是pthread的专家,但是你可以设置一下,以便在一个线程上发生ReadLineMethod
并在另一个线程上发生错误轮询。甚至似乎有一个pthread_cancel函数可以强制停止读者线程,如果需要:http://man7.org/linux/man-pages/man3/pthread_cancel.3.html
答案 2 :(得分:0)
由于您有这么多限制,一种完全控制此系统的方法是:
ReadLineMethod()
。ReadLineMethod()
干净地运行完毕,请让计时器线程不做任何事情并完成。当然,由于要求,这是令人费解的。如果已知基本要求,可能会有更好的选择。