4 Stimmen

Ausführen des Shell-Befehls und Lesen seiner Ausgabe in einem C-Programm

Ich versuche, eine Funktion zu erstellen, die einen Shell-Befehl als Argument nimmt, mit fork einen neuen Prozess erstellt, der den Befehl ausführt. Ich möchte auch die Standardausgabe des Befehls umleiten, damit der Aufrufer der Funktion sie mit einem FILE*-Zeiger lesen kann.

static FILE* runCommand(char* command){
    int pfd[2];

    if(pipe(pfd)<0)     
        return NULL;

    if(pid=fork()==0){ //Kindprozess
        close(pfd[0]);
        dup2(pfd[1],1); //Ausgabe zum Schreiben in Pipe umleiten

        execlp(command,(char*)0);
    }

    close(pfd[1]);

    //hier einen Dateizeiger/-descriptor zurückgeben?

}

Ich bin mir nicht sicher, wie ich einen Dateizeiger zurückgeben kann, der zum Lesen der Ausgabe des Befehls verwendet werden kann. Ist das der richtige Weg, einen Befehl in der Shell auszuführen?

ps. Ich habe über popen gelesen, aber aus einem guten Grund kann ich es nicht verwenden, sodass ich diese Funktionalität selbst implementieren muss.

Danke

4voto

Anomie Punkte 89467

Ein Fehler in diesem Code ist, dass Sie einer Variablen pid zuweisen, die nirgendwo deklariert ist. Und pid wird immer 1 im Elternprozess sein, da der Code wie geschrieben äquivalent ist zu pid=(fork()==0) statt (pid=fork())==0.

Sie sollten auch pfd[1] nach dem dup2-Aufruf schließen. Und zur Sicherheit sollten Sie auch Fehler von dup2 und execlp überprüfen.

Die Antwort auf Ihre eigentliche Frage ist die Verwendung von fdopen.

1voto

sjr Punkte 9659

Verwenden Sie fdopen, um einen vorhandenen Dateideskriptor mit einem FILE *-Objekt zu verknüpfen. Alles andere sieht ziemlich gut aus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X