ifstream管道和多个(顺序)编写器

时间:2014-08-15 15:32:54

标签: c++ named-pipes

我正在使用std::ifstream从Linux上的命名管道中读取。如果文件的写入结束,我无法继续通过流读取管道。出于某种原因,我必须再次clear()close()open()来继续阅读。这是预期的吗?当作者close() open()close()随意管道时,如何避免管道上的open()

背景:我认为我必须做的close() open()会导致作者有时会收到我想避免的SIGPIPE

更多详细信息 - 我正在使用此代码来读取流

// read single line
stream_("/tmp/delme", std::ios::in|std::ios::binary);
std::getline(stream_, output_filename_);
std::cout << "got filename: " << output_filename_ << std::endl;
#if 0
// this fixes the problem
stream_.clear();
stream_.close();
stream_.open("/tmp/delme", std::ios::in|std::ios::binary);
// now the read blocks until data is available
#endif

// read more binary data
const int hsize = 4096+4;
std::array<char, hsize> b;
stream_.read(&b[0], hsize);
std::string tmp(std::begin(b), std::begin(b)+hsize);
std::cout << "got header: " << tmp << std::endl;

/tmp/delme是我的烟斗。我做echo "foo" > /tmp/delme我在foo中得到output_filename_但是流不会阻塞,(它应该,没有更多的数据),它继续读取垃圾。如果我启用ifdef内的代码,它就可以运行。为什么呢?

谢谢, 塞巴斯蒂安

1 个答案:

答案 0 :(得分:0)

由于您使用std :: getLine(),可能需要使用额外的&#34; \ n&#34;表示一行的结束:

echo -e "foo\n" > /tmp/delme

而不仅仅是

echo "foo" > /tmp/delme

至少应该摆脱垃圾阅读。