任务:如果父进程终止,自动终止所有子进程。例如,父进程不仅可以以正确的方式终止,还可以在ProcessExplorer中终止。 我该怎么办?父进程在C#中终止时如何终止子进程
类似的问题在С topic建议使用Job对象。如何在C#中使用它,而无需导出外部DLL?
我试图使用作业对象。但是这个代码不正常:
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不起作用 - 当我杀掉父亲时,衍生的过程保持活跃状态。
我在这段代码中有什么不正确的地方?
另一个问题的答案似乎对我很好,只是从kernel32中调用函数。 http://www.pinvoke.net/default.aspx/kernel32.assignprocesstojobobject – 2010-07-13 08:14:46