问题标签 [sigint]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
14905 浏览

python - 向 Eclipse 控制台中运行的程序发送 SIGINT (Ctrl-C)

我已经在 Eclipse 中设置了运行配置,需要将 SIGINT ( Ctrl+ C) 发送到程序。在 SIGINT 之后运行的程序中有清理代码,因此按 Eclipse 的“终止”按钮将不起作用(我认为它们会发送 SIGKILL)。在控制台中输入CTRL+C也不起作用。

如何将 SIGINT 发送到在 Eclipse 控制台内运行的进程?

(FWIW 我正在运行一个 Twisted 守护程序,需要 Twisted 正确关闭,这只发生在 SIGINT 上)

0 投票
3 回答
2565 浏览

python - 为什么我的线程/多处理 python 脚本没有正确退出?

我有一个服务器脚本,我需要能够干净地关闭它。在测试通常的try..except陈述时,我意识到这Ctrl-C不是通常的方式。通常我会像这样包装长时间运行的任务

所以任务可以干净地关闭Ctrl-C。我以前从未遇到过任何问题,但不知何故,当我遇到Ctrl-C这个特定脚本运行时,脚本只是退出而没有捕获Ctrl-C.

初始版本是使用Processfrom实现的multiprocessingThread我使用from重写了脚本threading,但同样的问题在那里。我以前用过threading很多次,但我是multiprocessing图书馆的新手。无论哪种方式,我以前从未经历过这种Ctrl-C行为。

通常我总是实现哨兵等以有序的方式关闭Queues和实例,但是这个脚本只是退出而没有任何响应。Thread

最后,我也尝试过signal.SIGINT像这样覆盖

这里Ctrl+C实际上被捕获了,但是处理程序没有执行,它从不打印任何东西。

除了threading/multiprocessing方面,部分脚本还包含C++ SWIG对象。我不知道这是否与它有关。我在 OS X Lion 上运行 Python 2.7.2。

所以,有几个问题:

  1. 这里发生了什么?
  2. 我该如何调试呢?
  3. 为了了解根本原因,我需要学习什么?

请注意:脚本的内部是专有的,所以我不能给出代码示例。然而,我非常愿意接收指针,所以我可以自己调试它。我有足够的经验,能够弄清楚是否有人能指出我正确的方向。

编辑:我开始注释掉导入等,看看是什么导致了奇怪的行为,我把它缩小到一个C++ SWIG库的导入。有什么想法为什么要导入C++ SWIG库“窃取” Ctrl-C?然而,我不是有罪图书馆的作者,我的 SWIG 经验有限,所以真的不知道从哪里开始......

编辑 2:我刚刚在 Windows 机器上尝试了相同的脚本,并且在 Windows 7 中Ctrl-C按预期捕获。我不会真的去打扰 OS X 部分,无论如何脚本都会在 Windows 环境中运行。

0 投票
2 回答
2642 浏览

python - 使用 ^C/KeyboardInterrupt 在子线程中中断 Python raw_input()

在多线程 Python 程序中,一个线程有时会使用内置的raw_input()请求控制台输入。我希望能够在 raw_input 提示符下通过在 shell 中键入 ^C 来关闭程序(即,使用 SIGINT 信号)。但是,当子线程正在执行 raw_input 时,键入 ^C 什么都不做——直到我按下回车键(离开 raw_input)才引发 KeyboardInterrupt。

例如,在以下程序中:

在输入完成之前,键入 ^C 不会执行任何操作。但是,如果我们只是调用T().run()(即单线程情况:只在主线程中运行 raw_input),^C 会立即关闭程序。

据推测,这是因为 SIGINT 被发送到主线程,主线程被挂起(等待 GIL),而分叉线程在控制台读取时阻塞。在 raw_input 返回后,主线程在获取 GIL 之前不会执行其信号处理程序。(如果我对此有误,请纠正我——我不是 Python 线程实现方面的专家。)

有没有办法以类似 raw_input 的方式从标准输入读取,同时允许 SIGINT 由主线程处理,从而降低整个过程?

[我在 Mac OS X 和一些不同的 Linux 上观察到上述行为。]


编辑:我错误地描述了上面的潜在问题。在进一步的调查中,阻止信号处理的是主线程的调用join():Guido van Rossum 自己已经解释过 join 中的底层锁获取是 uninterruptible。这意味着信号实际上被推迟到整个线程完成 - 所以这实际上与所有无关raw_input(只是后台线程阻塞以便连接没有完成的事实)。

0 投票
0 回答
1052 浏览

c# - 使用 Console.CancelKeyPress 的 Mono 应用程序无法在后台运行

我在 Linux 下的 Mono 中有一个控制台应用程序,它使用 Console.CancelKeyPress 来监听SIGINT. 但是,此应用程序拒绝在后台运行,因为它总是立即停止。

这是一个简化的示例:

如果我尝试在 bash 下在后台运行此应用程序,结果如下:

