Труба Излом, файл FIFO

голоса
45

Я пытаюсь программой использовать файл FIFO, но я получаю сломанную трубу на выходе. Вот код -

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

Выход: Ниже Fifo это имя файла и Hello является содержание.

./a.out fifo hello &

Writer

./a.out fifo
Reader

[1]+  Broken pipe  

Я должен получить «Hello» в качестве выхода. Может кто-нибудь помочь?

Задан 16/03/2016 в 17:02
пользователем
На других языках...                            


2 ответов

голоса
1

Ваша запись происходит, прежде чем начать свой читатель. Когда вы пишете в трубу, и это не имеет никакого читателя вы получите SIGPIPE.

В этой конкретной конструкции, необходимо обрабатывать SIGPIPE с повторной попыткой логикой.

Ответил 16/03/2016 в 17:13
источник пользователем

голоса
1

Ошибка , которую вы получаете , EPIPEи если вы читаете writeинструкцию , вы увидите , что вы получите , EPIPEкогда

fd подключен к каналу или гнезду которого чтение конца закрыт.

Вы получаете эту ошибку , потому что вы открываете конец чтения трубы в неблокирующем режиме, что означает , что readвызов не будет блокировать и ждать , пока данные будут получены, а когда readвызов немедленно вернуть закрыть трубу и выйти из процесса.

Это означает, что при запуске писателя не один ждет данных, которые вы пишете, и вы получите сообщение об ошибке.

Вы должны запустить чтение и писатель в обратном порядке: сначала писатель так пишет в трубу, а затем читателя прочитать данные из трубы.

Ответил 16/03/2016 в 17:14
источник пользователем

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