My library basically does the functionality that happens when you type cat file.txt | grep -i | wc -l
into a shell like bash. unixexecpiper 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.txt
STDERR
See src/bin/example.rs
.
The parent process loops n
times (for n
commands) and creates n-1
Pipe
s. 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).