Pipe Broken, FIFO soubor

hlasů
45

Snažím program používat FIFO soubor, ale já začínám poškozeného potrubí jako výstup. Zde je kód -

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

Výstup: Pod FIFO je název souboru a Hello je obsah.

./a.out fifo hello &

Writer

./a.out fifo
Reader

[1]+  Broken pipe  

Měl bych dostat „Hello“ jako výstup. Může někdo pomoci?

Položena 16/03/2016 v 17:02
uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
1

Váš zápis se děje před zahájením své čtenáře. Když píšete na trubce a nemá čtenáři dostanete sigpipe.

V tomto konkrétním provedení, je třeba zvládnout sigpipe s opakování logiku.

Odpovězeno 16/03/2016 v 17:13
zdroj uživatelem

hlasů
1

Chyba dostanete je EPIPE, a pokud jste si přečíst writemanuál, uvidíte, že dostanete EPIPE, když

fd je připojen k potrubí nebo zásuvky, jejíž konec je uzavřen čtení.

Dostanete tuto chybu, protože otevření konec čtení trubky v blokování zákazu režimu, což znamená, že readhovor nebude blokovat a čekat na údaje, které mají být přijaty, místo toho, když se readokamžitě vrátí volání zavření potrubí a ukončit proces.

To znamená, že při spuštění spisovatele je čeká na data, psát nikdo a dostanete chybu.

Je třeba spustit čtení a spisovatel v opačném pořadí: První spisovatel tak zapíše do potrubí, a pak čtenáře ke čtení dat z potrubí.

Odpovězeno 16/03/2016 v 17:14
zdroj uživatelem

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