2017-12-03 212 views
1

我有下面的代碼,這是從我真正的代碼簡化,我試圖做一個async_read連接到子進程的async_pipe。在孩子的過程中,我打電話給「ls」。只是一個測試,我希望我的異步閱讀獲得結果。它返回以下內容async_pipe async_pipe子進程沒有給出數據

$ ./a.out 
system:0 
0 

爲什麼會發生這種情況我找不出來?理想情況下,我想替換「ls」。有一個長時間的運行過程,我可以在線閱讀async_read。

#include <boost/asio.hpp> 
#include <boost/bind.hpp> 
#include <iostream> 
#include <fstream> 
#include <unistd.h> 
#include <string.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <boost/process.hpp> 

namespace bp = boost::process; 

class test { 
private: 
    boost::asio::io_service ios; 
    boost::asio::io_service::work work; 
    bp::async_pipe ap; 
    std::vector<char> buf; 

public: 
    test() 
    : ios(), work(ios), ap(ios) { 
    } 

    void read(
     const boost::system::error_code& ec, 
     std::size_t size) { 
    std::cout << ec << std::endl; 
    std::cout << size << std::endl; 
    } 

    void run() { 
    bp::child c(bp::search_path("ls"), ".", bp::std_out > ap); 
    boost::asio::async_read(ap, boost::asio::buffer(buf), 
     boost::bind(&test::read, 
        this, 
        boost::asio::placeholders::error, 
        boost::asio::placeholders::bytes_transferred)); 

    ios.run(); 
    } 
}; 

int main() { 
    test c; 
    c.run(); 
} 
+0

通過'async_read_until'或'ap.read_some'這一行可以更方便地閱讀行 – sehe

回答

1

您讀入大小爲0

的向量你讀0字節。這就是你要求的。

我建議使用streambuf並且直到EOF讀取。此外,降work除非你真的想run()永不返回:

Live On Coliru

#include <boost/asio.hpp> 
#include <boost/bind.hpp> 
#include <boost/process.hpp> 
#include <iostream> 

namespace bp = boost::process; 

class test { 
    private: 
    boost::asio::io_service ios; 
    bp::async_pipe ap; 
    boost::asio::streambuf buf; 

    public: 
    test() : ios(), ap(ios) {} 

    void read(const boost::system::error_code &ec, std::size_t size) { 
     std::cout << ec.message() << "\n"; 
     std::cout << size << "\n"; 
     std::cout << &buf << std::flush; 
    } 

    void run() { 
     bp::child c(bp::search_path("ls"), ".", bp::std_out > ap, ios); 

     async_read(ap, buf, boost::bind(&test::read, this, _1, _2)); 

     ios.run(); 
    } 
}; 

int main() { 
    test c; 
    c.run(); 
} 

打印,例如

End of file 
15 
a.out 
main.cpp