管道boost :: iostreams没有任何输出

时间:2012-03-19 23:08:43

标签: c++ boost pipe

我正在尝试使用带有boost库的管道,我只想执行一个后台程序(例如:ls)并将其输出到一个字符串中(就像你可以用fopen和fread一样),但我真的不能为什么我没有这个代码的输出:

#include <iostream>
#include <cstdio>
#include <sstream>

#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/device/file_descriptor.hpp>

int
main(int argc, char** argv)
{
    using namespace boost::iostreams;

    if(argc < 2)  {
        return -1;
    }

    FILE* p = popen(argv[1], "r");

    if(! p)  {
        std::cerr << "error open pipe" << std::endl;

        return -2;
    }

    int fd = fileno(p);
    std::stringstream ss;
    ss << fd;
    std::string s = ss.str();

    file_descriptor_source pdesc(s);
    stream_buffer<file_descriptor_source> pstream(pdesc);

    std::istream is(&pstream);
    std::string out;

    while(is)  {
        std::getline(is, out);
        std::cout << out << std::endl;
    }

    pstream.close();
    pdesc.close();
    pclose(p);

    return 0;
}

提前致谢。

1 个答案:

答案 0 :(得分:2)

您似乎正在尝试从包含文件描述符编号的“路径”中打开boost::file_descriptor_source。但是,此名称的文件可能不存在。您可能想要使用的是这样的:

if (FILE* p = popen(argv[1], "r")) 
{
    boost::iostreams::file_descriptor_source d(fileno(p), boost::iostreams::close_handle);
    boost::iostreams::stream_buffer<boost::iostreams::file_descriptor_source> pstream(d);
    std::cout << &pstream;
    pclose(p);
}