2017-04-16 32 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 \nç叉父副本使用時的printf

這是爲什麼,如果我取代所有喜歡write(STDOUT_FILENO,"1",1)==printf("1")printf功能(不到底換行符)我得到1 2 3 \n 1 4 5 \n,像孩子正在複製叉子上方的線?

回答

0

是的,這是因爲stdout流被緩衝,直到它遇到一個endline根據這個職位Why does printf not flush after the call unless a newline is in the format string?。所以當你形成一個新的進程時,這個緩衝區會被複制到子進程的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; 
}