L’exit de processus parent provoque le blocage du processus enfant

J’ai une paire de programmes de console Windows, parent écrit en C #, enfant écrit en C; le parent appelle l’enfant avec un nom de fichier comme argument, obtient la sortie, attend la sortie, appelle à nouveau avec le suivant dans une liste de fichiers de données, etc. Parcourir la liste complète des fichiers de données peut prendre plusieurs heures. Par conséquent, lors des tests, je souhaite généralement supprimer le processus parent avec ^ C, en déterminant si un processus enfant est toujours en cours d’exécution, s’il ne meurt pas à cause de cela, il devrait l’être. tué quelques secondes plus tard par la timer qu’il a réglée.

Ce qui se passe réellement, c’est que le processus parent se termine, je récupère la console, mais le processus enfant est toujours présent en arrière-plan, n’utilise aucun processeur et est suspendu de manière permanente jusqu’à ce qu’il soit tué par le gestionnaire de tâches. Pourquoi cela se produit-il et comment peut-on le prévenir?

Code d’appel du processus parent:

var worker = new Process() { StartInfo = new ProcessStartInfo("/ayane/ayane.exe", "-t=10 " + filename) { RedirectStandardError = true, RedirectStandardOutput = true, UseShellExecute = false, } }; worker.Start(); var output = worker.StandardOutput.ReadToEnd(); worker.WaitForExit(); 

Code enfant qui définit une timer pour tuer le processus s’il ne s’est pas terminé dans quelques secondes:

 static VOID CALLBACK timeout(PVOID a, BOOLEAN b) { ExitProcess(0); } 

  HANDLE timer = 0; CreateTimerQueueTimer(&timer, 0, timeout, 0, (DWORD)(time_limit * 1000), 0, 0); 

Mise à jour: J’ai essayé un test tout à l’heure où j’ai sorti les RedirectStandardOutput et RedirectStandardError donc ce n’est probablement plus une situation de canal, et le problème se produit toujours de la même manière, de sorte qu’il ne semble pas que la redirection soit cassée des tuyaux après tout.