Résumé: J'ai besoin d'un moyen de déterminer si un processus Windows que j'ai généré via _spawnl et que je communique avec les FD de _pipe est mort.Détection de la mort du processus engendré à l'aide de la fenêtre CRT
Détails:
J'utilise la fonction CRT bas niveau dans Windows (_eof, _read) pour communiquer avec un processus qui a été donné naissance via un appel à _spawnl (avec le P_NOWAIT) drapeau. J'utilise _pipe pour créer des descripteurs de fichiers pour communiquer avec ce processus engendré et transmettre ces descripteurs (le FD #) à la ligne de commande.
Il est important de mentionner que je ne contrôle pas le processus engendré. C'est une boîte noire pour moi.
Il s'avère que le processus que nous sommes en train de générer se bloque occasionnellement. J'essaie de rendre mon code robuste en détectant le crash. Malheureusement, je ne peux pas voir un moyen de le faire. Il me semble raisonnable de penser qu'un appel à _eof ou _read sur l'un de ces descripteurs retournerait un statut d'erreur (-1) si le processus était mort.
Malheureusement, ce n'est pas le cas. Il semble que les descripteurs ont une vie propre indépendamment du processus engendré. Donc, même si le processus à l'autre extrémité est mort, je n'obtiens aucun statut d'erreur sur le descripteur de fichier que j'utilise pour communiquer avec lui.
J'ai le PID pour le processus imbriqué (renvoyé par l'appel _spanwnl) mais je ne vois rien de ce que je peux faire avec ça. Mon code fonctionne vraiment bien sauf pour une chose. Je ne peux pas détecter si le processus engendré est simplement occupé à me calculer une réponse ou est mort.
Si je peux utiliser les informations de _pipe et _spawnl pour déterminer si le processus engendré est mort, je serai en or.
Suggestions très bienvenues.
Merci d'avance.
MISE À JOUR: J'ai trouvé une solution assez simple et l'ai ajoutée comme réponse sélectionnée.
Pour être clair, en fonctionnement normal, les pistes de processus donné naissance indéfiniment (pour des raisons pratiques). Donc, un appel à _cwait n'est pas bon. Je ne veux pas attendre jusqu'à ce qu'il se termine parce que, dans des circonstances normales, cela bloquerait mon programme. Je veux juste savoir * si * ça s'est terminé. –