Tâche: Tuer automatiquement tous les processus enfants si le processus parent se termine. Les procédures parent peuvent être terminées non seulement de manière correcte, mais aussi en supprimant dans ProcessExplorer, par exemple. Comment puis-je le faire?Comment finit le processus fils lorsque le processus parent se termine en C#
Question similaire dans С topic conseils pour utiliser des objets de travail. Comment l'utiliser en C# sans exporter de DLL externe?
J'ai essayé d'utiliser des objets de travail. Mais ce code ne fonctionne pas correctement:
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 retourne avec l'erreur. GetLastError renvoie l'erreur 24. Cependant, PInvoke.AssignProcessToJobObject fonctionne et le processus enfant est ajouté à la file d'attente des tâches (je peux le voir dans ProcessExplorer). Mais, parce que PInvoke.SetInformationJobObject ne fonctionne pas - processus engendré rester en vie quand je tue un parent.
Qu'est-ce que j'ai de incorrect dans ce code?
Les autres questions me semblent bonnes, il suffit de faire un pinping des fonctions de kernel32. http://www.pinvoke.net/default.aspx/kernel32.assignprocesstojobobject –