【发布时间】: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 帮助我走上了正轨。我的猜测是某个调用过早地解除了信号处理程序的附加。我不知道它在哪里,但一定是这样
-
这很有意义。