考虑以下程序:
main(){system("start /b batch.bat");}
我想稍后在程序中终止该批处理以及该批处理产生的任何进程-有什么想法吗?
答案 0 :(得分:1)
我想终止该批处理以及该批处理产生的任何进程
为此存在Job Objects:
作业对象允许将进程组作为一个单元进行管理。
要终止当前与作业对象关联的所有进程,请使用 TerminateJobObject函数。
if (HANDLE hJob = CreateJobObjectW(0, 0))
{
WCHAR ApplicationName[MAX_PATH];
if (GetEnvironmentVariableW(L"ComSpec", ApplicationName, RTL_NUMBER_OF(ApplicationName)))
{
PROCESS_INFORMATION pi;
STARTUPINFOW si = { sizeof(si) };
if (CreateProcessW(ApplicationName, L"cmd /c <some path>/batch.bat",
0, 0, 0, CREATE_SUSPENDED, 0, 0, &si, &pi))
{
if (AssignProcessToJobObject(hJob, pi.hProcess))
{
ResumeThread(pi.hThread);
}
else
{
TerminateProcess(pi.hProcess, 0);
}
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
}
// .. wait for something ...
TerminateJobObject(hJob, 0);
CloseHandle(hJob);
}
无论如何,可以通过远程com调用(例如StartService
)启动新的程序-正式地是从另一个过程启动的。这当然不会工作,也不会终止