2017-04-16 10 views
0
#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main(void) { 
    write(STDOUT_FILENO,"1",1); 
    if(fork() > 0) { 
     write(STDOUT_FILENO,"2",1); 
     write(STDOUT_FILENO,"3",1); 
    } 
    else { 
     write(STDOUT_FILENO,"4",1); 
     write(STDOUT_FILENO,"5",1); 
    } 
    write(STDOUT_FILENO,"\n",1); 
    return 0; 
} 

出力は1 2 3 \n 4 5 \nCフォークは

なぜ私が交換した場合、すべてが同じように、私は1 2 3 \n 1 4 5 \nを取得write(STDOUT_FILENO,"1",1)==printf("1")のように(最後に改行文字なし)printfための関数を書くことということで、親のコピーです子はフォークの上の行をコピーしていますか?

答えて

0

はい、これは、この投稿Why does printf not flush after the call unless a newline is in the format string?のようにエンドラインに出会うまで、stdoutストリームがバッファされているためです。したがって、新しいプロセスを形成するとき、このバッファは、基本的にはその子のために新しいメモリ空間を作成しているので、子のstdoutバッファにコピーされます。これがうまくいくものです

(実際には非常に、Specifically, how does fork() handle dynamically allocated memory from malloc() in Linux?が表示されない)

#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
int main(void) { 

printf("1"); 
fflush(stdout); 
if(fork() > 0) { 
     printf("2"); 
     printf("3"); 
} else { 
     printf("4"); 
     printf("5"); 

} 
printf("\n"); 
return 0; 
} 
関連する問題