popen() écrit la sortie de la commande exécutée pour le cout
Je suis en train d'écrire une application qui doit ouvrir un autre processus et d'obtenir la sortie de la. En ligne j'ai lu partout que j'ai utiliser popen
et de lire le fichier.
Mais je ne peux pas lire de lui. La sortie de la commande est de sortie dans la fenêtre de la console de l'application appelante. Ci-dessous le code que j'utilise. J'ai ajouté quelques impressions à déboguer.
#include <string>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <array>
int main()
{
//some command that fails to execute properly.
std::string command("ls afskfksakfafkas");
std::array<char, 128> buffer;
std::string result;
std::cout << "Opening reading pipe" << std::endl;
FILE* pipe = popen(command.c_str(), "r");
if (!pipe)
{
std::cerr << "Couldn't start command." << std::endl;
return 0;
}
while (fgets(buffer.data(), 128, pipe) != NULL) {
std::cout << "Reading..." << std::endl;
result += buffer.data();
}
auto returnCode = pclose(pipe);
std::cout << result << std::endl;
std::cout << returnCode << std::endl;
return 0;
}
La lecture n'est jamais réellement imprimé à la ma cout
et le résultat est une chaîne vide. Je vois clairement la sortie de la commande dans mon terminal. Si la commande sort normalement le comportement est comme prévu. Mais je ne capturer la sortie pour les cas d'erreur.
feof()
pour contrôler une boucle est une mauvaise pratique, et il est inutile dans votre cas puisque fgets()
retourne NULL
sur la fin du fichier. Essayez de fournir un un Minimum, Complètes et Vérifiables exemple que les gens peuvent utiliser pour recréer votre problème. Si vous ne savez pas quel est le problème, puis en fournissant des informations partielles que vous avez est un bon moyen de laisser de côté des informations essentielles. Il est tout à fait possible de la commande, vous êtes en cours d'exécution est l'utilisation d'un moyen de sortie qui n'est pas redirigeables b à l'aide de votre technique.Fourni complet exemple. J'ai littéralement juste ajouté int main et a ajouté une codé en dur de commande...
OriginalL'auteur John Smith | 2017-06-18
Vous devez vous connecter pour publier un commentaire.
Popen ne pas capturer la sortie stderr seulement stdout. Rediriger stderr vers stdout résout le problème.
OriginalL'auteur John Smith
Vous devez ajouter "2>,&1" à la fin de la chaîne de commande
il y a un exemple complet https://www.jeremymorgan.com/tutorials/c-programming/how-to-capture-the-output-of-a-linux-command-in-c/
OriginalL'auteur Антон М