Pijp Broken, FIFO-bestand

stemmen
45

Ik probeer een programma om FIFO-bestand te gebruiken, maar ik krijg Gebroken pijp als output. Hier is de code -

#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;
 }

Output: Onder Fifo is de naam van het bestand en Hallo is de inhoud.

./a.out fifo hello &

Writer

./a.out fifo
Reader

[1]+  Broken pipe  

Ik zou moeten krijgen Hello als de uitvoer. Kan iemand mij helpen?

De vraag is gesteld op 16/03/2016 om 17:02
user
In andere talen...                            


2 antwoorden

stemmen
1

Uw schrijven gebeurt voordat u uw lezer te starten. Wanneer je schrijven op een pijp en het heeft geen enkele lezer krijg je SIGPIPE.

In dit specifieke ontwerp, moet je behandelen SIGPIPE met retry logica.

antwoordde op 16/03/2016 om 17:13
bron van user

stemmen
1

De fout die je krijgt is EPIPEen als je leest writede handleiding zul je zien dat je krijgt EPIPEwanneer

fd is verbonden met een pijp of bus waarvan de lezing uiteinde gesloten is.

U krijgt deze fout, omdat je het lezen einde van de buis in niet-blokkerende modus, wat het betekent te openen readoproep niet blokkeren en wachten op gegevens die worden ontvangen, in plaats wanneer de readoproep onmiddellijk terug te keren u de buis te sluiten en af te sluiten van het proces.

Dat betekent dat wanneer je de schrijver lopen er is niemand te wachten op de gegevens die u te schrijven en u krijgt de fout.

U moet de lees- en de schrijver in omgekeerde volgorde uit te voeren: eerst de schrijver, zodat het schrijft aan de leiding, en vervolgens de lezer om de gegevens te lezen uit de pijp.

antwoordde op 16/03/2016 om 17:14
bron van user

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