我已经(过去)编写跨平台(Windows/Unix的),其命令行启动时,处理用户输入的应用Ctrl- C以同样的方式组合(即彻底结束应用程序).
在Windows上是否可以从另一个(不相关的)进程发送Ctrl- C/ SIGINT /等效进程来请求它干净地终止(给它一个整理资源的机会等)?
我目前正在为shell中运行的专用服务器开发包装器.包装器通过子进程生成服务器进程,并观察并响应其输出.
必须明确地为专用服务器提供一个命令才能正常关闭.因此,CTRL-C不得访问服务器进程.
如果我捕获KeyboardInterrupt异常或覆盖python中的SIGINT处理程序,服务器进程仍然会收到CTRL-C并立即停止.
所以我的问题是:如何防止子进程接收CTRL-C/Control-C/SIGINT?
我有一个用户定义的析构函数的类.如果最初实例化了类,然后在程序运行时发出了SIGINT(在unix中使用CTRL + C),那么是否会调用析构函数?SIGSTP的行为是什么(unix中的CTRL + Z)?
我有一个可能有长时间执行的程序.在主模块中,我有以下内容:
import signal
def run_program()
...time consuming execution...
def Exit_gracefully(signal, frame):
... log exiting information ...
... close any open files ...
sys.exit(0)
if __name__ == '__main__':
signal.signal(signal.SIGINT, Exit_gracefully)
run_program()
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,但是我希望能够在捕获SIGINT时暂停执行,提示用户是否真的想要退出,如果他们决定不想退出,则继续在run_program()中停止.
我能想到这样做的唯一方法是在一个单独的线程中运行程序,保持主线程等待它并准备捕获SIGINT.如果用户想要退出主线程可以做清理并杀死子线程.
有更简单的方法吗?
我一直在调试一个Python程序,它在收到KeyboardInterrupt异常后会出现段错误.这通常是通过Ctrl+C从外壳按下来完成的.为了测试特定代码更改是否修复了错误,我有一个小的shell脚本,SIGINT在启动后随机时间发送到程序.我Ctrl+C遇到的问题是发送似乎对程序的影响不同于发送信号SIGINT,因此不会导致错误出现,所以我很想知道这两个动作之间的区别是什么.
该程序根本不捕获任何键盘操作,并且只是一个包含一些线程/进程的python程序.它不安装任何信号处理程序(虽然Python确实如此),并stty -a给出intr = ^C.我怀疑它可能是Ctrl+C发送SIGINT到所有子进程/线程而kill -INT只发送到主进程,但这是我的怀疑.
这是发送的shell脚本kill -INT.
wait
while :; do
seconds="$(python -c 'import random; print random.random()*4')"
./mandos --debug --configdir=confdir \
--statedir=statedir --no-restore --no-dbus &
pid=$!
{ sleep $seconds; kill -INT $pid; } &
fg %./mandos
status=$?
if [ $status -gt 1 ]; then
echo "Failed exit $status after $seconds seconds"
break
fi
wait
done
Run Code Online (Sandbox Code Playgroud) 我在Eclipse中设置了运行配置,需要将SIGINT(Ctrl+ C)发送到程序.在SIGINT之后运行的程序中有清理代码,因此按下Eclipse的"终止"按钮将不起作用(我认为它们发送SIGKILL).在控制台中键入CTRL+ C也不起作用.
如何将SIGINT发送到在Eclipse控制台内运行的进程?
(FWIW我正在运行Twisted守护程序并且需要Twisted才能正确关闭,这只发生在SIGINT上)
当我的Express.js服务被停止时,我需要做一些有用的事情SIGINT.使用Express.js版本3.0.6,我知道这应该工作:
var express = require('express');
var app = express();
var server = app.listen(3000);
process.on('SIGINT', function() {
console.log('Do something useful here.');
server.close();
});
Run Code Online (Sandbox Code Playgroud)
但是除非我发出SIGINT(Control- C)两次,否则这个过程不会给我回Bash提示符:
$ node problem.js
^CDo something useful here.
^CDo something useful here.
net.js:1046
throw new Error('Not running');
^
Error: Not running
at Server.close (net.js:1046:11)
at process.<anonymous> (/path/to/problem.js:8:10)
at process.EventEmitter.emit (events.js:93:17)
at SignalWatcher.startup.processSignalHandlers.process.on.process.addListener.w.callback (node.js:486:45)
$
Run Code Online (Sandbox Code Playgroud)
还有一点需要注意.如果我启动此Express.js服务并且不发送任何请求,则SIGINT正确终止.
显然,我在这里缺少一些基本的东西?
我正在开发一个利用关闭挂钩的Java应用程序,以便清除程序的终止/中断,但我注意到Cygwin的CTRL-C实现似乎没有触发关闭挂钩.从表面上看,似乎已中断了该过程,将控制权交还给命令行,但是根本不会触发进程的"关闭"挂钩,因此不会发生清理.
在cmd中它们被捕获,但由于各种约束,我需要以某种方式让它们在Cygwin中工作.
有什么方法可以通过Cygwin在正在运行的进程中触发SIGINT,或者可能是我可以用来清理中断和终止的关闭挂钩的替代方法?
我有一个带有自定义关闭处理程序的PHP命令行应用程序:
<?php
declare(ticks=1);
$shutdownHandler = function () {
echo 'Exiting';
exit();
};
pcntl_signal(SIGINT, $shutdownHandler);
while (true) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://blackhole.webpagetest.org');
curl_exec($ch);
curl_close($ch);
}
Run Code Online (Sandbox Code Playgroud)
如果我在进行CURL请求时使用Ctrl+ C终止脚本,则无效.命令只是挂起.如果我删除自定义关闭处理程序,Ctrl+ C立即杀死CURL请求.
为什么在定义SIGINT处理程序时CURL是不可杀死的?