printf的缓冲机制,printf某些内容时,操作系统仅仅是把该内容放到了stdout的缓冲队列里了,并没有实际的写到屏幕上。但是,只要看到有\n, 则会立即刷新stdout,因此就马上能够打印。在这个例子中:
|
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(void) { printf("hello"); if(0==fork()) { printf(" child\n"); return 0; } printf(" parent\n"); }
运行结果: hello parent hello child |
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(void) { printf("hello\n"); if(0==fork()) { printf(" child\n"); return 0; } printf(" parent\n"); }
运行结果: hello parent child |
1、mian函数执行printf(“hello”)后, "hello"仅仅被放到了缓冲里,再运行到fork时,缓冲里面的 hello被子进程继承了,因此在子进程度stdout缓冲里面就也有了"hello"。所以,hello会分别会被父子进程各打印一次。
2、mian函数执行printf("hello\n")后,"hello" 被立即打印到了屏幕上(因为有\n),之后fork到的子进程里的stdout缓冲里不会有"hello"内容,因此hello只会被父进程打印一次。