使用 istream 从命名管道读取

using istream to read from named pipe

是否可以使用 C++ (stl) 从命名管道 (mkfifo) 中读取 使用流 - 因此不为读取操作提前定义 char *buffer[MAX_SIZE]

我想读到缓冲区结束并将结果放入std::string

(当前方法:bytes = read(fd, buffer, sizeof(buffer));需要提前分配某种缓冲区。)

使用 mkfifo 创建的命名管道与普通文件一样。因此可以使用 std::ifstreamstd::ofstream:

访问它们
#include <fstream>
#include <iostream>

int main(int, char** argv) {
    std::ifstream file{argv[1]};
    std::string line;
    std::getline(file, line);
    std::cout << line << '\n';
}

运行:

mkfifo foobar
./main foobar

其他地方:

echo 'Hello world!' > foobar

…这将导致 ./main 打印“Hello world!”到标准输出。

通过管道连接到您的程序并没有什么神奇之处,它只是将您的 cin 从流中读取而不是用户从控制台输入:

简单浏览一下这个问题的编辑历史就会发现这个问题比原来的版本有了很大的改进,这要归功于 Konrad Rudolph(这个问题的另一个回答者。)为了进一步卑鄙,我是打算抓取他的 2 个解决方案,将流注入 string:

istreambuf_iterator method:

const string mkfifo{ istreambuf_iterator<char>(cin), istreambuf_iterator<char>() };

stringbuf copy method:

istringstream temp;
temp << cin.rdbuf();
const auto mkfifo = temp.str();

您可以在各自的帖子中了解各自的优缺点。要使用此代码,假设您编译的程序名为 main,您可以像这样通过管道传递给它:

mkfifo named_pipe
echo "lorem ipsum" > named_pipe
./main named_pipe