CreateProcess使父进程被杀死时子进程被终止?

时间:2011-06-06 23:13:22

标签: c++ winapi process kernel32 win32-process

有没有办法调用CreateProcess,以便杀死父进程会自动杀死子进程?

也许使用Create Process Flags

修改
解决方案是创建一个作业对象,将父级和子级放在作业对象中。当父母被杀后,孩子被杀。我从这里得到了代码: Kill child process when parent process is killed 请注意@ wilx关于继承句柄的评论。

6 个答案:

答案 0 :(得分:8)

使用Neil says作业是恕我直言的最佳方式。通过使用JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE在作业对象上设置SetInformationJobObject(),可以在作业拥有进程终止时使子进程死亡。父进程退出/终止时,将关闭作业对象句柄。为此,必须由子进程继承作业句柄 。如果您还想跟踪祖母进程,那么您必须创建暂停的子进程,将它们添加到您的作业对象中,然后让它们运行。

答案 1 :(得分:5)

您可以做的最好的事情是将两个进程放在同一个作业中,这样就可以杀死这两个进程。

答案 2 :(得分:4)

您是否需要将子进程 kill ,或仅检测父进程退出以便它可以干净地终止?父进程可以为自己创建一个可继承的句柄,然后子进程可以将其与自己的对象一起传递给WaitForMultipleObjects(Ex)

如果子进程不是专门为此编写的,则可以将其stdin附加到管道,管道的另一端由父进程保存。如果父级死亡,管道将自动关闭。

这与Unix行为非常相似,其中一个子节点在其父节点死亡时不会被杀死,它通常会在响应SIGHUP时退出(但它可以处理该信号并实现任何行为)。在Linux上,孤儿的父PID更改为1(init)。

答案 3 :(得分:1)

我认为DEBUG_PROCESSDEBUG_ONLY_THIS_PROCESS这样做几乎是偶然的副作用。 Windows不像Unix类系统那样在树中创建进程。

答案 4 :(得分:1)

另一种方法

所有情况下无用,但我有一个特定的场景,即应用程序完全控制子进程。对于沟通和API拦截,需要DLL注入,因此DLL在实际子进程中运行以报告给父进程。

  

注意:现在,这不是创意奖。 这里的背景是:需要包装的应用程序,但这是一个遗留应用程序,既不能修改,也不能以令人满意的方式重写。我们需要保持这个系统运行,同时仍然拦截它的输出。

     

此外,子进程写得不好,立即再次启动然后终止,因此父进程实际上我们的主应用程序。

如果您控制子进程并且还有一个注入的DLL,您可以扩展此DLL 监视父进程以检查它是否正在运行。如果没有,ExitProcess

如果您在子进程中不需要DLL,其他解决方案很可能会好得多。

例如,您可以将parentProcessID传输到您的应用程序已使用的注册表项。或者,如果这不会破坏子进程,则可以传递命令行。

这必须在自己的线程中运行。我的DLL有两个线程:这里的代码和控制&沟通代码。

<强> DLL

bool IsProcessRunning(HANDLE hProcess)
{
    DWORD exitCode;
    GetExitCodeProcess(hProcess, &exitCode);
    return exitCode == STILL_ACTIVE;
}

bool WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpvReserved)
{
    if (fdwReason == DLL_PROCESS_ATTACH)
    {
        int parentProcessID = [...]

        HANDLE parentProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, TRUE, parentProcessID);
        while (IsProcessRunning(parentHandle)) Sleep(100);
        ExitProcess(0);
    }

    return true;
}

答案 5 :(得分:0)

不了解Windows,但这适用于linux: prctl(PR_SET_PDEATHSIG,SIGHUP);