重定向
重定向就是把一个文件中的内容转换到另一个文件中
重定向的现象
代码:
#include
#include
#include
#include
#include
int main()
{
close(1);
int fd=open("file3",O_WRONLY|O_CREAT,0644);
if(fd<0)
{
perror("open");
exit(1);
}
printf("fd=%d\n",fd);
fflush(stdout);
close(fd);
return 0;
}
运行结果:
结果为什么没有输出显示器上,而输入到了文件file3中呢?
printf()函数是C库当中的IO函数,,一般往stdout中输出,但是stdout底层
访问文件的时候还是fd:1,但此时,fd=1下标所示内容,已经变成了file3的地
址,不再是显示器文件的地址,所以,输出的任何消息都会往文件中写入,进而完
成输出重定向
重定向的实现
1.
代码:
#include
#include
#include
#include
int main()
{
const char *msg0="hello printf\n";
const char *msg1="hello fwrite\n";
const char *msg2="hello write\n";
printf("%s",msg0);
fwrite(msg1,strlen(msg1),1,stdout);
write(1,msg2,strlen(msg2));
return 0;
}
2.
代码:
#include
#include
#include
#include
int main()
{
const char *msg0="hello printf\n";
const char *msg1="hello fwrite\n";
const char *msg2="hello write\n";
printf("%s",msg0);
fwrite(msg1,strlen(msg1),1,stdout);
write(1,msg2,strlen(msg2));
fork();
return 0;
}
3.把缓冲区内容用fflush()刷新之后:
代码:
#include
#include
#include
#include
int main()
{
const char *msg0="hello printf\n";
const char *msg1="hello write\n";
printf("%s",msg0);
fprintf(stdout,"hello fprintf\n");
write(1,msg1,strlen(msg1));
fflush(stdout);//刷新缓冲区
fork();
return 0;
}
1.一般C函数写入文件时是全缓冲的,而写入显示器是行缓冲
2.printf和fwrite函数会自带缓冲区,当发生重定向到普通文件时,数据的
缓冲方由行缓冲变成了全缓冲,所以缓冲区中的数据,不会被立即刷新,在fork
之后,也不会被刷新,但是在进程退出之后,会被统一刷新,写入文件当中
3.在fork的时候,父子数据会发生写时拷贝,所以当父进程准备刷新的时候,子
进程也就有了同样的一份数据,随机产生两份数据
4.write没有变化,说明没有所谓的缓冲区(即系统调用是没有缓冲区的)
printf和fwrite库函数会自带缓冲区,而write系统调用没有带缓冲区(此缓冲区是用户级缓冲区,其实为了提升整机性能,OS也会提供相关内核级缓冲区)
库函数的缓冲区是C标准库提供的