我有一个信号块SIGINT和基本上说“对不起,您不能退出\ n”。
问题是这样可以在scanf函数期间发生。
当scanf的期间发生这种情况,需要的scanf在printf的作为输入。
我如何才能做到一个printf将导致scanf函数基本上自动按下回车键。 我不在乎我得到错误的输入。 我只是希望通过编程完成该scanf函数与printf或别的东西。
处理:
scanf函数(“获取的东西”) - >用户能够在进入的东西。
- >发生SIGINT并进入我的处理程序。
- >处理程序说“等等等等等等”到标准输出。
- > SCANF采取这一等等等等等等,正在等待更多的输入。
如何让这个当我回到scanf函数完成(不关心它已经聚集了我只是希望它继续无需用户帮助)。
编辑:如果我送两个信号然后scanf函数终止。 我想效仿scanf函数的结尾莫名其妙地编程。
你的问题建议你弄糊涂了 - 或者英语不是你的母语。
我有一个信号块SIGINT和基本上说“对不起,您不能退出\ n”。
你可能是被设定为以SIGINT响应的信号处理程序。 此外,你可能会使用“信号()函数来设置处理程序 - 但你应该瞄准使用POSIX标准”的sigaction()函数来设置处理来代替。
问题是这样可以在scanf函数期间发生。
在上下文中,“这个”大概是一个中断信号,通过谁希望停止程序的用户输入。 谨慎对待阻止人们退出一个程序的中断信号; 如果你没有让他们做到这一点,他们会更残酷。 这可能意味着他们会产生SIGQUIT(也许还有一个核心转储)代替; 如果你阻止过,还有一些其他的技巧,他们可以尝试,直到他们得到的最终“杀-9 PID”你的程序将获得没有机会作出反应。
当scanf的期间发生这种情况,需要的scanf在printf的作为输入。
这是困惑......你想必这意味着从“的printf()”语句(大概是一个,说:“你不能退出”)的输出然后被视为输入“scanf()的”? 这似乎很不可思议......这将需要对工艺的I / O非常,非常奇怪的设置,我仍然不相信它会发生。
我如何才能做到一个printf将导致scanf函数基本上自动按下回车键。 我不在乎我得到错误的输入。 我只是希望通过编程完成该scanf函数与printf或别的东西。
有几种可能性 - 这部分取决于该O /你正在使用(即使它是POSIX)。我不使用“scanf()的” S; 我觉得太难控制。 如果您的系统恢复中断处理程序返回后读取,那么你将有一个艰难的时刻。 然而,有时候,“scanf()的”将停止短,并返回已经处理的项目数。 如果“scanf()的”你有没有终止,那么你就需要考虑介入的,简单地调用“的setjmp()”功能的“sigsetjmp()”,然后调用你的函数调用“scanf()的” 。 那么你的信号处理程序可以使用“siglongjmp()”返回到中间的功能:
sigjmp_buf trap;
int intermediary(int argument)
{
if (sigsetjmp(trap) == 0)
{
function_calling_scanf(argument);
return 0; // Success
}
// Report failure
return -1;
}
您继续说明:
处理:
scanf("get stuff") -> User is able to enter stuff in.
- >发生SIGINT并进入我的处理程序。
- >处理程序说“等等等等等等”到标准输出。
- > SCANF采取这一等等等等等等,正在等待更多的输入。
你怎么知道scanf函数读了“等等等等”? 这似乎非常,非常不可能给我。
如何让这个当我回到scanf函数完成(不关心它已经聚集了我只是希望它继续无需用户帮助)。
使用sigsetjmp()
编辑:如果我送两个信号然后scanf函数终止。 我想效仿scanf函数的结尾莫名其妙地编程。
这是表明你正在使用“信号()”设置信号处理程序,而不是“的sigaction()”。 与“信号()”中,当中断发生时,信号处理程序重新设置为默认值。 随着“的sigaction()”,你有权要求行为; 默认情况下,接收信号(SIGINT)被阻塞的duraction和信号处理程序仍然有效。 如果在第一次运行时会出现第二个中断,二是延期到第一个处理程序返回(此时处理器将重新进入)。
不要使用scanf函数作为它的缓冲或重试代码的方式可能会得到。 如果您使用read(2)
调用它应该返回-1,EINTR的错误号。 SCANF可能会看到错误并重新读取。 您可以随时的sscanf从原始读取数据。
这是假设QNX是POSIX兼容的读取和你不具备的scanf检查源。