Tubo roto, archivo FIFO

votos
45

Estoy tratando de utilizar un programa de archivo FIFO, pero yo estoy tubería rota como salida. Aquí está el código -

#include<iostream>
#include<stdlib.h>
#include<fcntl.h>
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
using namespace std;
int main(int argc,char *argv[])
{
int fd; //stores file descriptor returnd from open
char buf[256];
if(argc<2||argc>3)
{
    cout<<Invalid Arguments;
    return 1;
}

mkfifo(argv[1],0777);
if(argc==3)
{   
    cout<<Writer\n;
    if((fd=open(argv[1],O_WRONLY))==-1)
    {
        perror(open);
        return 1;
    }
    write(fd,argv[2],strlen(argv[2]));
    sleep(10);
}
else
{   cout<<Reader\n;
    if((fd=open(argv[1],O_RDONLY|O_NONBLOCK))==-1)
    {       
        perror(open);
        return 1;
    }

    read(fd,&buf,sizeof(buf));
    cout<<buf;

}
 close(fd);
 return 1;
 }

Salida: A continuación Fifo es el nombre del archivo y Hola es el contenido.

./a.out fifo hello &

Writer

./a.out fifo
Reader

[1]+  Broken pipe  

Debo conseguir Hola como la salida. ¿Alguien puede ayudar?

Publicado el 16/03/2016 a las 14:02
por usuario
En otros idiomas...                            


2 respuestas

votos
1

Su escritura ocurre antes de empezar su lector. Al escribir en un tubo y no tiene lector a obtener SIGPIPE.

En este diseño en particular, es necesario manejar SIGPIPE con la lógica de reintento.

Respondida el 16/03/2016 a las 14:13
fuente por usuario

votos
1

El error que se obtiene es EPIPEy si se lee un writemanual, verá que se obtiene EPIPEcuando

fd está conectado a un tubo o casquillo cuyo extremo lectura está cerrada.

Se obtiene este error porque se abre el extremo de lectura de la tubería en el modo de no bloqueo, lo que significa que la readllamada no bloqueará y esperar a que se reciban los datos, en lugar cuando elread llamada respondió de inmediato se cierra el tubo y sale del proceso.

Esto significa que cuando se ejecuta el escritor no hay nadie a la espera de los datos se escribe y se obtiene el error.

Tiene que ejecutar la lectura y el escritor en orden inverso: primero el escritor por lo que se escribe en el tubo, y luego el lector para leer los datos de la tubería.

Respondida el 16/03/2016 a las 14:14
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more