Comment capturer le exit_code et le stderr de la commande qui est exécutée en C ++?
Je suis en train d'écrire un programme en c++ qui s'exécute et sorties (en temps réel) d'un script shell, makefile ou juste un autre programme. Cependant, je voudrais avoir mon programme de retour différemment quand il y a des erreurs ou pas d'erreur.
#include "execxi.h"
using namespace std;
int execXI::run(string command)
{
FILE *in;
char buff[512];
//is this the check for command execution exited with not 0?
if(!(in = popen(command.c_str(), "r"))){
//I want to return the exit code and error message too if any
return 1;
}
//this part echoes the output of the command that's executed
while(fgets(buff, sizeof(buff), in)!=NULL){
cout << buff;
}
pclose(in);
return 0;
}
est ce que j'ai jusqu'à présent.
Disons que ce script s'est exécuté make
de construire un programme et qu'il a donné une erreur comme
on_target_webkit_version out/Release/obj/gen/webkit_version.h
Traceback (most recent call last):
File "../build/webkit_version.py", line 107, in <module>
sys.exit(main())
File "../build/webkit_version.py", line 103, in main
return EmitVersionHeader(*sys.argv[1:])
File "../build/webkit_version.py", line 86, in EmitVersionHeader
webkit_revision = GetWebKitRevision(webkit_dir, version_file)
File "../build/webkit_version.py", line 60, in GetWebKitRevision
version_info = lastchange.FetchVersionInfo(
AttributeError: 'module' object has no attribute 'FetchVersionInfo'
make: *** [out/Release/obj/gen/webkit_version.h] Error 1
- Est-il possible pour moi de savoir que ce est arrêté avec l'erreur?
- Ne fait que sortir avec le code
else than 0
puisque c'est une erreur? - Est cette dernière partie imprimée en
stderr
?
- Ne fait que sortir avec le code
Considérant que make
terminé avec le code pas 0
disons 1
et la sortie en stderr
il n'est pas possible pour moi de saisir ces codes de sortie et le message d'erreur à la fin?
Comment puis-je capturer le code de sortie et stderr
après avoir affiché les résultats du programme, et le retour de la exit code
/stderr
dans la fonction?
source d'informationauteur Logan
Vous devez vous connecter pour publier un commentaire.
Si vous êtes intéressé par le code de l'erreur, c'est un portable moyen de l'obtenir, plutôt que de la division par 256:
Cependant,
popen
est une façon, donc, vous êtes à la création d'autres solutions de contournement par l'habitude de la redirection de style en coque, ou vous suivez ce code non testé pour le faire droite:Le code est ici:
http://jineshkj.wordpress.com/2006/12/22/how-to-capture-stdin-stdout-and-stderr-of-child-program/
Obtenu à partir de http://bytes.com/topic/c/answers/131694-pclose-returning-termination-status-command
Ma réponse serait
pclose(in)/256
est le code de sortie.Je ne sais toujours pas comment faire pour capturer la sortie stderr ou sdtout différemment, mais jusqu'à il y a une réponse que je vais accepter ce que ma réponse.
Merci pour la réponse sur le code de sortie de la Logan.
Je crois qu'un aller-retour pour obtenir stderr serait de le rediriger vers un fichier temporaire: