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

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

谢谢, 塞巴斯蒂安

最佳答案

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

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

不仅仅是

echo "foo" > /tmp/delme

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

关于c++ - ifstream 管道和多个(顺序)编写器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25329377/

相关文章:

windows - 使用命名管道作为文件

c++ - 拒绝访问注册表

c++ - C 和 C++ .lib 文件是否可移植?

node.js - 如何在 node.js 中创建命名管道?

c# - 可以连接到命名管道的客户端数

multithreading - CreateNamedPipe ERROR_INVALID_NAME

c++ - glad.h 给出包含 opengl header 的错误

python - boost::python 参数类型不匹配

c++ - 强制 coredump on glib free 错误

c - 命名管道窗口的行为