Broken pipe, fichier FIFO

voix
45

J'essaie un programme d'utiliser un fichier FIFO, mais je suis en train de Broken pipe en sortie. Voici le 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;
 }

Sortie: Ci-dessous Fifo est le nom du fichier et Bonjour est le contenu.

./a.out fifo hello &

Writer

./a.out fifo
Reader

[1]+  Broken pipe  

Je devrais obtenir « Bonjour » comme la sortie. Quelqu'un peut-il aider?

Créé 16/03/2016 à 17:02
utilisateur
Dans d'autres langues...                            


2 réponses

voix
1

Votre écriture se produit avant de commencer votre lecteur. Lorsque vous écrivez à un tuyau et il n'a pas de lecteur que vous obtenez SIGPIPE.

Dans cette conception particulière, vous devez gérer SIGPIPE avec la logique de nouvelle tentative.

Créé 16/03/2016 à 17:13
source utilisateur

voix
1

L'erreur que vous obtenez est EPIPEet si vous lisez un writemanuel vous verrez que vous obtenez EPIPElorsque

fd est reliée à un tuyau ou d'une douille dont l'extrémité est fermée lecture.

Vous obtenez cette erreur parce que vous ouvrez la fin de la lecture de la conduite en mode non-bloquant, ce qui signifie que l' readappel ne bloque pas et attendre que les données soient reçues, au lieu lorsque l' readappel retourne immédiatement vous fermez le tuyau et quittez le processus.

Cela signifie que lorsque vous exécutez l'écrivain il n'y a pas une attente pour les données que vous écrivez et vous obtenez l'erreur.

Vous devez exécuter la lecture et l'écrivain dans l' ordre inverse: d' abord l'écrivain il écrit dans le tube, et puis le lecteur de lire les données de la conduite.

Créé 16/03/2016 à 17:14
source utilisateur

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