gpt4 book ai didi

Python - Windows - 当 "unrelated"父进程死亡/崩溃时退出子进程

转载 作者:太空宇宙 更新时间:2023-11-03 14:25:33 28 4
gpt4 key购买 nike

经过一些研究,对于如何让子进程了解父进程在 Windows 下已死亡/崩溃/退出这可以使子进程在无人值守的情况下运行,没有明确的答案。有一些建议如下:

始终涉及已抚养 child 的已知 parent 。但在某些情况下, child 不知道自己是 child ,因为它不是作为 child 而被怀上的,而且 parent 也没有努力杀死 child 。

此外,父级无法控制。实际案例:

  • Cygwin 在 Windows 下运行
  • Windows Python 路径中的第一个
  • 通过 setuptools entry_points 工具安装 Python 可执行文件。

如上所述,要执行的Python是Windows Python。 setuptools 生成的可执行文件将找到它并使用相关脚本将其作为子进程执行。

由于在 Cygwin 下运行,以下操作可能会失败:

  • Ctrl-c 将终止父级( stub setuptools 可执行文件)
  • 但会让子进程继续运行(在进程列表中以 python.exe 形式找到)

在这种情况下,如上所述,无法控制父级,并且子级也不知道它是子级(因为它也可能直接作为Python脚本执行)

最佳答案

解决办法如下

import sys

def win_wait_for_parent(raise_exceptions=False):
if not sys.platform == 'win32':
return True

# When started under cygwin, the parent process will die leaving a child
# hanging around. The process has to be waited upon
import ctypes
from ctypes.wintypes import DWORD, BOOL, HANDLE
import os
import threading

INFINITE = -1
SYNCHRONIZE = 0x00100000

kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)

kernel32.OpenProcess.argtypes = (DWORD, BOOL, DWORD)
kernel32.OpenProcess.restype = HANDLE

kernel32.WaitForSingleObject.argtypes = (HANDLE, DWORD)
kernel32.WaitForSingleObject.restype = DWORD

phandle = kernel32.OpenProcess(SYNCHRONIZE, 0, os.getppid())

def check_parent():
# Get a token with right access to parent and wait for it to be
# signaled (die). Exit ourselves then
kernel32.WaitForSingleObject(phandle, INFINITE)
os._exit(0)

if not phandle:
if raise_exceptions:
raise ctypes.WinError(ctypes.get_last_error())

return False

threading.Thread(target=check_parent).start()
return True

如果进程的 PID 与等待父进程收到信号(死亡)的父进程的 PID 不同,则该进程在单独的线程中运行。这在Python 3.3下有效,其中os.getppid()实际上返回了window下父级的PID

它不需要修改父级,子级也不需要提前编码为子级,因为会检查线程必须在哪里运行或不运行。

-- 重构为函数并添加评论中的改进

关于Python - Windows - 当 "unrelated"父进程死亡/崩溃时退出子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47659570/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com