2009-04-17 3 views
2

Ich entwickle ein Programm, das ein Programm mit Execvp ausführt. Es muss die Ergebnisse des untergeordneten Prozesses erfassen und im Hauptprozess analysieren. Es scheint, dass es einen Weg gibt, Named Pipes zu verwenden und zu dupen. Ich versuche ein gutes Beispiel dafür zu finden, aber bisher kein Glück. Wenn jemand irgendwelche Hinweise, Links und/oder Vorschläge dazu hat, würde ich es sehr schätzen.So erfassen Sie die Ausgabe von execvp

+0

Verwandte: [Befehlsausgabe in der Leitung bekommen, C für Linux] (http://stackoverflow.com/questions/219138/) – ephemient

Antwort

5

Sie benötigen keine Named Pipes; unbenannte Pfeifen funktionieren gut. Eigentlich können Sie oft einfach popen anstatt die pipe/fork/dup/exec selbst verwenden. popen funktioniert wie folgt (obwohl Ihre libc ‚s Implementierung hat wahrscheinlich mehr Fehlerprüfung):

FILE *popen(const char *command, const char *type) { 
    int fds[2]; 
    const char *argv[4] = {"/bin/sh", "-c", command}; 
    pipe(fds); 
    if (fork() == 0) { 
     close(fds[0]); 
     dup2(type[0] == 'r' ? 0 : 1, fds[1]); 
     close(fds[1]); 
     execvp(argv[0], argv); 
     exit(-1); 
    } 
    close(fds[1]); 
    return fdopen(fds[0], type); 
} 

Dies schafft eine unbenannte Rohr und fork s. Im Kind fügt er stdout (oder stdin) an einem Ende der Pipe an, dann exec s Kind. Der Elternteil kann einfach vom anderen Ende der Pipe lesen (oder schreiben).

+0

Großen. Ich habe überprüft, wie Pfeifen funktionieren und das sollte den Trick machen. –

+0

Nur für die Aufzeichnung, wenn jemand darauf stolpert. Die Bedingung, die auf dem Typ [0] basiert, ist nicht vollständig korrekt. Man muss die stdout/stdin schließen, bevor die dup2 möglich ist. Auch die Pipe ist unidirektional und das fds [1] ist das Schreibende, also müsste es die fds [0] in dup2 für den Lesefall sein. –

2

Kannst du nicht einfach popen() verwenden?

0

Hier ist ein einfaches Beispiel, das die Verwendung von Popen demonstriert, um Ihr Ziel zu erreichen. Nur etwas interessanter als "Echo" als Befehl setzen :)

#include <stdio.h> 

int main() 
{ 
    char buf[100]; 
    int i = 0; 
    FILE *p = popen("echo \"Test\"","r"); 
    if (p != NULL) 
    { 
     while (!feof(p) && (i < 99)) 
     { 
      fread(&buf[i++],1,1,p); 
     } 
     buf[i] = 0; 
     printf("%s",buf); 
     pclose(p); 
     return 0; 
    } 
    else 
    { 
     return -1; 
    } 
}