2016-08-15 1 views
1

Ich habe einen Daemon-Prozess, wo ich fork()/exec() einige neue Prozesse und lesen Sie dann die untergeordneten Prozesse stdout/stderr.Lesen von stdout/stderr aus einem exec() 'ed-Prozess in einem Daemon

Mein Problem ist, dass der Eltern ein Daemon ist, wo Stdout und Stderr geschlossen sind. Gibt es das überhaupt, um das zu tun? Muss ich eine Shell öffnen?

int status; 
pipe(pipefd_stdout); 
pipe(pipefd_stderr); 

pid_t pid = fork(); 
if (pid == 0) 
{ 
    close(pipefd_stdout[0]); // close reading end in the child 
    close(pipefd_stderr[0]); // close reading end in the child 

    dup2(pipefd_stdout[1], 1); // send stdout to the pipe 
    dup2(pipefd_stderr[1], 2); // send stderr to the pipe 

    execvpe(cmd, (char**)args, (char**)env); 
} 
else 
{ 
    // parent ... 

    waitpid(pid, &status, 0); 

    close(pipefd_stderr[1]); 
    close(pipefd_stdout[1]); 
} 
+0

_ "Muss ich eine Shell öffnen?" _ Nein, bauen Sie stattdessen eine Pipe. –

+0

Ich habe ähnliches Problem. Leider kann ich Pipe nicht wie vorgeschlagen verwenden, da ich 'system()' Funktion verwende. Wird "stdout" in eine temporäre Datei umgelenkt? –

Antwort

0

Eine Shell würde hier sowieso nicht helfen. Sie müssen eine oder mehrere Pipes erstellen (abhängig davon, ob die Ausgabe nach stdout/stderr in einen Stream zusammengeführt werden soll oder nicht), indem Sie pipe() und dann dup() (oder ähnlich) und close() verwenden, um die entsprechenden Dateideskriptoren an ihren Platz zu setzen. Der Anruf an pipe() geht dem fork() voraus, die Anrufe nach dup() und close() kommen nach.

+0

Ich mache das bereits, siehe Codeausschnitt bearbeiten. – devin

+0

@devin: Sie schließen nicht genug Pipe-Dateideskriptoren. Wenn Sie 'dup()' oder 'dup2()' eine Pipe zu Standardeingabe, Standardausgabe oder Standardfehler verwenden, sollten Sie _both_ Enden der Pipe im Wesentlichen immer schließen. Angenommen, Sie sollten dies tun, bis Sie auf einen Umstand stoßen, bei dem Sie es nicht tun sollten - es wird nicht bald passieren. –

+0

Ich schließe die Pipe im Parent (siehe Bearbeiten). Gibt es eine Möglichkeit, es für das Kind zu schließen? Ich hatte den Eindruck, dass exec() nicht zurückkehren wird, wenn es nicht fehlerhaft ist, also bin ich mir nicht sicher, wie ich das überhaupt machen würde. – devin

Verwandte Themen