【发布时间】:2016-11-22 11:39:45
【问题描述】:
是否可以使用 c++ (stl) 从命名管道 (mkfifo) 读取
使用流 - 因此没有为读取操作提前定义char *buffer[MAX_SIZE]?
我想读到缓冲区结束并将结果放入std::string。
(当前方法:bytes = read(fd, buffer, sizeof(buffer)); 需要提前分配某种缓冲区。)
【问题讨论】:
标签: c++ linux named-pipes
是否可以使用 c++ (stl) 从命名管道 (mkfifo) 读取
使用流 - 因此没有为读取操作提前定义char *buffer[MAX_SIZE]?
我想读到缓冲区结束并将结果放入std::string。
(当前方法:bytes = read(fd, buffer, sizeof(buffer)); 需要提前分配某种缓冲区。)
【问题讨论】:
标签: c++ linux named-pipes
使用mkfifo 创建的命名管道的行为类似于常规文件。因此可以使用std::ifstream 和std::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 从流中读取而不是用户从控制台输入:Linux terminal pipe to my C++ program
简单浏览一下这个问题的编辑历史就会发现这个问题比原来的版本有了很大的改进,这要归功于Konrad Rudolph(这个问题的另一个回答者。)为了进一步卑鄙,我将刮掉 2他将流啜饮到string 的解决方案:
const string mkfifo{ istreambuf_iterator<char>(cin), istreambuf_iterator<char>() };
istringstream temp;
temp << cin.rdbuf();
const auto mkfifo = temp.str();
您可以在各自的帖子中了解每个人的优缺点。要使用此代码,假设您的编译程序名为 main,您可以像这样通过管道传递给它:
mkfifo named_pipe
echo "lorem ipsum" > named_pipe
./main named_pipe
【讨论】:
getline 匹配的函数,因为 EOF 的类型错误 (int)。
static_cast<char>(EOF) 写入管道会发生什么情况,然后是更多内容(真正的问题:我不知道会发生什么以及行为是否得到保证,但我怀疑流会被过早截断,我不认为将EOF 转换为char 是一个通用的解决方案。
EOF。在研究了你的评论之后,我显然没有我想象的那么聪明:(
reading 到预分配的 std::string 相当。相比之下,使用 libc++,后者的效率要高得多。 :-(