| Crates.io | unix_exec_piper |
| lib.rs | unix_exec_piper |
| version | 0.1.4 |
| created_at | 2020-09-20 12:55:52.829034+00 |
| updated_at | 2020-09-20 21:06:34.374171+00 |
| description | unix_exec_piper helps you to exec multiple commands where STDOUT of one process is connected to STDIN of the next process. This is what a shell (like bash) does internally. |
| homepage | https://github.com/phip1611/unix_exec_piper |
| repository | https://github.com/phip1611/unix_exec_piper |
| max_upload_size | |
| id | 290778 |
| size | 105,536 |
My library basically does the functionality that happens when you type cat file.txt | grep -i | wc -l
into a shell like bash. unix_exec_piper does no parsing, but only the actual execution and connection
between the (child) processes via unix pipes.
Important main parts of the library are pipe.rs and lib.rs :: execute_piped_cmd_chain().
The main purpose of this library is educational and to show people who are interested in this how it's done.
You might build a shell around this library (if it gets more functionality in the future).
Please make yourself familiar with the UNIX/Posix concepts:
pipe()fork()file descriptors and "Everything is a file"exec()STDOUT of one process gets connected to
STDIN of the next process. $ cat file.txt | grep -i | wc -l)$ cat < file.txt | grep -i | wc -l > out.txtSTDERRSee src/bin/example.rs.
The parent process loops n times (for n commands) and creates n-1 Pipes. Therefore n child processes
are created through fork(). Each child process has two variables in its address space:
let mut pipe_to_current: Option<Pipe>;
let mut pipe_to_next: Option<Pipe>;
Pipes communicates across process boundaries in the following way:
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-
Each process uses pipe_to_current (if present) as "read end" (as it's stdin) and
pipe_to_current (if present) as "write end"
(duplicate it's STDOUT file descriptor into the write end of the pipe).