2016-08-15 7 views
1

私はいくつかの新しいプロセスをfork()/ exec()する必要のあるデーモンプロセスを持っています。デーモン内のexec()プロセスからstdout/stderrを読み込みます

私の問題は、親がstdoutとstderrが閉じているデーモンだということです。これを行うためにとにかくありますか?シェルを開く必要がありますか?

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

_「シェルを開く必要はありますか?」_いいえ、代わりにパイプを作成してください。 –

+0

私にも同様の問題があります。残念ながら、 'system()'関数を使用しているので、あなたが示唆したようにパイプを使用することはできません。 'stdout'をテンポラリファイルの正しい代替にリダイレクトしていますか? –

答えて

0

シェルはとにかく助けにならないでしょう。 pipe()を使用してdup()(または同様のもの)とclose()を使用して、適切なファイル記述子を配置するために、1つ以上のパイプを作成する必要があります(stdout/stderrを1つのストリームに結合するかどうかによって異なります)。 pipe()へのコールはfork()に先行し、dup()close()のコールが後に来ます。

+0

私はすでにこれをやっています。コードスニペットの編集を見てください。 – devin

+0

@devin:あなたは十分なパイプファイル記述子を閉じていません。 'dup()'または 'dup2()'を標準入力、標準出力、または標準エラーに変換する場合、パイプの両端を本質的に常に閉じるべきです。すべきではない状況に遭遇するまで、そうしなければならないと思います。すぐには起こらないでしょう。 –

+0

親のパイプを閉じます(編集を参照)。子供のためにそれを閉じる方法はありますか?私はexec()がエラーがなければ返さないという印象を受けていますので、どうすればこのようにするのか分かりません。 – devin

関連する問題