What is the purpose of using a FIFO vs a temporary file or a pipe?
APUE says “FIFOs can be used to duplicate an output stream”, it doesn’t say that FIFOs actually duplicate the output stream. As you point out, the duplication is done by
tee
in the example.mkfifo
creates a FIFO, which is visible as a “file” in the containing directory; but writing to the FIFO isn’t like writing to a file because the data never hits the disk. Pipes, named or otherwise, don’t provide storage for data, they provide communications channels; the writing end of a pipe can’t write data if there’s no receiver, the pipe just passes data along, without storing it. (On most systems pipes are backed by small kernel buffers, to improve performance, but that’s an implementation detail.)Linear connections between processes are pipes which can be represented as a linear graph. In the example, you can represent the last line as
infile → prog1 → tee fifo1 → prog3
which is linear, but if you try to represent the whole chain, reducing to processing elements, you need
infile → prog1 → prog2 → prog3
which is non-linear (there’s one node in the graph,
prog1
, which has two exit nodes).
Related videos on Youtube
Tim
Elitists are oppressive, anti-intellectual, ultra-conservative, and cancerous to the society, environment, and humanity. Please help make Stack Exchange a better place. Expose elite supremacy, elitist brutality, and moderation injustice to https://stackoverflow.com/contact (complicit community managers), in comments, to meta, outside Stack Exchange, and by legal actions. Push back and don't let them normalize their behaviors. Changes always happen from the bottom up. Thank you very much! Just a curious self learner. Almost always upvote replies. Thanks for enlightenment! Meanwhile, Corruption and abuses have been rampantly coming from elitists. Supportive comments have been removed and attacks are kept to control the direction of discourse. Outright vicious comments have been removed only to conceal atrocities. Systematic discrimination has been made into policies. Countless users have been harassed, persecuted, and suffocated. Q&A sites are for everyone to learn and grow, not for elitists to indulge abusive oppression, and cover up for each other. https://softwareengineering.stackexchange.com/posts/419086/revisions https://math.meta.stackexchange.com/q/32539/ (https://i.stack.imgur.com/4knYh.png) and https://math.meta.stackexchange.com/q/32548/ (https://i.stack.imgur.com/9gaZ2.png) https://meta.stackexchange.com/posts/353417/timeline (The moderators defended continuous harassment comments showing no reading and understanding of my post) https://cs.stackexchange.com/posts/125651/timeline (a PLT academic had trouble with the books I am reading and disparaged my self learning posts, and a moderator with long abusive history added more insults.) https://stackoverflow.com/posts/61679659/revisions (homework libels) Much more that have happened.
Updated on September 18, 2022Comments
-
Tim over 1 year
From APUE
FIFOs can be used to duplicate an output stream in a series of shell commands. This prevents writing the data to an intermediate disk file (similar to using pipes to avoid intermediate disk files).
But whereas pipes can be used only for linear connections between processes, a FIFO has a name, so it can be used for nonlinear connections.
Consider a procedure that needs to process a filtered input stream twice.
mkfifo fifo1 prog3 < fifo1 & prog1 < infile | tee fifo1 | prog2
We create the FIFO and then start prog3 in the background, reading from the FIFO. We then start prog1 and use tee to send its input to both the FIFO and prog2.
How does a FIFO "duplicate an output stream in a series of shell commands"? Isn't this done by
tee
instead of a FIFO?In the example,
mkfifo fifo1
creates a file in the current directory, andfifo1
seems replaceable with a regular file . So what is the point of a FIFO "prevent writing the data to an intermediate disk file"?What do "linear connections" and "nonlinear connections" between processes mean? What does it mean that a FIFO can be used for nonlinear connections, while a pipe can be only used for linear connections between processes?
Thanks.
-
Tim about 6 yearsThanks. (2) What is the advantage of a FIFO over a temporary regular file? (3) The nonlinear connection between processes is actually implemented by
tee
, not by a FIFO, for example, usingtee
and a temporary regular file we can achieve the same nonlinear connection too. -
Stephen Kitt about 6 yearsThe description in APUE opposes FIFOs and files on the one hand, FIFOs and pipes on the other; you can’t conflate the three. When comparing FIFOs and files, the difference is that FIFOs don’t involve hitting the disk for the content written to the FIFO (this addresses your point 2). When comparing FIFOs and pipes, the difference is that FIFOs are named so they can be used in places pipes can’t. APUE doesn’t say you can’t use files to implement non-linear connections, it just says you can’t use pipes.
-
Tim about 6 yearsThanks. What is the advantage of "don’t involve hitting the disk for the content written to the FIFO"?
-
Stephen Kitt about 6 yearsDisks are slow. (At least, they were when APUE was written.)
-
Tim about 6 yearsThanks. Besides speed, I am also wondering about space. Do named pipes (as used in FIFO and process substitution) reside in main memory? Does a named pipe have to hold all the content as a temporary file in disk when using the file instead of a named pipe? Does the main memory have to be large enough if the content is huge?
-
Stephen Kitt about 6 yearsA pipe (FIFO or whatever) doesn’t hold data, it transfers data between processes. You can see this by running, for example,
mkfifo fifo && seq 1 1000000 | tee fifo
. You won’t see any input from this initially, because the FIFO doesn’t start accepting data until both its ends are open. Runhead fifo
, and you’ll see theseq
side of the pipe output a bunch of numbers and then stop with exit code 141, i.e.SIGPIPE
(128 + 13): the output gives an indication the size of the kernel buffer used for the FIFO, at most a few tens of kilobytes. That’s all the memory that’s used by a pipe. -
George Vasiliou about 6 yearsBy the way, in your last example that
prog1
needs two exit nodes (one forprog2
and one forprog3
), someone can usetee
under some circumstances like this:echo "hello world" | tee >(sed 's/h/H/') >(sed 's/w/W/g')
-
derobert about 6 yearsBTW: The limitation of anonymous pipes being useful only for linear connections is really a limit of shell pipeline syntax; the
pipe
syscall has no such limitation.