Rohr gebrochen, FIFO-Datei

stimmen
45

Ich versuche, ein Programm FIFO-Datei zu verwenden, aber ich bin immer Broken pipe als Ausgabe. Hier ist der 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;
 }

Ausgang: Unter Fifo ist der Name der Datei und Hallo ist der Inhalt.

./a.out fifo hello &

Writer

./a.out fifo
Reader

[1]+  Broken pipe  

Ich soll „Hallo“ als Ausgabe erhalten. Kann jemand helfen?

Veröffentlicht am 16/03/2016 um 17:02
vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
1

Ihre Schreib geschieht, bevor Sie Ihre Leser starten. Wenn Sie an einem Rohr zu schreiben und es hat keinen Leser Sie SIGPIPE bekommen.

In diesem speziellen Design, müssen Sie behandeln SIGPIPE mit Wiederholungslogik.

Beantwortet am 16/03/2016 um 17:13
quelle vom benutzer

stimmen
1

Der Fehler , den Sie erhalten , ist EPIPEund wenn Sie eine lesen writeHandbuch werden Sie sehen , dass Sie erhalten , EPIPEwenn

fd verbunden ist mit einem Rohr oder Sockel, dessen Lese Ende geschlossen ist.

Sie erhalten diesen Fehler , weil Sie das Lese Ende des Rohres in nicht-blockierenden Modus zu öffnen, die die Mittel readAnruf wird nicht blockieren und warten auf Daten, anstatt empfangen werden , wenn der readAnruf sofort zurückkehren Sie das Rohr zu schließen und den Prozess zu beenden.

Das heißt, wenn Sie den Schreiber laufen gibt es niemand für die Daten warten Sie schreiben und Sie erhalten den Fehler.

Sie müssen den Lese- und den Schriftsteller in umgekehrter Reihenfolge ausgeführt werden : Zuerst die Schriftsteller so dass es auf das Rohr schreibt, und dann den Leser die Daten aus dem Rohr zu lesen.

Beantwortet am 16/03/2016 um 17:14
quelle vom benutzer

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