SCANF与信号(Scanf with Signals)

2019-10-20 15:03发布

我有一个信号块SIGINT和基本上说“对不起,您不能退出\ n”。

问题是这样可以在scanf函数期间发生。

当scanf的期间发生这种情况,需要的scanf在printf的作为输入。

我如何才能做到一个printf将导致scanf函数基本上自动按下回车键。 我不在乎我得到错误的输入。 我只是希望通过编程完成该scanf函数与printf或别的东西。

处理:

scanf函数(“获取的东西”) - >用户能够在进入的东西。

- >发生SIGINT并进入我的处理程序。

- >处理程序说“等等等等等等”到标准输出。

- > SCANF采取这一等等等等等等,正在等待更多的输入。

如何让这个当我回到scanf函数完成(不关心它已经聚集了我只是希望它继续无需用户帮助)。

编辑:如果我送两个信号然后scanf函数终止。 我想效仿scanf函数的结尾莫名其妙地编程。

Answer 1:

你的问题建议你弄糊涂了 - 或者英语不是你的母语。

我有一个信号块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和信号处理程序仍然有效。 如果在第一次运行时会出现第二个中断,二是延期到第一个处理程序返回(此时处理器将重新进入)。



Answer 2:

不要使用scanf函数作为它的缓冲或重试代码的方式可能会得到。 如果您使用read(2)调用它应该返回-1,EINTR的错误号。 SCANF可能会看到错误并重新读取。 您可以随时的sscanf从原始读取数据。

这是假设QNX是POSIX兼容的读取和你不具备的scanf检查源。



文章来源: Scanf with Signals