Złamany rura, plik FIFO

głosy
45

Próbuję program do korzystania z pliku FIFO, ale ja dostaję rurę łamany jako wyjście. Oto kod -

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

Wyjście: Poniżej Fifo to nazwa pliku i Halo jest treść.

./a.out fifo hello &

Writer

./a.out fifo
Reader

[1]+  Broken pipe  

Powinienem dostać „Hello” jako wyjście. Czy ktoś może pomóc?

Utwórz 16/03/2016 o 17:02
użytkownik
W innych językach...                            


2 odpowiedzi

głosy
1

Twój zapisu dzieje przed rozpoczęciem czytelnika. Kiedy piszesz do rury i nie ma czytnika masz SIGPIPE.

W tym konkretnym projekcie, trzeba obsłużyć SIGPIPE z logiki ponawiania.

Odpowiedział 16/03/2016 o 17:13
źródło użytkownik

głosy
1

Błąd można dostać to EPIPE, a jeśli czytasz writeinstrukcję widać, że pojawi się EPIPE, gdy

fd jest podłączony do rury lub zagłębienie, którego końcowy odczyt jest zamknięty.

Pojawi się ten błąd, ponieważ po otwarciu koniec czytania rury nieblokującą trybie, co oznacza, że readpołączenie nie będzie blokować i czekać na dane mają być odbierane, gdy zamiast readwezwanie natychmiast powrócić zamknięciu rury i zakończyć proces.

Oznacza to, że po uruchomieniu nagrywarki nie ma nikogo, czeka na dane piszesz i masz błąd.

Trzeba uruchomić odczyt i pisarz w odwrotnej kolejności: najpierw pisarz tak pisze na rurze, a następnie czytnik do odczytu danych z rury.

Odpowiedział 16/03/2016 o 17:14
źródło użytkownik

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