Pipe Broken, FIFO-fil

stemmer
45

Jeg prøver et program å bruke FIFO-fil, men jeg får Broken rør som utgang. Her er koden -

#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: Under FIFO er navnet på filen og Hei er innholdet.

./a.out fifo hello &

Writer

./a.out fifo
Reader

[1]+  Broken pipe  

Jeg skal få Hello som output. Kan noen hjelpe?

Publisert på 16/03/2016 klokken 17:02
bruker
På andre språk...                            


2 svar

stemmer
1

Din skrive skjer før du begynner leseren din. Når du skriver til et rør, og det har ingen leser du får SIGPIPE.

I denne spesielle design, må du håndtere SIGPIPE med retry logikk.

Svarte 16/03/2016 kl. 17:13
kilden bruker

stemmer
1

Feilen du får er EPIPE, og hvis du leser en writemanuell vil du se at du får EPIPEnår

fd er koblet til et rør eller en stikkontakt hvis avlesning ende er lukket.

Du får denne feilmeldingen fordi du åpner lesing enden av røret i ikke-blokkerende modus, noe som betyr at readsamtalen ikke vil blokkere og vente på data som skal mottas, i stedet når readsamtalen umiddelbart returnere du lukker røret og avslutte prosessen.

Det betyr at når du kjører forfatteren er det ingen som venter på data du skriver, og du får feilen.

Du må kjøre lese- og skribent i motsatt rekkefølge: Først forfatteren så den skriver til røret, og deretter leseren til å lese data fra røret.

Svarte 16/03/2016 kl. 17:14
kilden bruker

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