有没有一种方法可以调用CreateProcess,使得杀死父进程会自动杀死子进程?
也许可以使用创建进程标志?
编辑
解决方案是创建作业对象,将父进程和子进程都放入作业对象中。当父进程被杀死时,子进程也会被杀死。我从这里获得了代码:
在父进程被杀死时杀死子进程
请注意@wilx的评论中继承句柄的问题。
有没有一种方法可以调用CreateProcess,使得杀死父进程会自动杀死子进程?
也许可以使用创建进程标志?
编辑
解决方案是创建作业对象,将父进程和子进程都放入作业对象中。当父进程被杀死时,子进程也会被杀死。我从这里获得了代码:
在父进程被杀死时杀死子进程
请注意@wilx的评论中继承句柄的问题。
Neil 在 这里 推荐使用作业(Job)的方式。通过在作业(Job)对象上使用 SetInformationJobObject()
方法,将 JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
设置为 true,即可使子进程随父进程关闭而结束。当父进程退出或结束时,作业对象句柄会关闭。要实现该功能,必须确保子进程未继承作业对象句柄。如果您还想跟踪孙子进程,则需要创建挂起的子进程、将其添加到作业对象中,然后再让它们运行。
最好的方法是将这两个进程放在同一个任务中,这样杀死任务也会杀死这两个进程。
TerminateJobObject
来杀死作业对象中的其他进程。 - Jerry CoffinTerminateJobObject
。但我认为调试器方法更加简洁。 - Jerry CoffinWaitForMultipleObjects(Ex)
。SIGHUP
(但它可以处理该信号并实现任何行为)。在Linux上,孤儿进程的父PID会更改为1(init)。System.Diagnostics.Process
类,并在调用 Process.Start
时使用 “RedirectStandardInput” 选项。 - Ben VoigtCreateProcess
,我相信你正在启动子进程。 - Ben Voigt一种不同的方法
并非在所有情况下都有用,但我有一个特定的场景,其中一个应用程序完全控制了一个子进程。为了进行通信和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;
}
我想 DEBUG_PROCESS
或者 DEBUG_ONLY_THIS_PROCESS
可以作为一种几乎意外的副作用来实现这个功能。不过,Windows 并不像类 Unix 系统那样按照树形结构创建进程。
WaitForDebugEvent
和ContinueDebugEvent
,以便子进程可以运行直到您决定终止它。 - Jerry Coffin