Keywords: lpg

Next: 6.3.4 Blocking Actions on Up: 6.3 Named Pipes (FIFOs Previous: 6.3.2 Creating a FIFO

## 6.3.3 FIFO Operations

I/O operations on a FIFO are essentially the same as for normal pipes, with once major exception. An ``open'' system call or library function should be used to physically open up a channel to the pipe. With half-duplex pipes, this is unnecessary, since the pipe resides in the kernel and not on a physical filesystem. In our examples, we will treat the pipe as a stream, opening it up with fopen(), and closing it with fclose().

Consider a simple server process:

    /*****************************************************************************
     Excerpt from "Linux Programmer's Guide - Chapter 6"
     (C)opyright 1994-1995, Scott Burkett
     *****************************************************************************
     MODULE: fifoserver.c
     *****************************************************************************/

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/stat.h>
    #include <unistd.h>

    #include <linux/stat.h>

    #define FIFO_FILE       "MYFIFO"

    int main(void)
    {
            FILE *fp;
            char readbuf[80];

            /* Create the FIFO if it does not exist */
            umask(0);
            mknod(FIFO_FILE, S_IFIFO|0666, 0);

            while(1)
            {
                    fp = fopen(FIFO_FILE, "r");
                    fgets(readbuf, 80, fp);
                    printf("Received string: %s\n", readbuf);
                    fclose(fp);
            }

            return(0);
    }

Since a FIFO blocks by default, run the server in the background after you compile it:

            $ fifoserver&

We will discuss a FIFO's blocking action in a moment. First, consider the following simple client frontend to our server:

    /*****************************************************************************
     Excerpt from "Linux Programmer's Guide - Chapter 6"
     (C)opyright 1994-1995, Scott Burkett
     *****************************************************************************
     MODULE: fifoclient.c
     *****************************************************************************/

    #include <stdio.h>
    #include <stdlib.h>

    #define FIFO_FILE       "MYFIFO"

    int main(int argc, char *argv[])
    {
            FILE *fp;

            if ( argc != 2 ) {
                    printf("USAGE: fifoclient [string]\n");
                    exit(1);
            }

            if((fp = fopen(FIFO_FILE, "w")) == NULL) {
                    perror("fopen");
                    exit(1);
            }

            fputs(argv[1], fp);

            fclose(fp);
            return(0);
    }