重定向
- 什么是重定向
- 如何实现一个简单的重定向
- 关于重定向的系统调用接口
注意:在看这篇博客之前,最好是要对文件在系统中是如何被打开的以及操作系统是如何管理文件有一个初步了解,如果不了解的话,可以看看这篇博客《初步认识文件系统》
什么是重定向
重定向是一种将命令的输入或输出流从默认位置改变到其他位置的操作。在命令行环境中,通常有三种标准的流:标准输入(stdin)、标准输出(stdout)、标准错误输出(stderr)。重定向允许将这些流连接到文件、设备或另一个进程,而不是默认的屏幕(对于输出)或键盘(对于输入)。
在 shell 脚本或命令行中,重定向使用特殊的符号来指示。常见的符号包括:
- >:将输出重定向到文件,覆盖文件内容。
- >>:将输出重定向到文件,追加到文件末尾。
- <:从文件中读取输入。
- |:管道,将一个命令的输出作为另一个命令的输入。
如何实现一个简单的重定向
在博客《初步认识文件系统》的最后,我通过关闭文件描述符0来演示了文件描述符的分配规则(其实关闭文件描述符2效果也是一样的),但是如果是关闭文件描述符1会有特别的效果呢?
要先知道,文件描述符1默认对应的是标准输出
在以上代码中,我关闭了文件描述符1,并以只写方式打开了一个文件,并用printf方式打印返回的文件描述符
运行以上代码
发现并没有在屏幕上打印,这时再打开myfile文件
&emsp发现最后结果输出到了myfile文件,其中,fd=1,这其实就是输出重定向的原理(将本应该输出到屏幕上的内容经过对于**文件描述符表(fd_array)**的一些操作,输出到了文件当中),也就说,重定向是更改了fd_array数组中的内容,更改所存指针的内容,使得该下标存的指针指向的空间发生改变。
这里的话只是实现一个输出重定向,输入重定向和追加重定向原理也类似,这里就不过多赘述
关于重定向的系统调用接口
对于实现重定向的系统调用通常使用dup2
dup2的主要作用就是将oldfd对应元素的内容覆盖到newfd对应元素的内容,下面看看官方解释
最后我来用系统调用来实现之前的效果