Broken pipe, fișier FIFO

voturi
45

Am încercat un program de a utiliza fișierul FIFO, dar eu sunt obtinerea de conducte sparte ca ieșire. Aici este codul -

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

Ieșire: Mai jos Fifo este numele fișierului și Hello este conținutul.

./a.out fifo hello &

Writer

./a.out fifo
Reader

[1]+  Broken pipe  

Ar trebui să mă „Bună ziua“, ca ieșire. Poate cineva ajuta?

Întrebat 16/03/2016 la 17:02
de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
1

write dvs. se întâmplă înainte de a începe cititorul. Când scrieți o țeavă și nu are nici un cititor te SIGPIPE.

În acest design special, trebuie să se ocupe de SIGPIPE cu logica reîncerca.

Publicat 16/03/2016 la 17:13
sursa de către utilizator

voturi
1

Eroarea te este EPIPEși dacă ai citit un writemanual , veți vedea că veți obține EPIPEatunci când

fd este conectat la o conductă sau un soclu al cărui capăt de citire este închisă.

Veți obține această eroare deoarece deschideți capătul de citire al țevii în modul non-blocare, ceea ce înseamnă că readapelul nu va bloca și să aștepte pentru ca datele să fie primite, în schimb , atunci când readapelul a reveni imediat ce închideți conducta și a ieși din proces.

Asta înseamnă că, atunci când executați scriitorul nu există nici o așteptare pentru datele pe care le scrieți și veți obține eroarea.

Ai nevoie pentru a rula de citire și de scriitorul , în ordine inversă: În primul rând scriitorul astfel încât să scrie la conducta, iar apoi cititorul pentru a citi datele de pe conducta.

Publicat 16/03/2016 la 17:14
sursa de către utilizator

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