2017-04-16 34 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; 
}