管道损坏,FIFO文件

时间:2016-03-16 19:02:08

标签: c++ c

我正在尝试使用FIFO文件的程序,但我将Broken pipe作为输出。这是代码 -

#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”作为输出。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

你的写作发生在你开始读者之前。当您写入管道并且没有读卡器时,您会收到SIGPIPE。

在此特定设计中,您需要使用重试逻辑处理 SIGPIPE。

答案 1 :(得分:1)

您收到的错误是EPIPE,如果您阅读write手册,则会看到

}时出现EPIPE
  

fd连接到读取结束的管道或套接字。

您收到此错误是因为您以非阻止模式打开管道的读取端,这意味着read调用不会阻止并等待接收数据,而是read立即调用将关闭管道并退出该过程。

这意味着当您运行编写器时,没有人在等待您编写的数据并且您收到错误。

您需要以相反的顺序运行读取和写入:首先是写入器,然后写入管道,然后然后读取器从管道读取数据。