fork()调用时,整个父进程空间会原模原样复制到子进程中,包括指令、变量值、程序调用栈、环境变量和缓冲区等等。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int i;
for (i=0; i<1; ++i) {
fork();
printf("A");
printf("%d", i);
//fork();
//fflush(stdout);
//printf("\n");
}
return 0;
}
输出结果:
A0A0
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int i;
for (i=0; i<1; ++i) {
fork();
printf("A");
printf("%d", i);
//fork();
fflush(stdout);
//printf("\n");
}
return 0;
}
输出结果:
A0A0
程序遇到"\n"、EOF、缓冲区满、文件描述符关闭、或者主动flush、或是程序退出就会把数据刷出缓冲区。
注意:标准输出是行缓存,所以遇到"\n"时会刷出缓冲区,但是对于磁盘这个块设备来说,"\n"并不会引起缓冲区刷出的动作,那是全缓冲,可以使用setvbuf设置缓冲区大小,或者用fflush刷缓存。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int i;
for (i=0; i<2; ++i) {
fork();
printf("A");
printf("%d", i);
//fork();
//fflush(stdout);
//printf("\n");
}
return 0;
}
输出结果:
A0A1A0A1A0A1A0A1
fork()之后,print打印A0放在缓存区中,等i=1时在fork()缓存区中的值被复制到两个子进程中了,就多了两次A0打印。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int i;
for (i=0; i<3; ++i) {
printf("A");
printf("%d", i);
sleep(1);
//fflush(stdout);
//printf("\n");
}
return 0;
}
虽然延时一秒,但是缓存区不刷新,所有的值是一起最后输出的。