Operacje We/Wy na FIFO są właściwie takie same jak dla normalnych potoków, z jednym wyjątkiem - musimy użyć wywołania lub funkcji 'open' w celu fizycznego otwarcia kanału do potoku. Używając potoków nie musieliśmy tego robić, gdyż potok rezydował w jądrze a nie w systemie plików. W naszych przykładach będziemy traktować potoki tak jak strumienie - otwieramy je za pomocą fopen(), a zamykamy za pomocą fclose().
Rozważ ten prosty proces serwera:
/*****************************************************************************
Zaczerpnięto z "Linux Programmer's Guide - Rozdział 6"
(C)opyright 1994-1995, Scott Burkett
*****************************************************************************
MODUŁ: fifoserver.c
*****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/stat.h>
#define FIFO_FILE "MOJEFIFO"
int main(void)
{
FILE *fp;
char readbuf[80];
/* Tworzymy FIFO jeżeli nie istnieje */
umask(0);
mknod(FIFO_FILE, S_IFIFO|0666, 0);
while(1)
{
fp = fopen(FIFO_FILE, "r");
fgets(readbuf, 80, fp);
printf("Otrzymany łańcuch: %s\n", readbuf);
fclose(fp);
}
return(0);
}
Jakoże FIFO domyślnie blokuje program, uruchom go w tle:
$ fifoserver&
Blokowanie akcji przez FIFO omówimy za chwilę. Na razie, rozważ następujący przykład prostego klienta:
/*****************************************************************************
Zaczerpnięto z "Linux Programmer's Guide - Rozdział 6"
(C)opyright 1994-1995, Scott Burkett
*****************************************************************************
MODUŁ: fifoclient.c
*****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#define FIFO_FILE "MOJEFIFO"
int main(int argc, char *argv[])
{
FILE *fp;
if ( argc != 2 ) {
printf("UŻYCIE: fifoclient [łańcuch]\n");
exit(1);
}
if((fp = fopen(FIFO_FILE, "w")) == NULL) {
perror("fopen");
exit(1);
}
fputs(argv[1], fp);
fclose(fp);
return(0);
}