
On 01.09.2010 1:47, Boris Schaeling wrote:
On Tue, 31 Aug 2010 15:47:38 +0200, Ilya Sokolov <ilyasokol@gmail.com> 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&); };