Linux中的重定向详解

重定向

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

重定向的现象
代码:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
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<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
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<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
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<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
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标准库提供的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值