2017-12-03 2 views
1

다음 코드는 async_read를 자식 프로세스에 연결하여 async_read를 수행하려는 실제 코드에서 단순화했습니다. 아이 프로세스에서 나는 "ls"라고 부릅니다. 그냥 테스트로하고 그 결과를 얻기 위해 비동기 읽기를 원합니다. 다음을 반환합니다.async_read async_read on 데이터가없는 자식 프로세스

왜 이런 일이 발생합니까? 이상적으로 나는 "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' il – sehe

답변

1

당신은 당신은 0 바이트를 읽어 크기 0

의 벡터로 읽습니다. 그것이 당신이 요구 한 것입니다.

나는 streambuf를 사용하고 EOF까지 읽는 것이 좋습니다. 당신이 정말로 run()을 원하지 않았다하지 않는 한 또한, 반환 결코 work 드롭 :

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 
관련 문제