是否有可能使用c ++(stl)使用stream从命名pipe道(mkfifo)读取 – 因此不会事先为读取操作定义char *buffer[MAX_SIZE]
?
我想读取,直到缓冲区结束并把结果放入std::string
。
(当前方法: bytes = read(fd, buffer, sizeof(buffer));
事先要求分配某种缓冲区。
用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终端管道到我的C + +程序
简单地看一下这个问题的编辑历史,就会发现这个问题已经从它的原始版本中得到了很大的改进,这要归功于康拉德·鲁道夫 ( Konrad Rudolph) (在这个问题上的另一个回答者)。在一个进一步的卑鄙行为中,我将去掉他的两个解决方案潺潺流水string
:
istreambuf_iterator
方法:
const string mkfifo{ istreambuf_iterator<char>(cin), istreambuf_iterator<char>() };
stringbuf
复制方法:
istringstream temp; temp << cin.rdbuf(); const auto mkfifo = temp.str();
你可以阅读各自职位的优缺点。 要使用这个代码,说你编译的程序被命名为main
你可以像这样管道化它:
mkfifo named_pipe echo "lorem ipsum" > named_pipe ./main named_pipe