![重定向是如何实现的?](https://linux22.com/image/87426/%E9%87%8D%E5%AE%9A%E5%90%91%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E7%9A%84%EF%BC%9F.png)
重定向是 shell 的概念,而不是操作系统内核的概念吗?
系统调用方面的重定向是如何实现的?
重定向的实现与管道类似吗?
答案1
对于重定向,我假设此(重定向)是通过使用 dup2() 替换 stdin (通过 < 输入的输入)和 stdout (通过 > 输出的输出)的 shell 实现的 -
- 打开文件进行输入和输出 in = open() out = open()
- dup2(in, 0) // 用标准输入替换输入文件
- dup2(out, 1) // 用 stdout 替换输出文件
- 逼近)
- 关闭(出)
- 执行()
对于管道,pipe(2)系统调用以类似的方式使用——它有一个读端和一个写端。通过管道连接的每个命令将从管道的一端读取并写入另一端。 stdin、stdout 将替换该命令的相应管道末端。
答案2
“重定向”是 shell 的一个概念,其细节取决于您所讨论的 shell。
不过,有人可能会说,重定向的基础在于程序在启动时预先打开的输入和输出文件描述符的概念,这可以追溯到函数的工作原理execve
。即子进程继承打开的文件描述符。
因此,要启动子进程(命令),父进程(即 shell)将首先为子进程创建子进程,然后为子进程的输入和输出设置适当的管道末端(文件描述符 0、1 和 2) ,然后让子进程在通过 执行时继承它们execve
。
是的,它是管道。