Python 如何发送CTRL+;C/SIGINT到windows中的子进程?
我用Python 如何发送CTRL+;C/SIGINT到windows中的子进程?,python,windows,signals,Python,Windows,Signals,我用Popen打开了一个子流程。当我在主程序中按下CTRL+C时,我的子进程关闭得很好,我为SIGINT和SIGTERM注册了处理程序。但是:当我尝试手动发送SIGINT时,它会引发一个信号不受支持错误。发送SIGTERM会立即终止我的子进程。当我执行handle.terminate()时,我的子进程也会死掉 我需要它优雅地关闭。我搜索了又搜索,没有找到任何可以复制按下CTRL+C的行为的东西 我能做些什么来实现我想要的吗 如标题所述,我使用的是windows(7 64位,python 3.4.
Popen
打开了一个子流程。当我在主程序中按下CTRL+C
时,我的子进程关闭得很好,我为SIGINT
和SIGTERM
注册了处理程序。但是:当我尝试手动发送SIGINT
时,它会引发一个信号不受支持
错误。发送SIGTERM
会立即终止我的子进程。当我执行handle.terminate()
时,我的子进程也会死掉
我需要它优雅地关闭。我搜索了又搜索,没有找到任何可以复制按下CTRL+C
的行为的东西
我能做些什么来实现我想要的吗
如标题所述,我使用的是windows(7 64位,python 3.4.5)
//编辑:
我还尝试发送
CTRL\u C\u事件
,这是可能的,但不能注册为子流程中的信号处理程序CTRL\u C\u事件
和CTRL\u BREAK\u事件
是控制台控制事件,而不是POSIX信号。控制台控制事件起源于控制台主机进程(conhost.exe),并由会话Windows服务器(csrss.exe)通过在每个进程中注入一个线程(在已知入口点kernel32开始执行)中继到连接到给定控制台的进程!CtrlRoutine
。这将执行通过SetConsoleCtrlHandler
注册的处理程序列表。C运行时安装了一个处理程序,分别为CTRL\u C\u事件
和CTRL\u BREAK\u事件
调用其SIGINT
和SIGBREK
处理程序。您可以通过GenerateConsolecLevent
向连接到当前控制台的其他进程发送控制事件,这就是Pythonos.kill
调用的CTRL\u C\u事件
和CTRL\u BREAK\u事件
。(对于它调用的所有其他值TerminateProcess
),它以进程组为目标。组ID 0将事件广播到连接到控制台的所有进程。要创建新组,请将creationflags=create_new_PROCESS_group
传递到subprocess.Popen
。组ID是根进程的PID。CREATE\u NEW\u process\u group
标志导致禁用Ctrl+C。它必须在子进程中通过SetConsoleCtrlHandler(NULL,FALSE)
手动启用。但是,不能禁用Ctrl+Break,因此您可以始终将Ctrl\u Break\u事件
发送到进程组。有关详细信息,请参阅我的回答。Ctrl\u C\u事件
和Ctrl\u Break\u事件
是控制台控制事件,而不是POSIX信号。控制台控制事件起源于控制台主机进程(conhost.exe),并由会话Windows服务器(csrss.exe)通过在每个进程中注入一个线程(在已知入口点kernel32开始执行)中继到连接到给定控制台的进程!CtrlRoutine
。这将执行通过SetConsoleCtrlHandler
注册的处理程序列表。C运行时安装了一个处理程序,分别为CTRL\u C\u事件
和CTRL\u BREAK\u事件
调用其SIGINT
和SIGBREK
处理程序。您可以通过GenerateConsolecLevent
向连接到当前控制台的其他进程发送控制事件,这就是Pythonos.kill
调用的CTRL\u C\u事件
和CTRL\u BREAK\u事件
。(对于它调用的所有其他值TerminateProcess
),它以进程组为目标。组ID 0将事件广播到连接到控制台的所有进程。要创建新组,请将creationflags=create_new_PROCESS_group
传递到subprocess.Popen
。组ID是根进程的PID。CREATE\u NEW\u process\u group
标志导致禁用Ctrl+C。它必须在子进程中通过SetConsoleCtrlHandler(NULL,FALSE)
手动启用。但是,不能禁用Ctrl+Break,因此您可以始终将Ctrl\u Break\u事件
发送到流程组。有关详细信息,请参阅我的答案。