3

コードで子プロセスを作成しています。fork()を呼び出すと、子プロセスは次のステートメントから実行を開始する必要がありますが、私のコードでは、子プロセスはfork呼び出しの前にステートメントを実行します。

#include<stdio.h>
int main()
{
int pid;
FILE *fp;
fp = fopen("oh.txt","w");
fprintf(fp,"i am before fork\n");
pid = fork();
        if(pid == 0)
        {
                fprintf(fp,"i am inside child block\n");
        }
        else{
                fprintf(fp,"i inside parent block\n");
        }
fprintf(fp,"i am inside the common block to both parent and child\n");
fclose(fp);
return 0;
}

これは私が得る出力です

出力:

i am before fork
i inside parent block
i am inside the common block to both parent and child
i am before fork
i am inside child block
i am inside the common block to both parent and child

「iambeforefork」という行は、ファイルに1回書き込む必要がありますが、子と親によって2回書き込まれます。なぜそうなのですか?

ありがとうございました。

4

2 に答える 2

5

これはおそらくバッファリングの問題です。fprintfすぐにファイルに書き込むことはありませんが、出力をバッファリングします。するとfork、バッファのコピーが2つになります。

fflush(fp)フォークする前に実行してみて、それで問題が解決するかどうかを確認してください。

于 2013-02-20T16:17:35.103 に答える
3

これは、を使用して印刷するとfprintf、バッファリングされますが印刷されないためです。その後、バッファがフラッシュされると、子プロセスで印刷されます。

于 2013-02-20T16:17:29.303 に答える