FIFO Operations (ZZ)

来源:互联网 发布:淘宝店铺转天猫 编辑:程序博客网 时间:2024/04/29 22:38
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);}
原创粉丝点击