任务: 如果父进程终止,自动终止所有子进程。父进程可以不仅以正确的方式终止,还可以通过ProcessExplorer等工具强制终止。
在这个主题中有类似的问题建议使用作业对象(Job Objects)。如何在C#中使用它而不导出外部DLL?
我试过使用作业对象(Job Objects),但是下面的代码无法正常工作:
var job = PInvoke.CreateJobObject(null, null);
var jobli = new PInvoke.JOBOBJECT_BASIC_LIMIT_INFORMATION();
jobli.LimitFlags = PInvoke.LimitFlags.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
| PInvoke.LimitFlags.JOB_OBJECT_LIMIT_PRIORITY_CLASS
| PInvoke.LimitFlags.JOB_OBJECT_LIMIT_JOB_TIME
| PInvoke.LimitFlags.JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION
| PInvoke.LimitFlags.JOB_OBJECT_LIMIT_JOB_MEMORY;
var res = PInvoke.SetInformationJobObject(job, PInvoke.JOBOBJECTINFOCLASS.JobObjectBasicLimitInformation, jobli, 48);
if (!res)
{
int b = PInvoke.GetLastError();
Console.WriteLine("Error " + b);
}
var Prc = Process.Start(...);
PInvoke.AssignProcessToJobObject(job, Prc.Handle);
PInvoke.SetInformationJobObject返回错误。GetLastError返回错误代码24。但是,PInvoke.AssignProcessToJobObject可以工作,并且子进程已添加到作业队列中(在ProcessExplorer中可以看到)。但是,由于PInvoke.SetInformationJobObject无法正常工作,所以当我终止父进程时,生成的进程仍然存活。
我在这段代码中做错了什么?