5

外部プログラムを実行するプログラムを作成しようとしています。

私は を捕まえることができることを知っていますstdout、そして私は一緒stdoutstderr捕まえることができますが、問題は を捕まえることができstderrますstdoutか?

たとえば、stderrin variableSTDERRstdoutin variableを意味しますSTDOUT。私はそれらを分離したいという意味です。

また、変数に外部プログラムの終了コードが必要です。

4

1 に答える 1

2

Windowsでは、標準ストリームをキャッチするSTARTUPINFOために入力する必要があり、関数を使用して終了ステータスを取得できます。標準ストリームを親プロセスにリダイレクトする方法の例がありますhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms682499.aspxCreateProcessGetExitCodeProcess

forkLinuxのような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);
}

詳細については、manページのpipedup2waitpidを参照してください。

于 2012-10-24T08:22:05.577 に答える