标签: sigint

126
推荐指数
3
解决办法
12万
查看次数

我可以向Windows上的应用程序发送ctrl-C(SIGINT)吗?

我已经(过去)编写跨平台(Windows/Unix的),其命令行启动时,处理用户输入的应用Ctrl- C以同样的方式组合(即彻底结束应用程序).

在Windows上是否可以从另一个(不相关的)进程发送Ctrl- C/ SIGINT /等效进程来请求它干净地终止(给它一个整理资源的机会等)?

windows signals sigint

83
推荐指数
8
解决办法
9万
查看次数

Python:如何防止子进程接收CTRL-C/Control-C/SIGINT

我目前正在为shell中运行的专用服务器开发包装器.包装器通过子进程生成服务器进程,并观察并响应其输出.

必须明确地为专用服务器提供一个命令才能正常关闭.因此,CTRL-C不得访问服务器进程.

如果我捕获KeyboardInterrupt异常或覆盖python中的SIGINT处理程序,服务器进程仍然会收到CTRL-C并立即停止.

所以我的问题是:如何防止子进程接收CTRL-C/Control-C/SIGINT?

python subprocess signals sigint keyboardinterrupt

40
推荐指数
4
解决办法
1万
查看次数

如果发出SIGINT或SIGSTP,是否会调用析构函数?

我有一个用户定义的析构函数的类.如果最初实例化了类,然后在程序运行时发出了SIGINT(在unix中使用CTRL + C),那么是否会调用析构函数?SIGSTP的行为是什么(unix中的CTRL + Z)?

c++ destructor sigint

34
推荐指数
3
解决办法
2万
查看次数

Python:Catch Ctrl-C命令.提示"真的想退出(y/n)",如果没有,则恢复执行

我有一个可能有长时间执行的程序.在主模块中,我有以下内容:

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 signals copy-paste sigint

34
推荐指数
2
解决办法
6万
查看次数

Ctrl-C和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)

unix sigint keyboardinterrupt

27
推荐指数
2
解决办法
2万
查看次数

将SIGINT(Ctrl-C)发送到在Eclipse控制台中运行的程序

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

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

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

python eclipse twisted sigint

25
推荐指数
1
解决办法
1万
查看次数

如何使用Express.js正确处理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正确终止.

显然,我在这里缺少一些基本的东西?

sigint node.js express

20
推荐指数
3
解决办法
1万
查看次数

Cygwin CTRL-C(信号中断)无法正常工作 - JVM Shutdown Hooks无法启动

我正在开发一个利用关闭挂钩的Java应用程序,以便清除程序的终止/中断,但我注意到Cygwin的CTRL-C实现似乎没有触发关闭挂钩.从表面上看,似乎已中断了该过程,将控制权交还给命令行,但是根本不会触发进程的"关闭"挂钩,因此不会发生清理.

在cmd中它们被捕获,但由于各种约束,我需要以某种方式让它们在Cygwin中工作.

有什么方法可以通过Cygwin在正在运行的进程中触发SIGINT,或者可能是我可以用来清理中断和终止的关闭挂钩的替代方法?

java cygwin interrupt sigint shutdown-hook

16
推荐指数
2
解决办法
4684
查看次数

使用自定义信号处理程序的PHP SIGINT不能杀死CURL

我有一个带有自定义关闭处理程序的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是不可杀死的?

php curl sigint

16
推荐指数
2
解决办法
837
查看次数