Boost logo

Boost :

Subject: Re: [boost] [gsoc] Boost.Process done
From: Ilya Sokolov (ilyasokol_at_[hidden])
Date: 2010-09-01 10:55:27


On 01.09.2010 1:47, Boris Schaeling wrote:
> 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.

class stream // I don't like this name
{
public:
     virtual ~stream() {};
     // create_child() calls this method
     virtual void create_parent_and_child_end(handle&, handle&);
};


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk