使用istream从命名管道读取

时间:2016-11-22 11:39:45

标签: c++ linux named-pipes

是否可以使用c ++(stl)从命名管道(mkfifo)读取 使用流 - 因此没有事先为char *buffer[MAX_SIZE]定义读取操作?

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

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

2 个答案:

答案 0 :(得分:6)

使用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!”打印到标准输出。

答案 1 :(得分:4)

对你的程序进行管道传输没有什么不可思议的,它只是从流中转换你的cin读数,而不是从控制台输入用户的输入:Linux terminal pipe to my C++ program

简单地看一下这个问题的编辑历史将会显示这个问题已经从它的原始版本大大改进,感谢Konrad Rudolph(这个问题的另一个回答者。)为了进一步的卑鄙,我要去将他的解决方案中的两个用于将流淤到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