Linux中的重定向详解

重定向

重定向就是把一个文件中的内容转换到另一个文件中

重定向的现象
代码:

#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;
}

运行结果:
Linux中的重定向详解_第1张图片

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;
}

运行结果:
Linux中的重定向详解_第2张图片

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;
}

运行结果:
Linux中的重定向详解_第3张图片
重定向后:
Linux中的重定向详解_第4张图片

1.一般C函数写入文件时是全缓冲的,而写入显示器是行缓冲
2.printf和fwrite函数会自带缓冲区,当发生重定向到普通文件时,数据的
缓冲方由行缓冲变成了全缓冲,所以缓冲区中的数据,不会被立即刷新,在fork
之后,也不会被刷新,但是在进程退出之后,会被统一刷新,写入文件当中
3.在fork的时候,父子数据会发生写时拷贝,所以当父进程准备刷新的时候,子
进程也就有了同样的一份数据,随机产生两份数据

4.write没有变化,说明没有所谓的缓冲区(即系统调用是没有缓冲区的)

printf和fwrite库函数会自带缓冲区,而write系统调用没有带缓冲区(此缓冲区是用户级缓冲区,其实为了提升整机性能,OS也会提供相关内核级缓冲区)

库函数的缓冲区是C标准库提供的

你可能感兴趣的:(linux)