一、問題背景
大家可能會遇到這樣一種情況,自己編寫代碼的時候,主進程可能會創建很多子進程,但是此時主進程可能由於某種原因自己崩潰,或者認爲通過任務管理器結束掉,這時候子進程可能就會依舊存在。下面介紹一種方法可以讓到主進程無論什麼原因是掉以後子進程也跟着被殺死。
二、技術點
其實也很簡單,就是使用一個job內核對象。
三、代碼
#include <Windows.h>
int main(int argc, char* argv[])
{
STARTUPINFOA Sinfo;
PROCESS_INFORMATION pi;
ZeroMemory(&Sinfo, sizeof(Sinfo));
Sinfo.cb = sizeof(Sinfo);
ZeroMemory(&pi, sizeof(pi));
BOOL retVal = CreateProcessA("C:\\Windows\\SysWOW64\\notepad.exe",
"", NULL, NULL, FALSE,
0,
NULL, NULL, &Sinfo, &pi);
//創建一個job內核對象
HANDLE hd = CreateJobObjectA(NULL, "HelloWrold");
if (hd)
{
//設置job內核對象限制條件爲:當job對象關閉的時候,關閉其所有子進程
JOBOBJECT_EXTENDED_LIMIT_INFORMATION extLimitInfo;
extLimitInfo.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
retVal = SetInformationJobObject(hd,
JobObjectExtendedLimitInformation,
&extLimitInfo,
sizeof(extLimitInfo));
if (retVal)
{
//將進程加入到job容器中去。
if (pi.hProcess)
{
retVal = AssignProcessToJobObject(hd, pi.hProcess);
}
}
}
Sleep(10000);
return 0;
}