我的第一篇文章,很抱歉,如果不符合规则。 需要在C问题的建议。是否可以更改信号处理程序返回点?
我正在使用信号处理程序(SIGALRM)与用户(Stdin)的输入超时。 如果用户没有输入任何内容,那么:
超时过期
信号处理函数中调用
(的问题) - >返回到同一线路发生超时之前。
重要: 我不能使用select和因为它是一个第三方机制,我使用,必须使用他们的方法不能使用轮询功能。 他们最终使用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 */
的同时是要求特定的输入,直到他的类型是正确的或超时将他踢出。
void handler (int signum)
{
inputErr==1;// global parameter
}
是否有任何解决方法让我跳过从处理程序返回后读取输入的那一行? 或者至少是管理打印一个正确的消息给用户,超时发生?而不是只是返回并再次卡住输入再次大声笑。
非常感谢。
是的。你可以使用'setjmp()'和'longjmp()'的组合。 – DyZ
为什么不打印并从处理函数本身退出?你可以这样做,如果你退出程序。 – user1952500
那么,你可以通过'siginterrupt(SIGALRM,1)'中断'read'调用,并在'EINTR'错误分支中测试取消标志。然后'longjmp'也应该是信号安全的。如果'ReadLineMethod'不在你自己的控制之下,事情会变得棘手,在这种情况下,你可能需要一些痛苦的黑客,比如关闭标准输入文件描述符。 – doynax