|
Boost : |
Subject: Re: [boost] Process library with child process events
From: Jeff Flinn (Jeffrey.Flinn_at_[hidden])
Date: 2011-06-06 08:54:01
Giorgio Zoppi wrote:
> I think that It is too complicated. Probally I need a more simple
> layer. Something that i can use:
>
> std:vector<string> arg;
> p = process('/usr/bin/vi', args=('bob',));
> p.start();
> p.join();
The current design allows you to do the above, where make_child creates
and starts a child process. A monitor allows you to join with a
child_process.
using namespace boost::process;
child c = make_child(paths(/usr/bin/vi), args(bob));
monitor(c).join();
> Something that has an object process_pool.
Can you expand on what you mean by process pool? I've run into a use
case where I'd like to launch several processes(one per core) and join
all. Is that along the lines of what you were thinking? I do this now in
client code but will try to get this formalized and added to the library.
> A pipe object between processes, a queue object a signal handler and
> nothing else.
The library provides a 'directed' pipe, which is currently named
boost::process::file_descriptor_ray(yep, in search of a better name). It
allows communication between parent and/or child processes. One use is
to access a child's std_out via a stream by the parent.
For example I needed to grab the output of an exe to parse it's version
information:
namespace io = boost::iostreams;
typedef io::stream<io::file_descriptor_source> source;
file_descriptor_ray ray;
monitor m(make_child(paths(exe), Args(arg), std_out_to(ray)));
ray.m_sink.close(); // currently req's manual closing
source redirected(ray.m_source);
Tuple version(parse(redirected)); // parse the istream
m.join();
Jeff
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk