【Linux】教你三分钟学会重定向

重定向是什么

在学习了文件描述符及其分配规则(https://blog.csdn.net/Miss_Monster/article/details/86411039)之后,了解到操作系统总是找到当前files_struct的指针数组中没有被使用的最小的一个下标,作为新的文件描述符。在代码的结尾我们发现,文件可以通过close来关闭,既然可以关闭,那如果我将标准输出1关闭,再打开myfile文件,会出现什么现象呢?用代码验证一下

【Linux】教你三分钟学会重定向_第1张图片

【Linux】教你三分钟学会重定向_第2张图片

【Linux】教你三分钟学会重定向_第3张图片

 

在编译test.c之前我们先看看文件夹里的文件,没有myfile文件,编译后并运行a.out,我们发现本该输出到显示器上的内容,输出到了myfile文件中,而输出重定向不就是文件描述符为1的吗?这种现象就叫做输出重定向。常见的重定向有>(输出重定向)、>>(追加重定向)、<(输入重定向)。

 

重定向本质

我们知道文件描述符分配规则是在files_struct的指针数组中,找到当前没有被使用的最小的一个下标,就作为新的文件描述符,printf是C库当中的IO函数,一般往 stdout 中输出,但是stdout底层访问文件的时候,找的还是fd:1, 但此时,fd:1已经分配给了myfile。fd:1下标所表示内容,已经变成了myfile的地址不再是显示器文件的地址,所以,输出的任何消息都会往文件中写入,进而完成输出重定向。 

【Linux】教你三分钟学会重定向_第4张图片

 

除上述例子之外我们还可以使用dup2系统调用来完成重定向

使用dup2系统调用函数 

函数原型如下:

#include 
int dup2(int oldfd, int newfd);

 

根据定义,newfd里的内容是oldfd里内容的拷贝,这里的newfd和oldfd是文件描述符,所以最终会有两个oldfd。所以如果想把1的内容重定向到fd所指向的文件,参数应该为 dup2(fd,1)。具体代码如下:

 

【Linux】教你三分钟学会重定向_第5张图片

【Linux】教你三分钟学会重定向_第6张图片

【Linux】教你三分钟学会重定向_第7张图片

所以,dup2系统调用将标准输入中输入的本该输出到标准输出的内容直接打印到文件内部。

那么关于重定向,dup2和刚刚的方法有什么区别呢?

刚刚的方法是先把文件关了,然后新打开一个文件,实现重定向。而dup2呢,是两个文件描述符都已经有了,只是把文件内容进行了拷贝,进而实现重定向。

 

你可能感兴趣的:(Linux)