我不得不再次按回车键才能看到“已停止”消息,但它会立即发生。如您所见,它永远不会到达Console.WriteLine呼叫。

如果我尝试SIGINT使用发送kill(应该结束进程,因为处理程序未设置e.Canceltrue),则在我使用 恢复进程之前什么都不会发生fg,此时它会立即结束(它永远不会进入处理程序)。

如果我在前台启动进程,然后用 中断它ctrl-z并使用bg,它会再次立即停止,只有这一次如果我发送SIGINT然后用 恢复它fg,处理程序会被调用。

如果我删除Console.CancelKeyPress事件处理程序分配,该过程在后台运行就好了。

我正在使用 Mono 2.10.8 和 Debian 6.0.2。

如果一切都失败了,我可以复制我需要使用的功能Mono.Unix.UnixSignal,但如果有人对此有解决方案,我肯定想听听。

更新:Console.CancelKeyPress对于我的目的,似乎还有另一个问题。我将使用nohup因此输入不是控制台而是 /dev/null 来运行我的进程。在这种情况下,Mono 永远不会触发CancelKeyPress事件,即使您使用kill. UnixSignal是的,那么。

0 投票
0 回答
161 浏览

perl - Perl 5.14.2 中 SIGINT 处理程序中的 Perl 的 getc 问题

这是我的测试环境:

代码片段:

运行程序后,首先打印“5678”,然后等待输入,然后输入“eeee”,然后输入“ctrl-c”,然后处理程序连续打印“1234”和“4444”,并跳过处理程序中的getc函数,然后它挂起等待输入(我猜它是仍在等待输入的处理程序之外的getc),我输入“q”,它打印“q”。

所以我的问题是:

  1. 为什么处理程序中的 getc 函数不起作用?在其他 perl 版本中似乎不存在该问题。
  2. 如何解决处理程序中的getc函数工作?
0 投票
4 回答
2251 浏览

lisp - (通用)lisp 中的 Unix 信号处理

我已经对这个主题进行了一些研究,并且出现了空白。在 Common Lisp 中似乎有一些依赖于实现的方式来处理 Unix 信号,但是是否有一个包可以提供一种交叉实现的信号处理方式?

我主要想收听 SIGINT 并在我的应用程序中正常关闭。我在 linux 上使用 Clozure CL 1.7 ......就像提到的那样,这对于一个包来说会很棒,但如果我不得不求助于特定于实现的代码,那很好。

我也没有完全同意使用 SIGINT(尽管它很理想)。如果需要,我可以使用另一个信号。

如果这会变得一团糟,是否有人对从应用程序外部优雅地关闭 lisp 应用程序有任何其他建议?我的一个想法是创建一个应用程序监视的文件,如果它检测到该文件,它就会关闭......不过有点hacky。

谢谢!

0 投票
2 回答
2433 浏览

cygwin - Ctrl-c 停止在 cygwin 中工作

Ctrl-c (SIGINT/SIGTERM) 在 cygwin 中停止工作。如果我记得,这可能与 TTY 设置有关。请告知如何让它再次工作。我没有故意改变任何东西

stty -a 的输出:

当按下 ctrl-c 时,cmd 窗口的标题从 Select~ 变为 ~。Ctrl-c 也中断程序执行但不创建新行。

我也在会话 ssh-agent 上运行

我认为这可能会通过重新启动计算机来解决,但如果您有任何想法,请告诉我。

0 投票
2 回答
3966 浏览

c++ - signal() 覆盖其他信号处理程序

该函数是否会signal()覆盖进程可能设置的其他信号调用?即,如果一个SIGINT处理程序已由一个进程设置,并且一个 DLL 调用signal(SIGINT,xxx)来处理它自己的终止代码,那么原始SIGINT处理程序会被禁用吗?

0 投票
2 回答
3211 浏览

linux - 为什么Linux在按Ctrl+C时总是输出“^C”?

我一直在研究 Linux 中的信号。我已经做了一个测试程序来捕获 SIGINT。

虽然输出如下所示:

我知道当按下 Ctrl+C 时,前台进程组中的进程都会收到一个 SIGINT(如果没有进程选择忽略它)。

那么shell(bash)和上述程序的实例是否都收到了信号?每个“Oops”之前的“^C”来自哪里?

操作系统是 CentOS,外壳是 bash。

0 投票
3 回答
4627 浏览

c - 在 SIGINT 上释放分配内存的最佳实践

我有一个简单的程序,它使用select类似的东西来复用 IO。为了中断“服务器”进程,我集成了一个对SIGINT
做出反应的 sig_handler 。

每次分配内存时,包含方法都会释放自身或调用方法。

使用valgrind显示,有一些分配没有被释放。
也许不需要它,但我想了解处理信号的最佳方法。按STRG + C
时 似乎free没有调用调用。 所以用中断条件退出循环是没有意义的,这是我的第一种方法。

在关闭整个程序之前,有没有可能清理所有东西?

感谢您的任何提示和建议。