
Hi Boris, Thank you very much for your help. See below for proposed code for your library. On Mon, Sep 17, 2012 at 7:29 PM, Alfredo Correa <alfredo.correa@gmail.com> wrote:
On Sun, Sep 16, 2012 at 11:54 AM, Boris Schaeling [via Boost] <ml-node+s2283326n4635834h32@n4.nabble.com> wrote: I guess it is not not late to provide "convenience" pistream/postream/piostream classes that wrap up all the complexity.
If you don't mind, let me propose the following wrapper class for the casual user. I had to play a little bit with protected inheritance to make it work. I remember other cases where protected inheritance was necessary in order to define derived stream classes. I kept it simple to communicate the idea, I guess more template const Initializer& can be passed through the constructor. An equivalent one can be made for postream, and even piostream. // ... // Copyright (c) 2012 Alfredo Correa // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) /** * \file boost/process/pistream.hpp * * Convenience pistream class prototype */ #include <boost/process.hpp> // version 0.5 #include <boost/iostreams/device/file_descriptor.hpp> #include <boost/iostreams/stream.hpp> #include <string> namespace boost{ namespace process{ class pistream : protected pipe, protected iostreams::file_descriptor_source, public iostreams::stream<boost::iostreams::file_descriptor_source>{ public: pistream(const std::string& cmd) : pipe(create_pipe()), file_descriptor_source(this->source, iostreams::close_handle), stream<file_descriptor_source>((file_descriptor_source&)(*this)){ execute( initializers::run_exe(cmd), initializers::bind_stdout(iostreams::file_descriptor_sink(this->sink, iostreams::close_handle)) ); } }; }} // example code int main(){ boost::process::pistream pis("/usr/bin/ls"); std::string s; while(std::getline(pis, s)){ std::cout << "read: " << s << std::endl; } } Thanks, Alfredo
boost::pistream pis("/bin/ls"); for(std::string line; std::getline(pis, line); ){ std::cout << "line: " << line << std::endl; } std::cout << "end" << std::endl;
[...]ok, since there is no conclusive solution, so maybe to end this thread let me file this as a possible bug (or confirm it is the expected behavior), the symptom is that the program never ends (linux, fedora 17, boost 1.48):
Can you try this program? It works for me:
Thanks, the program worked (boost 1.48) and I posted the solution in stakoverflow: http://stackoverflow.com/a/12469478/225186 I don't have any idea why this works vs. the other. I wonder if I have to do the same for doing output to the process.
Thanks, Alfredo
----- #include <boost/process.hpp> #include <boost/iostreams/device/file_descriptor.hpp> #include <boost/iostreams/stream.hpp> #include <string>
using namespace boost::process; using namespace boost::process::initializers; using namespace boost::iostreams;
int main() { boost::process::pipe p = create_pipe(); { file_descriptor_sink sink(p.sink, close_handle); execute(run_exe("/bin/ls"), bind_stdout(sink)); } file_descriptor_source source(p.source, close_handle); stream<file_descriptor_source> is(source); std::string s; while(std::getline(is, s)){ std::cout << "read: " << s << std::endl; } std::clog << "end" << std::endl; } -----
Boris
[...]
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
________________________________ If you reply to this email, your message will be added to the discussion below: http://boost.2283326.n4.nabble.com/How-to-bind-program-termination-with-end-... To unsubscribe from How to bind program termination with end-of-stream in Boost.Process 0.5?, click here. NAML
-- Alfredo
-- Alfredo -- View this message in context: http://boost.2283326.n4.nabble.com/How-to-bind-program-termination-with-end-... Sent from the Boost - Dev mailing list archive at Nabble.com.