Cano quebrado, arquivo FIFO

votos
45

Eu estou tentando um programa para usar o arquivo FIFO, mas estou ficando Broken pipe como saída. Aqui está o código -

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

Saída: Abaixo Fifo é o nome do arquivo e Olá é o conteúdo.

./a.out fifo hello &

Writer

./a.out fifo
Reader

[1]+  Broken pipe  

Eu deveria ter Olá como a saída. Alguém pode ajudar?

Publicado 16/03/2016 em 17:02
usuário
Em outras línguas...                            


2 respostas

votos
1

Sua gravação acontece antes de começar o seu leitor. Quando você escreve a um tubo e não tem leitor você começa SIGPIPE.

Neste projeto específico, você precisa lidar com SIGPIPE com lógica de repetição.

Respondeu 16/03/2016 em 17:13
fonte usuário

votos
1

O erro que você recebe é EPIPEe se você ler um writemanual que você vai ver que você começa EPIPEquando

fd está ligada a um tubo ou soquete cuja extremidade leitura está fechado.

Você recebe este erro porque você abrir o fim de leitura do tubo no modo não-bloqueio, o que significa que a readchamada não irá bloquear e esperar que os dados sejam recebidos, ao invés, quando a readchamada retornar imediatamente fechar o tubo e sair do processo.

Isso significa que quando você executar o escritor não há ninguém esperando os dados que você escrever e você obter o erro.

Você precisa executar a leitura e o escritor em ordem inversa: Primeiro o escritor assim que escreve para o pipe, e , em seguida, o leitor a ler os dados a partir do tubo.

Respondeu 16/03/2016 em 17:14
fonte usuário

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