Subject: Re: [boost] [gsoc] Boost.Process done
From: Boris Schaeling (boris_at_[hidden])
Date: 2010-08-31 17:47:41


On Tue, 31 Aug 2010 15:47:38 +0200, Ilya Sokolov <ilyasokol_at_[hidden]>
wrote:

> [...]I don't think it is good to create files in the constructors of
> classes derived from stream_behavior. Consider the following program
> (untested):
>
> bp::context ctx;
> ctx.stdout_behaviour = bp::behavior::pipe::create(
> bp::behavior::pipe::output_stream);
>
> // 1
> bp::child foo =
> bp::create_child("foo", std::vector<std::string>(), ctx);
>
> // 2
> bp::child bar =
> bp::create_child("bar", std::vector<std::string>(), ctx);
>
> AFAIU, the line 2 will throw exception "dup2() failed" on POSIX, and
> spawn child process with closed(!) stdout on Windows.

Yes, a context can not be reused. In the moment I have no idea though how
to change context without making the interface more complicated. In some
Boost.Process drafts stdout_behavior (and the other member variables) were
enumerations:

ctx.stdout_behavior = pipe;

That was really simple but is neither extensible nor can't data be
attached to a stream behavior (eg. a file descriptor to redirect to).

I tried to make the new stream behavior classes a bit easier to use by
adding the create() method as otherwise everyone would need to use
boost::shared_ptr directly (and probably wonder what boost::shared_ptr has
to do with setting stream behaviors). But I'm open for proposals how to
improve context.

Boris