Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何发送CTRL+;C/SIGINT到windows中的子进程?_Python_Windows_Signals - Fatal编程技术网

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
向连接到当前控制台的其他进程发送控制事件,这就是Python
os.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
向连接到当前控制台的其他进程发送控制事件,这就是Python
os.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事件
发送到流程组。有关详细信息,请参阅我的答案。