有没有办法调用CreateProcess,以便杀死父进程会自动杀死子进程?
也许使用Create Process Flags?
修改的
解决方案是创建一个作业对象,将父级和子级放在作业对象中。当父母被杀后,孩子被杀。我从这里得到了代码:
Kill child process when parent process is killed
请注意@ wilx关于继承句柄的评论。
答案 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_PROCESS
或DEBUG_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);