问题标签 [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.
perl - 将 SIGINT (^C) 发送到包含子级的 perl 脚本时会发生什么情况?
我有一个分叉的 Perl 脚本。
每个 fork 运行一个外部程序,解析输出,并将输出转换为 Storable 文件。
然后父级读取可存储文件,并分析来自每个子级的总数据,然后再继续重复前一个分叉,否则父级停止。
当我发出 ^C 而一些孩子仍在运行外部程序时,究竟会发生什么?父 perl 脚本在前台被调用,我想,尽管有分叉,它仍然在前台。
SIGINT是否传递给所有的孩子,即父母,父母的孩子,以及孩子们调用的外部程序?
更新:
我应该补充一点,当我发出 SIGINIT 时,我的脚本子级调用的外部程序似乎确认了信号并终止。但是孩子们,或者也许是家长计划,继续进行。这一切我都不清楚。
更新 2:
关于 tchrist 的注释,外部程序是用 Perl 的system()
命令调用的。
事实上,tchrist 的评论似乎也包含我正在寻找的解释。经过更多调试后,根据我的程序的行为,似乎确实 SIGINT 正在从父级传递给所有子级,并从所有子级传递给所有子级(外部程序)。
因此,根据 tchrist 的评论,似乎正在发生的事情是 CTRL-C 正在杀死导致孩子们离开system()
命令的外部程序 - 仅此而已。
虽然我让我的孩子检查了调用的退出状态system()
,但我假设 CTRL-C 会杀死父级以下的所有内容,而不是导致创建更多轮处理,这就是正在发生的事情! !
解决方案(我的问题):
我只需要在父级中为 SIGINT 创建一个信号处理程序。然后,信号处理程序会将 SIGTERM 发送给每个孩子(我想这也会向孩子的孩子发送 SIGTERM),然后让父母优雅地退出。尽管这个有点明显的解决方案可能会解决问题,但我想了解我对 SIGINT 与 Perl 中的分叉相关的行为的误解。
c++ - 如何处理 SIGINT?
当我在程序中捕获 SIGINT 信号时,如何安全地清理资源?在信号处理函数中不可能调用delete
运算符,因为我不知道如何释放使用new
运算符创建的资源。
有任何想法吗?
python - Python:如何防止子进程接收 CTRL-C / Control-C / SIGINT
我目前正在为在 shell 中运行的专用服务器开发一个包装器。包装器通过子进程生成服务器进程,并观察其输出并对其做出反应。
必须明确地给专用服务器一个命令以正常关闭。因此,CTRL-C 不能到达服务器进程。
如果我在 python 中捕获 KeyboardInterrupt 异常或覆盖 SIGINT 处理程序,服务器进程仍会收到 CTRL-C 并立即停止。
所以我的问题是:如何防止子进程接收 CTRL-C / Control-C / SIGINT?
erlang - 如何在 Erlang 中处理 SIGINT?
感谢 Google 和大量教程,我知道如何在 Java、Python、Ruby、Perl 和 Lisp 中创建自定义信号处理程序。我在网上找不到如何在 Erlang 中为 SIGINT、SIGTERM、HUP 等创建处理程序。
java - 使用 ganymed SSH2 发送 SIGINT CTRL-C?
我需要杀死一个我已经开始使用 ganymed SSH2 的进程。具体来说,我想优雅地使用Ctrl+杀死它C。我已经看到尝试发送 ASCII 的想法,\x03
但是在使用 execCommand() 时它不会使用转义字符。如何通过 ganymed发送Ctrl+ SIGINT?C
如果我应该使用另一个 Java SSH 应用程序,请告诉我,我已经研究了 Jsch、sshj,但发现 ganymed ssh2 是最简单的。
我要杀死的程序是 tethereal (wireshark)
linux - 如何阻止 Ctrl-C 使用 jruby 杀死生成的进程?
我有一个 ruby 程序,产生新的进程。即使我按下 Ctrl-C,我也希望它们能在它们的父级中存活下来。为此,我尝试捕获 INT,但是,这无济于事。
下面的程序在每次按下回车时启动一个 xeyes,如果你写任何东西就退出,如果你按下 Ctrl-C 然后返回应该退出。
- 如果我以正常方式退出,xeyes 会幸存下来。
- 如果我按 Ctrl-C,xeyes 就会死掉。
- 跟踪 xeyes,它确实收到了 SIGINT,而不是建议的 SIGHUP。
我该怎么做才能让我的 xeyes 活着?
该程序:
我也一直在使用 ruby 进行测试,但是由于我需要仅适用于 jruby 的 JMX 支持,因此我不能按原样使用 ruby。以下方式适用于红宝石:
'Process setsid' 似乎确保没有控制终端,我怀疑这是中心。但是,即使使用 -J-Djruby.fork.enabled=true 标志,我也无法让 jruby 接受分叉。
bash - 无法在后台 shell 中捕获 SIGINT 信号
在子/后台进程中运行时,我无法捕获信号。
这是我的简单 bash 脚本:
当运行这个和以后做
一切都按预期工作,它打印trapped
并退出。
现在,如果我从这样的父脚本启动相同的脚本:
然后孩子不再捕获信号......?
更改为使用 SIGTERM 而不是 SIGINT 后,它似乎工作正常......?
c++ - 调试时的信号
我正在用 C++ 在 Linux 上开发一个应用程序(实际上是一个服务/守护程序),它需要与一个硬件接口。如果我的程序在终止时没有完全释放这些硬件的资源,那么我必须重新加载设备驱动程序,这个过程大约需要 10 分钟,并且由于明显的原因必须在每次测试程序之间等待 10 分钟令人沮丧。
所以我使用该sigaction()
函数来捕获一个 SIGINT(一个 ctrl-c),以便我的程序在完成后可以干净地关闭。从控制台运行程序时,这工作正常。但是,在 Netbeans 或 Eclipse(我都尝试过)中进行调试时,事情不起作用。
- 在 Eclipse 中,如果我在它提供的控制台中按 ctrl-c,它似乎并没有注册 SIGINT 曾经发生过
- 在 Eclipse 中,如果我在调试模式下运行程序然后使用
kill -SIGINT <pid>
,程序就会中断,就好像遇到断点一样 - 当我在控制台中按 ctrl-c 时,Netbeans 实际上似乎意识到已经发送了一个信号,并弹出一个对话框询问我是否要将其转发给应用程序。单击“转发并继续”似乎只是破坏了程序并且应用程序没有收到信号。它还说我可以在 Debug -> Dbx configure 中配置这些东西,这是一个不存在的菜单项
- 在 Netbeans 中,如果我在调试模式下运行程序然后使用
kill -SIGINT <pid>
,则行为与上述相同 kill
然后我添加了一个 SIGQUIT 处理程序,并尝试在 Netbeans 中调试时通过发送它。这一次,没有对话框出现,信号处理程序也永远不会被触发。
我需要一些方法来在调试时干净地关闭我的应用程序。有任何想法吗?
c - 在多线程程序中捕获 SIGINT
我正在编写一个多线程程序,我想在其中处理Ctrl-C来自用户的可能命令以终止执行。据我所知,不能保证能够取消每个工作线程的主线程会捕捉到信号。因此,是否有必要对工作线程的代码使用不同的信号处理程序,以便任何人在信号到达时都能捕捉到信号,或者是否有另一种方法可以仅在主线程的代码中使用信号处理程序?
ruby - Thin 不响应 SIGINT 或 SIGTERM
bundle exec thin start -p 3111
给出以下输出:
使用机架适配器瘦 Web 服务器(v1.2.11 代号 Bat-Shit Crazy)最大连接数设置为 1024 监听 0.0.0.0:3111,CTRL+C 停止 ^C
Ctrl-C 不执行任何操作(SIGINT)。也不会杀死(SIGTERM)。
我发现了一些关于这种行为的参考,但没有解决方案。问题似乎出在 eventmachine(与最新的 Thin 捆绑)、ruby 1.9.2-r290 或 linux 内核(Ubuntu 10.4 LTS、2.6.38.3-linode32)中。
它发生在我的项目中,但没有发生在全新的 Rails 项目中。
参考: