外部プログラムを実行するプログラムを作成しようとしています。
私は を捕まえることができることを知っていますstdout
、そして私は一緒stdout
にstderr
捕まえることができますが、問題は を捕まえることができstderr
ますstdout
か?
たとえば、stderr
in variableSTDERR
とstdout
in variableを意味しますSTDOUT
。私はそれらを分離したいという意味です。
また、変数に外部プログラムの終了コードが必要です。
Windowsでは、標準ストリームをキャッチするSTARTUPINFO
ために入力する必要があり、関数を使用して終了ステータスを取得できます。標準ストリームを親プロセスにリダイレクトする方法の例がありますhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms682499.aspxCreateProcess
GetExitCodeProcess
fork
LinuxのようなOSでは、おそらくの代わりに使用したいと思うでしょうexecve
。フォークされたプロセスでの作業は別の話です。
WindowsおよびLinuxでは、ストリームのリダイレクトには一般的なアプローチがあります。複数のパイプ(ストリームごとに1つ)を作成し、子プロセスストリームをそのパイプにリダイレクトする必要があります。親プロセスは、そのパイプからデータを読み取ることができます。
Linuxのサンプルコード:
int fd[2];
if (pipe(fd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
pid_t cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (cpid == 0) { // child
dup2(fd[1], STDERR_FILENO);
fprintf(stderr, "Hello, World!\n");
exit(EXIT_SUCCESS);
} else { // parent
char ch;
while (read(fd[0], &ch, 1) > 0)
printf("%c", ch);
exit(EXIT_SUCCESS);
}
編集:別のプログラムからストリームをキャッチする必要がある場合は、上記と同じ戦略を使用し、最初fork
、2番目-パイプを使用し(上記のコードのように)、execve
次に子プロセスで別のプログラムを使用し、親プロセスでこのコードを使用して実行終了を待機しますリターンコードをキャッチします。
int status;
if (waitpid(cpid, &status, 0) < 0) {
perror("waitpid");
exit(EXIT_FAILURE);
}