Я наблюдаю, что при рекурсивной проверке идентификаторов дочерних процессов с помощью ManagementObjectSearcher я могу найти некоторый идентификатор процесса-потомка, который соответствует начальному родительскому процессу. Должно ли это быть возможным, если pid уникален для каждого экземпляра процесса? Это в Windows 7, код написан на C #.
Следующее вызывается с аргументом arg Process.GetCurrentProcess().Id
и предназначено для завершения всех процессов, порожденных им, но не самим собой.
private void KillSpawnedProcesses(int pid)
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ParentProcessID=" + pid);
ManagementObjectCollection moc = searcher.Get();
foreach (ManagementObject mo in moc)
{
if(mo["ProcessID"] != Process.GetCurrentProcess().Id)
{
KillSpawnedProcesses(Convert.ToInt32(mo["ProcessID"]));
try
{
Process proc = Process.GetProcessById(pid);
proc.Kill();
}
catch (ArgumentException)
{ /* process already exited */ }
}
else
{
//This line will occasionally be executed
Log("Don't kill current process");
}
}
}