【问题标题】:how does windows command prompt handle consecutive CTRL + C (SIGINT) signals?windows 命令提示符如何处理连续的 CTRL + C (SIGINT) 信号?
【发布时间】:2015-04-29 21:08:24
【问题描述】:

我正在从 Windows 命令提示符运行一个程序,当我按下 CTRL C、恢复,然后再次按下 CTRL C 时,我得到了一些奇怪的行为。

ctrl C 导致我正在使用的程序(icarus verilog)在我第一次点击 ctrl C 时暂停。然后我输入“cont”(一个 icarus verilog 命令在暂停后继续),然后它退出该处理程序并重新进入主循环(我在里面有打印语句让我知道)它是第一次。

但是,第二次按 CTRL + C 不会命中 SIGINT 处理程序。

我想知道 Windows 是否会以不同的方式解释第二个 ctrl C 事件,实际上是否向程序发送了不同的信号,或者可能发送了终止信号。

我打算发布主代码循环,但我意识到我可以为读者简化事情。

这个函数在这里:

extern "C" void signals_handler(int)
{
    printf("Inside Signals handler \n");
      schedule_stopped_flag = true;
}

第一次被 CTRL C 击中,但不是第二次被调用。

通过在函数中传递这个函数指针来附加它:

static void signals_capture(void)
{
      signal(SIGINT, &signals_handler);
}

函数“信号”的文档可以在这里看到: http://www.cplusplus.com/reference/csignal/signal/

在代码中似乎没有任何地方分离信号处理程序。

【问题讨论】:

  • 或者由于一些错误,程序只处理了一次信号?
  • 就是这样。我正在查看程序运行时。我根本看不到任何问题。代码看起来很好,单步执行它看起来代码运行良好,即使它在正确的循环中,它也没有收到第二个信号。我想知道这是否是由于windows和linux之间的一些差异。
  • 我想我接下来尝试的唯一选择是弄清楚如何使用 gdb 来捕获信号,然后看看它去了哪里。但是,当我几分钟前尝试这样做时,我对程序退出的原因感到困惑。但是,基于此:msdn.microsoft.com/en-us/library/windows/desktop/… 似乎我需要处理引发的异常
  • 嗯,无论如何,我认为您的 cmets 帮助我走上了正轨。我的猜测是某个调用过早地解除了信号处理程序的附加。我不知道它在哪里,但一定是这样
  • 这很有意义。

标签: c windows signals


【解决方案1】:

看来您必须在激活后重新附加处理程序。我猜操作系统正在删除它或其他东西,但不是我正在查看的代码将它分离。但是,按照以下网站的建议进行操作并重新附加处理程序似乎可行。

http://www.geeksforgeeks.org/write-a-c-program-that-doesnt-terminate-when-ctrlc-is-pressed/

有点麻烦的是文档: http://en.cppreference.com/w/c/program/signal

声明 " 如果信号处理程序不是作为 abort 或 raise 的结果调用(换句话说,信号处理程序是异步的),则行为未定义,如果 信号处理程序调用标准库中的任何函数,除了 中止 _出口 快速退出 带有第一个参数的信号不是当前处理的信号的编号。 "

我认为这是因为我调用的信号的第一个参数与当前处理的信号的数量相同,所以我应该期待未定义的行为。这有点麻烦,这让我想知道是否还有其他选择。不过,目前这似乎可行。

【讨论】:

  • 如果您使用的是现代版本的 Visual Studio,从 control-C 信号处理程序调用运行时函数应该没有问题。但是,如果您担心,您可以选择使用原生 API 而不是 C 库。
  • 仅供参考,Windows 没有实现 POSIX 信号,所以这不是操作系统。控制台应用程序在从 conhost.exe 获得控制事件消息后,在 csrss.exe 远程启动的线程上注册由 kernel32!CtrlRoutine 调用的处理程序。微软的 C 运行时,如果使用的话,会注册一个处理程序来实现SIGINTSIGBREAK 信号,但你不能将SIGINT 发送到任意控制台进程。如果您连接到同一个控制台并且 Ctrl+C 未被禁用,则您可以在进程组(或所有进程)中触发 CTRL_C_EVENT
猜你喜欢
  • 2012-03-20
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 2016-01-08
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多