#pipe #exec #unix #fork #posix #child-process

bin+lib unix_exec_piper

unix_exec_piper 帮助您执行多个命令,其中一个进程的 STDOUT 连接到下一个进程的 STDIN。这就是 shell(如 bash)内部所做的事情。

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

MIT 许可证

38KB
536

unix_exec_piper:用 Rust 编写的库,用于执行多个命令并通过管道连接它们。

简单来说:

我的库基本上实现了当你在一个像 bash 这样的 shell 中输入 cat file.txt | grep -i | wc -l 时发生的功能。 unix_exec_piper 不进行解析,只执行实际的执行和通过 Unix 管道 之间的(子)进程之间的连接。

库的重要部分是 pipe.rslib.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

(尚未)支持的功能

示例

请参阅 src/bin/example.rs

基本思想

父进程循环 n 次(对于 n 个命令)并创建 n-1Pipe。因此通过 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