FIFO是IPC的一种形式。他和pipe不一样,pipe只能用在有关联的进程之间,而FIFO可以用在任意的进程之间。
下面是一个server和client的例子。
1. FIFO是半双工的
2. 这个是可以block的
3. 打开fifo的时候,必须是只读或者只写,不能既读又写。
/*
* =====================================================================================
*
* Filename: fifo_server.c
*
* Description:
*
* Version: 1.0
* Created: 09/02/2010 11:18:50 AM
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Company:
*
* =====================================================================================
*/
#define HALF_DUPLEX "halfduplex"
#define MAX_BUF_SIZE 25
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
int fd, ret_val, count, numread;
char buf[MAX_BUF_SIZE];
/* Create the named - pipe */
ret_val = mkfifo(HALF_DUPLEX, 0666);
if ((ret_val == -1) && (errno != EEXIST)) {
perror("Error creating the named pipe");
exit (1);
}
/* Open the pipe for reading */
fd = open(HALF_DUPLEX, O_RDONLY);
/* Read from the pipe */
numread = read(fd, buf, MAX_BUF_SIZE);
buf[numread] = '/0';
printf("Half Duplex Server : Read From the pipe : %s/n", buf);
}
/*
* =====================================================================================
*
* Filename: fifo_client.c
*
* Description:
*
* Version: 1.0
* Created: 09/02/2010 11:20:48 AM
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Company:
*
* =====================================================================================
*/
#define HALF_DUPLEX "halfduplex"
#define MAX_BUF_SIZE 255
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char *argv[])
{
int fd;
/* Check if an argument was specified. */
if (argc != 2) {
printf("Usage : %s <string to be sent to the server>/n", argv[0]);
exit (1);
}
/* Open the pipe for writing */
fd = open(HALF_DUPLEX, O_WRONLY);
/* Write to the pipe */
write(fd, argv[1], strlen(argv[1]));
}