问题标签 [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.
python - 向 Eclipse 控制台中运行的程序发送 SIGINT (Ctrl-C)
我已经在 Eclipse 中设置了运行配置,需要将 SIGINT ( Ctrl+ C) 发送到程序。在 SIGINT 之后运行的程序中有清理代码,因此按 Eclipse 的“终止”按钮将不起作用(我认为它们会发送 SIGKILL)。在控制台中输入CTRL+C也不起作用。
如何将 SIGINT 发送到在 Eclipse 控制台内运行的进程?
(FWIW 我正在运行一个 Twisted 守护程序,需要 Twisted 正确关闭,这只发生在 SIGINT 上)
python - 为什么我的线程/多处理 python 脚本没有正确退出?
我有一个服务器脚本,我需要能够干净地关闭它。在测试通常的try..except
陈述时,我意识到这Ctrl-C
不是通常的方式。通常我会像这样包装长时间运行的任务
所以任务可以干净地关闭Ctrl-C
。我以前从未遇到过任何问题,但不知何故,当我遇到Ctrl-C
这个特定脚本运行时,脚本只是退出而没有捕获Ctrl-C
.
初始版本是使用Process
from实现的multiprocessing
。Thread
我使用from重写了脚本threading
,但同样的问题在那里。我以前用过threading
很多次,但我是multiprocessing
图书馆的新手。无论哪种方式,我以前从未经历过这种Ctrl-C
行为。
通常我总是实现哨兵等以有序的方式关闭Queues
和实例,但是这个脚本只是退出而没有任何响应。Thread
最后,我也尝试过signal.SIGINT
像这样覆盖
这里Ctrl+C
实际上被捕获了,但是处理程序没有执行,它从不打印任何东西。
除了threading
/multiprocessing
方面,部分脚本还包含C++
SWIG
对象。我不知道这是否与它有关。我在 OS X Lion 上运行 Python 2.7.2。
所以,有几个问题:
- 这里发生了什么?
- 我该如何调试呢?
- 为了了解根本原因,我需要学习什么?
请注意:脚本的内部是专有的,所以我不能给出代码示例。然而,我非常愿意接收指针,所以我可以自己调试它。我有足够的经验,能够弄清楚是否有人能指出我正确的方向。
编辑:我开始注释掉导入等,看看是什么导致了奇怪的行为,我把它缩小到一个C++ SWIG
库的导入。有什么想法为什么要导入C++ SWIG
库“窃取” Ctrl-C
?然而,我不是有罪图书馆的作者,我的 SWIG 经验有限,所以真的不知道从哪里开始......
编辑 2:我刚刚在 Windows 机器上尝试了相同的脚本,并且在 Windows 7 中Ctrl-C
按预期捕获。我不会真的去打扰 OS X 部分,无论如何脚本都会在 Windows 环境中运行。
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
(只是后台线程阻塞以便连接没有完成的事实)。
c# - 使用 Console.CancelKeyPress 的 Mono 应用程序无法在后台运行
我在 Linux 下的 Mono 中有一个控制台应用程序,它使用 Console.CancelKeyPress 来监听SIGINT
. 但是,此应用程序拒绝在后台运行,因为它总是立即停止。
这是一个简化的示例:
如果我尝试在 bash 下在后台运行此应用程序,结果如下:
我不得不再次按回车键才能看到“已停止”消息,但它会立即发生。如您所见,它永远不会到达Console.WriteLine
呼叫。
如果我尝试SIGINT
使用发送kill
(应该结束进程,因为处理程序未设置e.Cancel
为true
),则在我使用 恢复进程之前什么都不会发生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
是的,那么。
perl - Perl 5.14.2 中 SIGINT 处理程序中的 Perl 的 getc 问题
这是我的测试环境:
代码片段:
运行程序后,首先打印“5678”,然后等待输入,然后输入“eeee”,然后输入“ctrl-c”,然后处理程序连续打印“1234”和“4444”,并跳过处理程序中的getc函数,然后它挂起等待输入(我猜它是仍在等待输入的处理程序之外的getc),我输入“q”,它打印“q”。
所以我的问题是:
- 为什么处理程序中的 getc 函数不起作用?在其他 perl 版本中似乎不存在该问题。
- 如何解决处理程序中的getc函数工作?
lisp - (通用)lisp 中的 Unix 信号处理
我已经对这个主题进行了一些研究,并且出现了空白。在 Common Lisp 中似乎有一些依赖于实现的方式来处理 Unix 信号,但是是否有一个包可以提供一种交叉实现的信号处理方式?
我主要想收听 SIGINT 并在我的应用程序中正常关闭。我在 linux 上使用 Clozure CL 1.7 ......就像提到的那样,这对于一个包来说会很棒,但如果我不得不求助于特定于实现的代码,那很好。
我也没有完全同意使用 SIGINT(尽管它很理想)。如果需要,我可以使用另一个信号。
如果这会变得一团糟,是否有人对从应用程序外部优雅地关闭 lisp 应用程序有任何其他建议?我的一个想法是创建一个应用程序监视的文件,如果它检测到该文件,它就会关闭......不过有点hacky。
谢谢!
cygwin - Ctrl-c 停止在 cygwin 中工作
Ctrl-c (SIGINT/SIGTERM) 在 cygwin 中停止工作。如果我记得,这可能与 TTY 设置有关。请告知如何让它再次工作。我没有故意改变任何东西
stty -a 的输出:
当按下 ctrl-c 时,cmd 窗口的标题从 Select~ 变为 ~。Ctrl-c 也中断程序执行但不创建新行。
我也在会话 ssh-agent 上运行
我认为这可能会通过重新启动计算机来解决,但如果您有任何想法,请告诉我。
c++ - signal() 覆盖其他信号处理程序
该函数是否会signal()
覆盖进程可能设置的其他信号调用?即,如果一个SIGINT
处理程序已由一个进程设置,并且一个 DLL 调用signal(SIGINT,xxx)
来处理它自己的终止代码,那么原始SIGINT
处理程序会被禁用吗?
linux - 为什么Linux在按Ctrl+C时总是输出“^C”?
我一直在研究 Linux 中的信号。我已经做了一个测试程序来捕获 SIGINT。
虽然输出如下所示:
我知道当按下 Ctrl+C 时,前台进程组中的进程都会收到一个 SIGINT(如果没有进程选择忽略它)。
那么shell(bash)和上述程序的实例是否都收到了信号?每个“Oops”之前的“^C”来自哪里?
操作系统是 CentOS,外壳是 bash。
c - 在 SIGINT 上释放分配内存的最佳实践
我有一个简单的程序,它使用select
类似的东西来复用 IO。为了中断“服务器”进程,我集成了一个对SIGINT
做出反应的 sig_handler 。
每次分配内存时,包含方法都会释放自身或调用方法。
使用valgrind
显示,有一些分配没有被释放。
也许不需要它,但我想了解处理信号的最佳方法。按STRG + C
时
似乎free
没有调用调用。
所以用中断条件退出循环是没有意义的,这是我的第一种方法。
在关闭整个程序之前,有没有可能清理所有东西?
感谢您的任何提示和建议。