Pipes allow processes to communicate with each other. A pipe may also be known as a "FIFO" (First In, First Out).
# ===========================================================================
# Working with Named Pipes
#
# Pipes allow processes to communicate with each other. A pipe may also be
# known as a "FIFO" (First In, First Out).
#
# The advantage over using files as a means of communication is, that
# processes are synchronized by pipes: a process writing to a pipe blocks
# if there is no reader, and a process reading from a pipe blocks if there
# is no writer.
#
# Source: http://mywiki.wooledge.org/NamedPipes
# ============================================================================
# Create a named pipe, named here as `pipe1`.
cd /tmp && mkfifo pipe1
# To send a message to the pipe, use:
echo "hello" > pipe1
# The process will appear to be hung at this point. There is no other process
# running to collect the data, so the kernel suspends the process. The process
# is said to be "blocked" at this stage.
#
# On another terminal, it is possible to collect the data from the pipe:
cat /tmp/pipe1
# The data from the pipe will now be read by cat (and written to the terminal),
# and the "blocked" writer process will be free to resume.
##
# Synchronous bidirectional Client - Server example
##
# Here is a small example of a server process communicating with a client
# process. The server sends commands to the client, and the client
# acknowledges each command:
# Server - communication example
# Create a FIFO. Some systems don't have a "mkfifo" command, but use
# "mknod pipe p" instead:
mkfifo pipe
while sleep 1
do
echo "server: sending GO to client"
# The following command will cause this process to block (wait)
# until another process reads from the pipe
echo GO > pipe
# A client read the string! Now wait for its answer. The "read"
# command again will block until the client wrote something
read answer < pipe
# The client answered!
echo "server: got answer: $answer"
done
Client
# Client
# We cannot start working until the server has created the pipe...
until [ -p pipe ]
do
sleep 1; # wait for server to create pipe
done
# Now communicate...
while sleep 1
do
echo "client: waiting for data"
# Wait until the server sends us one line of data:
read data < pipe
# Received one line!
echo "client: read <$data>, answering"
# Now acknowledge that we got the data. This command
# again will block until the server read it.
echo ACK > pipe
done
# Write both examples to files server and client respectively, and start them
# concurrently to see it working:
$ chmod +x server client
$ server & client &
server: sending GO to client
client: waiting for data
client: read <GO>, answering
server: got answer: ACK
server: sending GO to client
client: waiting for data
client: read <GO>, answering
server: got answer: ACK
server: sending GO to client
client: waiting for data
[...]