Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 4dr14n31t0r en 5 Noviembre 2016, 21:25 pm



Título: Problemas con los FIFOs
Publicado por: 4dr14n31t0r en 5 Noviembre 2016, 21:25 pm
En un archivo tengo el siguiente codigo fuente:
Código
  1. #include <stdio.h>
  2. #include <fcntl.h>
  3.  
  4. int main(void){
  5.    mkfifo("FIFO",0777);
  6.    int fd = open("FIFO",O_WRONLY);
  7.    int n = 1234;
  8.    puts("ESCRIBIENDO DATO\n");
  9.    write(fd,&n,sizeof(int));
  10.    puts("DATO ESCRITO\n");
  11.    close(fd);
  12.    return 0;
  13. }

Y en otro, este:
Código
  1. #include <stdio.h>
  2. #include <fcntl.h>
  3.  
  4. int main(vodi){
  5.    int fd = open("FIFO",O_RDONLY);
  6.    int n;
  7.    puts("LEYENDO DATO\n");
  8.    read(fd,&n,sizeof(int));
  9.    printf("DATO LEIDO: %d\n",n);
  10.    read(fd,&n,sizeof(int));
  11.    printf("DATO LEIDO OTRA VEZ: %d\n",n);
  12.    close(fd);
  13.    return 0;
  14. }

Ejecuto el primer programa en segundo plano, y despues el segundo programa, y la salida que generan es la siguiente:
Código:
ESCRIBIENDO DATO

DATO ESCRITO
LEYENDO DATO

DATO LEIDO: 1234
DATO LEIDO OTRA VEZ: 1234
Según tengo entendido, cuando un programa lee de un fifo y en este no quedan datos que leer, espera a que otro programa escriba algo en el para leer.
¿Por qué lee 2 veces el mismo dato en vez de quedarse bloqueado hasta que algún otro programa vuelva a escribir en el fifo?
Es mas, ¿Por qué entre "ESCRIBIENDO DATO" y "DATO ESCRITO" hay dos lineas cuando solo imprimo una al final de cada mensaje?
¿Se os ocurre alguna forma de hacer que el programa se detenga hasta que no se escriban nuevos datos en el fifo en vez de leer 2 veces el mismo dato?


Título: Re: Problemas con los FIFOs
Publicado por: 4dr14n31t0r en 7 Noviembre 2016, 15:36 pm
Solucionado: El problema estaba en que estaba probando el programa en una maquina virtual de ubuntu, y por alguna razon que nunca alcanzaré a entender en esa maquina virtual aun siendo igual no se paraba cuando debia pero despues en otro ordenador que tengo ubuntu como sistema operativo si