Question

J'essaie d'écrire un programme qui exécute make.exe à partir de la distribution MinGW dans le répertoire courant et utilise ses données STDOUT et son code de sortie.J'ai un handle pour traiter STDOUT à partir duquel je récupère les données, créé avec CreatePipe.Lorsque j'obtiens un ERROR_HANDLE_EOF sur ce canal, je suppose que le processus est terminé et j'essaie d'obtenir son code de sortie :

if(session->pid == 0) return;
HANDLE hp = OpenProcess(PROCESS_QUERY_INFORMATION |
            PROCESS_TERMINATE, TRUE, session->pid);
if(hp == NULL) {
    printf("OpenProcess(%i) failed, error: %i\n",
        session->pid, (int)GetLastError());
    return;
}

Mon code fonctionne sur tous les autres utilitaires MinGW que j'ai testés (comme pwd, ls, etc.), j'obtiens le STDOUT et le code de sortie sans problème.Mais lorsque je l'essaye sur make, le code ci-dessus affiche le message suivant :

"OpenProcess (2032) a échoué, erreur :87"

J'ai recherché le code d'erreur 87 sur Google et il indique "Paramètre invalide".Je ne vois pas ce qui pourrait être invalide dans un identifiant de processus positif comme 2032.Des idées?

Était-ce utile?

La solution

Vous devez utiliser la poignée de CreateProcess à la place d'utiliser OpenProcess sur le PID.

OpenProcess ne fonctionne que si l'objet de processus existe toujours.Au moment où tu appelles OpenProcess si l'objet de processus a disparu, le résultat est un appel avec un paramètre invalide.

Le succès que vous avez obtenu avec d'autres utilitaires est dû soit à une condition de concurrence critique (qui peut échouer parfois), soit au fait que vous avez gardé le handle d'origine du processus enfant ouvert.

Autres conseils

Même si le post est ancien :J'ai remarqué que j'avais ERROR_INVALID_PARAMETER lorsque le processus existait, mais appartenait à un utilisateur différent et/ou à une session de bureau Windows et/ou de serveur de terminal.

Assez étrangement, le WTSEnumerateProcess() la fonction ne souffre pas de cette erreur, mais est beaucoup plus coûteuse, surtout sur un système qui est déjà sous forte charge avec de nombreux processus (et un appel à mes ressources même épuisées du noyau Windows).

Il n'est donc pas possible de fournir un "vrai" paramètre invalide et d'accéder aux erreurs.je me serais attendu ERROR_ACCESS_DENIED à la place (mais un gestionnaire de tâches invoqué en tant qu'utilisateur régulier/non élevé affiche toujours tous les processus).

Il y a des incohérences dans Windows ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top