我有一个测试工具(用Python编写),需要通过发送来关闭被测程序(用C语言编写)^C.在Unix上,
proc.send_signal(signal.SIGINT)
Run Code Online (Sandbox Code Playgroud)
工作得很好.在Windows上,会抛出错误("不支持信号2"或类似的东西).我正在使用Python 2.7 for Windows,所以我觉得我应该能够做到
proc.send_signal(signal.CTRL_C_EVENT)
Run Code Online (Sandbox Code Playgroud)
但这根本不起作用.我需要做什么?这是创建子进程的代码:
# Windows needs an extra argument passed to subprocess.Popen,
# but the constant isn't defined on Unix.
try: kwargs['creationflags'] = subprocess.CREATE_NEW_PROCESS_GROUP
except AttributeError: pass
proc = subprocess.Popen(argv,
stdin=open(os.path.devnull, "r"),
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
**kwargs)
Run Code Online (Sandbox Code Playgroud) 我想在用户点击CTRL-C之前运行特定代码.代码在Go中,我想使用Git Bash/MINGW64在Windows上运行它.使用Go,我做
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)
// some goroutines get started here
// ...
for {
select {
case <-interrupt:
// code which shall be run on CTRL-C
}
}
Run Code Online (Sandbox Code Playgroud)
在Windows上,当我使用Windows命令行时,这可以工作,但我希望它也适用于MINGW64/Git Bash.
我发现在/sf/answers/2238248981/上添加了
trap '' SIGINT
Run Code Online (Sandbox Code Playgroud)
到〜/ .bashrc捕获SIGINT信号并阻止bash终止我的程序.
这适用于MINGW32和bash版本
$ bash --version
GNU bash, version 3.1.20(4)-release (i686-pc-msys)
Copyright (C) 2005 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)
但它无法在MINGW64,bash版本上运行
$ bash --version
GNU bash, version 4.3.42(5)-release (x86_64-pc-msys)
Copyright (C) 2013 Free Software Foundation, Inc.
[...]
Run Code Online (Sandbox Code Playgroud)
MINGW64或新的(git)bash版本有什么不同?
为了便于测试,以下是查看行为差异的最小示例: …
经过这么多年的Linux巡航,我又回到了一个疯狂的Windows环境中.我使用Ipython,然后在git bash中启动它.我很难使用其他东西,因为环境配置为在我的办公室使用它.
所以,当我启动Ipython时,我错误地启动了一个无限循环,或者一些需要很长时间才能执行的错误代码,我使用了ctrl-c.
这会杀死Ipython,这很烦人.我没有找到任何办法来绕过这个或另一个可以做到这一点的关键.
任何想法都将受到高度赞赏.
谢谢一堆