首先来看看这两个代码
1.
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<unistd.h>
#include<string.h>void test()
{size_t fd=open("log.txt",O_WRONLY | O_CREAT |O_TRUNC ,0666);dup2(3,1);printf("洁白 闪耀 奇迹 之花");fflush(stdout);close(1);
}int main()
{test();return 0;
}
2.
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<unistd.h>
#include<string.h>void test()
{size_t fd=open("log.txt",O_WRONLY | O_CREAT |O_TRUNC ,0666);dup2(3,1);printf("洁白 闪耀 奇迹 之花");//fflush(stdout);close(1);
}int main()
{test();return 0;
}
其实两个之间的差距就是将fflush注释的区别。
1.
2.
所以我们就能解释上面的现象了,我们将3重定向到一之后,stdout就变成普通文件,刷新的方式就是满刷新,而fflush就是用来刷新文件的缓冲区的,如果不刷新就关闭文件,自然的就不会刷新到文件级缓冲区,所以文件就没有以上的文字。
那我们再这样做呢
当然我们程序结束后,会自动刷新文件缓冲区,再将文件关闭。
我们将以下文件重定向文件
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<unistd.h>
#include<string.h>void test2()
{//C语言接口printf("hello printf\n");fprintf(stdout,"hello fprintf\n");const char*fw="hello fwrite\n";fwrite(fw,1,strlen(fw),stdout);//系统调用const char*w="hello write\n";write(1,w,strlen(w));fork();
}int main()
{test2();return 0;
}
我们发现如果我们正常运行则都会打印一次,但是当我们重定向到文件里边就会除了系统调用之外都会有两份。因为如果我们不重定向,则1是stdout,刷新方式是行刷新,遇到\n就刷新走了,fork后写实拷贝后也不会再有内容。重定向之后就变成了普通文件,刷新方式变成满刷新,当fork后,子进程也有一份没有刷新走的buff,所以有两份,但是write是系统调用,直接是刷新到内核级缓冲区,子进程的buff是不会再有write的。