6

fork()親で行われたリダイレクトが子にも適用されるかどうかを確認するために、リダイレクトを実験していました。次の簡単なプログラムを書きました

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main ()
{
    freopen( "error.txt", "w+t", stdout ); // From now on, stdout = error.txt
    printf (" ERROR!  WHY DONT U UNDERSTAND?\n");
    if ( fork() == 0 ) 
    {   
        printf(" I AM CHILD\n");
        exit(0);
    }   
    else-
    {   
        printf (" EITHER I AM A PARENT OR SOMETHING GOT SCREWED\n");
    }   


    return 0;
}

私が得た出力(error.txt)は

ERROR!  WHY DONT U UNDERSTAND?
EITHER I AM A PARENT OR SOMETHING GOT SCREWED
ERROR!  WHY DONT U UNDERSTAND?
I AM CHILD

が呼び出されるずっと前に表示され、親によって 1 回だけ印刷されるべきであるにもかかわらず、驚くべきことに、ERROR! WHY DONT U UNDERSTAND?2 回印刷されます。fork()

誰でもこれに光を当てることができますか?

4

4 に答える 4

10

reopenストリームが非インタラクティブであるため、完全にバッファリングされ、 でフラッシュされません'\n'。が呼び出される前forkはバッファにまだメッセージが含まれており、forkこのバッファされたメッセージが複製された後 (両方のプロセスが の独自のコピーを取得したためstdout)、親と子の両方によってフラッシュされます。C 標準のパート 7.19.3 を参照してください。

fflush直前に呼び出すことで、このような動作を回避できますfork

于 2012-05-22T10:31:03.207 に答える
3

バッファリングが原因です。のfflush直後に実行しprintfます。

stdio両方のプロセスはの内部の同じコピーで終了し、両方とも でそれをフラッシュしexitます。_exit子供を呼べば、それを防ぐこともできます。

于 2012-05-22T10:29:43.293 に答える
1

バッファをフラッシュすると問題が解決します。print ステートメントの直後に fflush を使用します。

于 2012-05-22T10:31:03.433 に答える
0

ERROR! WHY DONT U UNDERSTANDはフォーク後もバッファリングされており、両方のプロセスによって書き込まれているようです。

追加すると

fflush(stdout);

printf()最初の内部バッファがフラッシュされた直後に、ファイルに一度だけ表示されます。

于 2012-05-22T10:33:48.563 に答える