我了解I / O重定向在Unix / Linux中的工作方式,并且我知道Shell使用此功能通过特殊类型的文件-匿名管道来管道程序。但是我想知道Shell如何以编程方式实现它的细节吗?我不仅对涉及的系统调用感兴趣,而且对整个图片感兴趣。
例如ls | sort,Shell如何为ls和执行I / O重定向sort?
整个情况很复杂,最好的理解方法是研究一个小壳。对于有限的图片,这里去。在执行任何操作之前,shell会分析整个命令行,因此它确切地知道如何链接进程。假设它遇到了proc1 | proc2。
它设置了一个管道。长话短说,写成thepipe[0]最终thepipe[1]
int thepipe[2];
pipe(thepipe);
Run Code Online (Sandbox Code Playgroud)它先派生第一个进程并更改其stdout的方向 exec
dup2 (thepipe[1], STDOUT_FILENO);
Run Code Online (Sandbox Code Playgroud)它执行了新程序,该程序非常高兴地不知道重定向,只是写得stdout像个行为良好的过程
它派生第二个进程并在之前更改其stdin的源 exec
dup2 (thepipe[0], STDIN_FILENO);
Run Code Online (Sandbox Code Playgroud)它执行新程序,但不知道其输入来自另一个程序
就像我说的那样,这是一张有限的图片。在真实的画面中,外壳将它们以菊花链状连接成一个循环,并且还记得在适当的时候关闭管端。
| 归档时间: |
|
| 查看次数: |
454 次 |
| 最近记录: |