5 个版本
0.1.4 | 2020 年 9 月 20 日 |
---|---|
0.1.3 | 2020 年 9 月 20 日 |
0.1.2 | 2020 年 9 月 20 日 |
0.1.1 | 2020 年 9 月 20 日 |
0.1.0 | 2020 年 9 月 20 日 |
854 in Unix API
38KB
536 行
unix_exec_piper:用 Rust 编写的库,用于执行多个命令并通过管道连接它们。
简单来说:
我的库基本上实现了当你在一个像 bash 这样的 shell 中输入 cat file.txt | grep -i | wc -l
时发生的功能。 unix_exec_piper 不进行解析,只执行实际的执行和通过 Unix 管道 之间的(子)进程之间的连接。
库的重要部分是 pipe.rs
和 lib.rs :: execute_piped_cmd_chain()
。
此库的主要目的是教育和展示对此感兴趣的人如何实现。
您可能会围绕这个库构建一个 shell(如果它在未来获得更多功能)。
您需要了解的基本知识
请熟悉 UNIX/Posix
概念
管道()
fork()
文件描述符
和 “万物皆文件”exec()
支持的功能
- 在进程之间创建管道,其中一个进程的
STDOUT
连接到下一个进程的STDIN
。
($ cat file.txt | grep -i | wc -l
) - 将 I/O 重定向到文件
$cat<file.txt | grep -i | wc -l >out.txt
(尚未)支持的功能
- 使用
STDERR
的 I/O 重定向 - 这里列出了许多其他重定向原语:https://tldp.org/LDP/abs/html/io-redirection.html
示例
请参阅 src/bin/example.rs
。
基本思想
父进程循环 n
次(对于 n
个命令)并创建 n-1
个 Pipe
。因此通过 fork()
创建了 n
个子进程。每个子进程在其地址空间中都有两个变量
let mut pipe_to_current: Option<Pipe>;
let mut pipe_to_next: Option<Pipe>;
管道通过以下方式在进程边界之间进行通信
child process 0 child process 1 child process n
_______________ _______________ _________
| cat foo.txt | | grep -i abc | | wc -l |
--------------- --------------- ---------
^ ^ ^ ^
WRITE |--------| R / W |--------| READ
END E E END
(current child)
-Pipe to Current- -Pipe to Next-
每个进程使用 pipe_to_current
(如果存在)作为“读取端”(因为它相当于 stdin
)并将 pipe_to_current
(如果存在)作为“写入端”(将其 STDOUT
文件描述符
复制到管道的写入端)。
依赖关系
~230KB