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

Posted

技术标签:

【中文标题】ifstream 管道和多个(顺序)编写器【英文标题】:ifstream pipe and multiple (sequential) writers 【发布时间】:2014-08-15 15:32:54 【问题描述】:

我正在使用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" &gt; /tmp/delme,我在output_filename_ 中得到了foo,但是流并没有在那里阻塞,(应该没有更多数据),它继续读取垃圾。如果我在ifdef 中启用代码,它就可以工作。为什么?

谢谢, 塞巴斯蒂安

【问题讨论】:

【参考方案1】:

由于你使用了std::getLine(),也许你需要使用一个额外的“\n”来表示一行的结束:

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

而不仅仅是

echo "foo" > /tmp/delme

这至少应该摆脱垃圾阅读。

【讨论】:

感谢您的想法,但不,事实并非如此。 echo 在我的平台上自动输出 \n 。可以通过传递 -n 参数来防止它,但这不是我正在做的。

以上是关于ifstream 管道和多个(顺序)编写器的主要内容,如果未能解决你的问题,请参考以下文章

如何避免命名管道中的多个作者?

从命名管道、C 程序(编写器)和 Python(读取器)获取额外数据

cin.tellg 从管道接收输入时返回 -1

管道编写器可以判断阅读器何时阻塞吗?

是否有用于运行多个分类器的 Python 管道函数?

在pyspark中编写自定义NER和POS标记器,以在管道方法中用于文本输入的特征提取