1

子プロセスの IO をリダイレクトするプログラムを作成しました。私が抱えている問題は、新しい stdout と stderr がファイルに直接書き込まれておらず、代わりにメモリにバッファリングされていることです。setvbuf を使用してこれを修正しようとしましたが、うまくいきませんでした。

関数が返されてもエラーは発生しません。

以前の実装でバッファリングを削除していたので、これはかなりイライラしますが、どういうわけかファイルを失いました。いずれにせよ、setvbuf で問題が解決しない理由がわかりません。

if (!freopen(DBGD_CHILD_STDOUT, "w", stdout)){
    perror ("Couldn't open new child-stdout");
    exit (-1);
}

if (!freopen(DBGD_CHILD_STDERR, "w", stderr)){
    perror ("Couldn't open new parent-stderr");
    exit (-1);
}

if (setvbuf (stdout, 0, _IONBF, 0)){
    perror ("Couldn't change buffering mode of stdout");
    exit (-1);
}

if (setvbuf (stderr, 0, _IONBF, 0)){
    perror ("Couldn't change buffering mode of stderr");
    exit (-1);
}

if (execv (ProcessArgs[0], &ProcessArgs[1]) < 0){
    perror ("Couldn't execute process");
    exit (-1);
}
4

1 に答える 1

0

あなたの説明と小さなコード チャンクから実際に何が起こっているかを伝えるのは困難です。

ただし、以前にバッファリングを変更しようexecvとしても効果はありません。これは、プロセスが libc stdio 状態を含めて全体として置き換えられるためです。代わりに、実行された子プロセスのバッファリングを変更する必要があります。

子を制御しない場合は、 で実行できますstdbuf

于 2013-05-24T08:29:51.477 に答える