Los pipes hasta lo visto ahora, sólo crean canales entre procesos emparentados (padre-hijo). Con los FIFO (First In First Out) podemos comunicar procesos sin necesidad de que estén emparentados. Un vez leido un dato, éste ya no puede ser leído de nuevo.
Para crar un FIFO se utiliza la función de C mknod().
–buscar imagen para mknod —
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int mknod(const char *pathname, mode_t mode, dev_t dev);
#include <fcntl.h> /* Definition of AT_* constants */
#include <sys/stat.h>
int mknodat(int dirfd, const char *pathname, mode_t mode, dev_t dev);
El FIFO lo podemos crear:
directamente desde la línea de comandos
mknod [opciones] nombreFichero p
ejemplo:
juanjo@ACER-JJ:~$ mknod FIFO1 p
juanjo@ACER-JJ:~$ ls -l
total 0
prw-rw-rw- 1 juanjo juanjo 0 Sep 25 16:33 FIFO1
opciones: -m ó –mode: similar chmod
Funcionamiento:
Abrir 2 terminales, en el primer terminal ejecutamos …
juanjo@ACER-JJ:~$ cat FIFO1
El terminal se quedará como bloqueado, … cat está esperando a que le llegue algo por FIFO1
En un segundo terminal ejecutamos …
juanjo@ACER-JJ:~$ ls > FIFO1
Simplemente en este segundo terminal estamos enviando un listado de ficheros a el pipe FIFO1, automáticamente cuando termina el proceso en el terminal 2, la instrcción cat se desbloquea en el terminal 1 y mostrará el contenido de FIFO1. Una vez mostrado el pipe se vacia.
utilizando la función C mknod()
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int mknod(const char *pathname, mode_t modo, devt dev);
pathname: nombre del pipe
modo: S_IFREG o 0 (un fichero normal que se crea vacio). S_IFCHR (fichero especial de caractéres). S_IFBLK (fichero especial de bloques). S_IFIFO que crea un FIFO.
dev: especifica los números mayor y menor del fichero especial, sólo se tiene en cuenta con el modo S_IFCHR y S_IFBLK, para los otros casos el parámetro es ignorado.
La función devolverá 0 si todo va bien y -1 en caso de error.
fifocrea.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
int main(void) {
int fp;
int p, bytesleidos;
char saludo[] = "Un saludo, peña!!!\n",buffer[10];
p=mknod("FIFO2", S_IFIFO|0666,0); // permisos de lectura y escritura
if (p==-1) {
printf ("Ocurrió u error...\n");
exit(0);
}
while(1) {
fp = open("FIFO2",0);
bytesleidos = read(fp, buffer, 1);
printf("Obteniedo información ...");
while (bytesleidos!=0){
printf("%s",buffer);
bytesleidos= read(fp, buffer,1);
}
close(fp);
}
return(0);
}
fifoescribe.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main() {
int fp;
char saludo[] = "Un saludo!!!\n";
fp = open("FIFO2",1);
if (fp ==1) {
printf("ERROR AL ABRIR EL ARCHIVO ...");
exit(1);
}
printf("Mandando información al FIFO ... \n");
write(fp, saludo, strlen(saludo));
close(fp);
return 0;
}
Modifica fificrea.c para que cuando le lleguen 5 mensajes el proceso termine, además deberás indicar el número de mensaj leído tambien por pantalla.