2016-04-06 11 views
0

Ich versuche, einen Shell-Befehl aus einem C-Programm auszuführen.Return Exec-Ausgabe aus dem Programm über Parameter-Referenz

Dafür habe ich eine Wrapper-Funktion erstellt, die den Exit-Code des Befehls selbst zurückgibt und eine Parameter-Referenzvariable verwendet, um die tatsächliche Ausgabe des Programms zurückzugeben.

Die exec-Funktion Wrapper sieht wie folgt aus:

int _exec(const void *command, char **result) { 
    FILE *fp; 
    char path[1035]; 
    char *eof; 

    /* Open the command for reading. */ 
    fp = popen(command, "r"); 
    if (fp == NULL) { 
     return -1; 
    } 

    while((eof = fgets(path, sizeof(path), fp)) != NULL); 

    /* Fill the parameter reference */ 
    *result = strdup(path); 

    /* close */ 
    pclose(fp); 
    return 0; 
} 

Der anrufende Teil wie folgt aussieht:

int result = 0; 
char *tmp; 

result =_exec("ls /", &tmp); 
printf("%s", tmp); 

Leider gibt es in der anrufenden Teil, wenn ich printftmp, ist es nur die letzte Zeile enthält der Befehlsausgabe.

Irgendeine Idee, was ich falsch mache? Wie kann ich alle Zeilen int *result und damit in tmp bekommen?

Antwort

2

Verwenden Sie fread anstelle von fgets. fgets stoppt das Lesen mit jedem Newline-Zeichen, aber Sie speichern alle Zeilen an den ersten Positionen Ihres path-Puffers. Außerdem müssen Sie die Anzahl der bereits vorhandenen Bytes unter path verfolgen und die Daten bei jedem Aufruf der Lesefunktion in die erste unbenutzte Position in path speichern.

+0

Wenn ich 'fread' versuche, funktioniert es überhaupt nicht:' fread (* result, 1, sizeof (char *), fp); ' – lockdoc

+0

Lesen Sie die" fread "-Dokumentation um zu wissen, was als Parameter übergeben werden soll. Der erste wird wie zuvor "Pfad" sein. In 'count' übergeben Sie die Größe Ihres Puffers,' sizeof (path) '; Es wird nicht über das Zeilenende hinaus gelesen. Eigentlich brauchen Sie die 'while' Schleife nicht, als würde sie nicht alle Daten lesen, Ihr Puffer ist sowieso voll. – atturri

+0

Woher weiß ich, welche Arraygröße ich vor dem Lesen zum Pfad deklarieren muss? – lockdoc