56 votes

Capture optimale de stdout à partir d'une commande system ()

J'essaie de démarrer une application externe via system() - par exemple, system("ls") . Je voudrais capturer sa sortie au fur et à mesure afin que je puisse l'envoyer à une autre fonction pour un traitement ultérieur. Quelle est la meilleure façon de faire cela en C / C ++?

41voto

jkramer Points 7271

Du manuel popen:

 #include <stdio.h>

FILE *popen(const char *command, const char *type);

int pclose(FILE *stream);
 

8voto

wnoise Points 6448

EDIT: mal lu la question est de vouloir passer la sortie à un autre programme, pas d'autre fonction. popen() est presque certainement ce que vous voulez.

Le système vous donne un accès complet à la coque. Si vous souhaitez continuer à l'utiliser, vous pouvez rediriger la sortie vers un fichier temporaire, par system("ls > tempfile.txt"), mais le choix d'une fichiers temporaires sécurisés est une douleur. Ou, vous pouvez même la rediriger vers un autre programme: system("ls | otherprogram");

Certains recommandent le popen() de la commande. C'est ce que vous voulez si vous pouvez traiter la sortie vous-même:

FILE *output = popen("ls", "r");

qui vous donnera un pointeur de FICHIER, vous pouvez lire à partir de la sortie de la commande.

Vous pouvez également utiliser la pipe() pour créer une connexion en combinaison avec fork() pour créer de nouveaux processus, dup2() pour modifier l'entrée standard et la sortie de leur, exec() pour exécuter de nouveaux programmes, et wait() dans le programme principal à attendre pour eux. C'est tout simplement la mise en place du pipeline beaucoup comme le shell. Voir la pipe() de la page de manuel pour plus de détails et un exemple.

3voto

Will Points 30630

Les fonctions popen() et autres ne redirigent pas stderr et autres; J'ai écrit popen3() à cet effet.

1voto

shoosh Points 34322

Sous Windows, au lieu d'utiliser system (), utilisez CreateProcess, redirigez la sortie vers un tuyau et connectez-vous au tuyau.

Je suppose que c'est aussi possible d'une certaine manière POSIX?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X