2010-02-14 6 views
4

Possible en double: quelqu'un
How can I run an external program from C and parse its output?comment capturer résultat du système() en C/C++

Salut,

Pourriez s'il vous plaît nous dire comment capturer un résultat lorsque exécution de la fonction system()?

En fait, j'ai écrit un programme C++ qui affiche l'adresse IP de la machine, appelée "ipdisp" et je veux quand un programme sever exécute ce programme ipdisp, le serveur capte l'adresse IP d'affichage. Alors, est-ce possible? si oui, comment?

Merci pour vos réponses

+0

Été demandé et répondu à plusieurs reprises. Un exemple: http://stackoverflow.com/questions/43116/how-can-i-run-an-external-program-from-c-and-parse-its-output – dmckee

+0

Désolé je ne savais pas quand je écrit la question, je n'ai pas vu les questions connexes. Merci! – make

Répondre

6

Oui, vous pouvez le faire, mais vous ne pouvez pas utiliser system(), vous devrez utiliser popen() à la place. Quelque chose comme:

FILE *f = popen("ipdisp", "r"); 
while (!feof(f)) { 
    // ... read lines from f using regular stdio functions 
} 
pclose(f); 
+0

merci beaucoup! juste pour clarifier s'il vous plaît. la variable affichée est par exemple (char * xx1;) alors comment pouvons-nous obtenir xx1? Merci encore! – make

+0

En supposant que 'ipdisp' écrit sa sortie sur stdout, vous pourrez lire sa sortie standard via le fichier' f' ci-dessus. Utilisez 'fgets' ou similaire. –

+0

merci! En fait, j'ai deux variables: hostname et ipaddress et je veux capte l'adresse ipaddress. est le stdout prend le dernier affiché? merci encore – make

1

Greg n'est pas tout à fait correct. Vous pouvez utiliser le système, mais c'est une très mauvaise idée. Vous pouvez utiliser le système en écrivant la sortie de la commande dans un fichier temporaire, puis en lisant le fichier ... mais popen() est une bien meilleure approche. Par exemple:

 
#include <stdlib.h> 
#include <stdio.h> 
void 
die(char *msg) { 
    perror(msg); 
    exit(EXIT_FAILURE); 
} 

int 
main(void) 
{ 
    size_t len; 
    FILE *f; 
    int c; 
    char *buf; 
    char *cmd = "echo foo"; 
    char *path = "/tmp/output"; /* Should really use mkstemp() */ 

    len = (size_t) snprintf(buf, 0, "%s > %s", cmd, path) + 1; 
    buf = malloc(len); 
    if(buf == NULL) die("malloc"); 
    snprintf(buf, len, "%s > %s", cmd, path); 
    if(system(buf)) die(buf); 
    f = fopen(path, "r"); 
    if(f == NULL) die(path); 
    printf("output of command: %s\n", buf); 
    while((c = getc(f)) != EOF) 
     fputc(c, stdout); 
    return EXIT_SUCCESS; 
} 

Il y a beaucoup de problèmes avec cette approche ... (portabilité de la syntaxe pour la redirection, laissant le fichier sur le système de fichiers, les problèmes de sécurité avec d'autres processus de lecture du fichier temporaire, etc., etc.)

Questions connexes