如何检测 Created Exe 创建的另一个 exe 是不是关闭?

Posted

技术标签:

【中文标题】如何检测 Created Exe 创建的另一个 exe 是不是关闭?【英文标题】:How to detect Created Exe's created another exe is closed?如何检测 Created Exe 创建的另一个 exe 是否关闭? 【发布时间】:2020-11-07 16:39:48 【问题描述】:

例如,我们在 windows 上有 2 个可执行文件。 (EXE_1.exe, EXE_2.exe)

EXE_1.exe 正在使用参数调用 EXE_2.exe。我想检测 EXE_2 何时关闭(终止、杀死等)

我不能在 C++ 中使用 WaitForSingleObject 或在 python 中使用 Psutil 进程等待。因为它在 First 可执行文件关闭时返回。 (记住:第一个exe启动第二个exe并关闭自己)

所以我需要一个函数,它返回一个名为 exe 的函数,称为 exe 的 pid 或类似的东西。

我在 C++ 中尝试了 GetChildProcessID,它可以工作,但它返回 CMD.exe 的 pid。没关系,如果我检查这个 cmd exe;当它关闭时,这意味着我创建的第二个 exe 太关闭了。但我正在寻找第二个 exe 的 pid。

【问题讨论】:

How do I wait until all processes in a job have exited?。关键是,一旦进程附加到作业,它创建的所有进程默认也附加到该作业(除非将CREATE_BREAKAWAY_FROM_JOB 传递给CreateProcess,并且可以将作业配置为禁止这样做)。 【参考方案1】:
info = subprocess.STARTUPINFO()
info.dwFlags = subprocess.STARTF_USESHOWWINDOW
info.wShowWindow = EmreWin32Con.SW_MINIMIZE
EXE = subprocess.Popen([EXE_KONUM], cwd=KLASOR_KONUM_EXE,
                                    creationflags=subprocess.CREATE_NO_WINDOW, 
                                    startupinfo=info, stderr=subprocess.DEVNULL,
                                    stdout=subprocess.DEVNULL,
                                    shell=False)
def GetChildProcessIDList(pid):
    prc = psutil.Process(pid)
    return prc.children(recursive=True)


Childrens = GetChildProcessIDList(EXE.pid)
isCmd = False
for chcmd in Childrens:
    if chcmd.name() == "cmd.exe":
        isCmd=True
        Childrens.remove(chcmd)
        break
# variable Childrens: list of process created process PID's.

【讨论】:

以上是关于如何检测 Created Exe 创建的另一个 exe 是不是关闭?的主要内容,如果未能解决你的问题,请参考以下文章

检测文件是不是在批处理文件中打开

如何仅在计算机视觉中的另一个检测到的对象(y)内检测对象(x)?

如何使用 PDFkit 检测滚动到 PDF 中的另一个页面

利用jvisualvm.exe搞一个关于生产者消费者的另一些纠结的问题

如果用户从 IdentityServer4 中的另一个浏览器/设备登录,如何检测并从应用程序中注销用户?

如何从 Linux 中的另一个进程触发一个进程?