Tubo rotto, file FIFO

voti
45

Sto cercando un programma per utilizzare file FIFO, ma sto ottenendo tubo rotto come output. Ecco il codice -

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

Uscita: Sotto Fifo è il nome del file e Ciao è il contenuto.

./a.out fifo hello &

Writer

./a.out fifo
Reader

[1]+  Broken pipe  

Dovrei ottenere Ciao come l'uscita. Chiunque può aiutare?

È pubblicato 16/03/2016 alle 17:02
dall'utente
In altre lingue...                            


2 risposte

voti
1

accade il vostro articolo prima di iniziare il vostro lettore. Quando si scrive ad un tubo e non ha nessun lettore si ottiene SIGPIPE.

In questo disegno particolare, è necessario gestire SIGPIPE con la logica di tentativi.

Risposto il 16/03/2016 a 17:13
fonte dall'utente

voti
1

L'errore che si ottiene è EPIPEe se si legge un writemanuale si vedrà che si ottiene EPIPEquando

fd è collegato ad un tubo o presa cui estremità lettura è chiusa.

Si ottiene questo errore perché si apre alla fine lettura del tubo in modalità non bloccante, il che significa che la readchiamata non bloccherà e attendere che i dati da ricevere, invece quando la readchiamata di ritorno immediatamente si chiude il tubo e uscire dal processo.

Ciò significa che quando si esegue lo scrittore non c'è nessuno in attesa per i dati che si scrive e si ottiene l'errore.

È necessario eseguire la lettura e lo scrittore in ordine inverso: prima lo scrittore così scrive al tubo, e quindi il lettore a leggere i dati dalla pipe.

Risposto il 16/03/2016 a 17:14
fonte dall'utente

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