Skip to main content

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
    [...]