|
Boost : |
Subject: Re: [boost] [gsoc] Boost.Process done
From: Jeremy Maitin-Shepard (jeremy_at_[hidden])
Date: 2010-09-10 13:49:12
On 09/10/2010 04:26 AM, Stewart, Robert wrote:
> [snip]
> The problem with the suggested approach is that Windows winds up
> with runtime errors if the child_fileno argument exceeds the
> range. It would be better to make that a compile time error.
> The only way to do that is to use a template with the fileno
> being a template argument. Whether that takes the form of a
> fileno class template or the fileno is a template argument for
> map_file_descriptor (which must then be a member function
> template), is another matter.
For POSIX, it would be unfortunate to require the child fileno be
specified as a compile-time constant. However, perhaps the interface
can be constructed so that stdin, stdout, stderr are handled at
compile-time on Windows (e.g. being distinct types), while allowing the
same syntax to result in runtime handling on POSIX.
>
>> - I think it would be cleaner for the POSIX and Windows
>> extension interfaces to be in the form of a callback function
>> (templated or boost::function), rather than a subclass of
>> context that overrides the setup function.
>
> Why do you make that assertion? What becomes cleaner?
For one thing, with C++1x lambdas, it would be more convenient to define
a function than to define a subclass, particularly if you are making use
of variable capture. Likewise, if using boost::bind, boost phoenix,
etc. Also, it is unclear if you are supposed to be modifying the
environment, stream behaviors, etc. from within the setup function, or
whether they have already been processed (I would guess already
processed) --- if so, why at such a late stage? --- and if not, why is
setup a method of context, if none of the state in context is actually
relevant?
>
>> - It seems that natively on Windows, unlike on POSIX, there is
>> no notion of an array of command line arguments --- there is
>> just a single string command line. It seems it would be useful
>> for Boost Process to allow a single string command line to be
>> specified directly, in addition to the existing array
>> (Container) interface which presumably does some sort of
>> encoding into a single string on Windows. Perhaps create_child
>> can simply distinguish (at compile-time) between being passed a
>> range of char and being passed a range of range of char.
>
> A general facility for converting between the two representations
> would be most helpful. For example, one may wish to report the
> command line, so accessing it as a single string is useful on
> POSIX and Windows systems. Likewise, one may wish to process the
> arguments one at a time, as with argc/argv, even on Windows.
Possibly that would be useful, though the encoding of an array of
strings into a single string could be somewhat tricky, and would likely
need to differ between POSIX and Windows. On both platforms, you would
presumably wrap all arguments in double quotes, but the handling of
quotes and backslashes would differ: on POSIX, you would presumably use
C-style quoting of quote and backslash characters, which is also what
most of the shells use. On Windows, it seems there is a different
convention, in which backslashes not followed by a quote are not
interpreted as escape characters, as described at
http://msdn.microsoft.com/en-us/library/17w5ykft.aspx
and
http://msdn.microsoft.com/en-us/library/ms647232.aspx
I'm not sure whether there is any useful convention for
non-printable/control characters on either platform --- perhaps best to
leave them unchanged, since they are rare anyway.
However, given that you have to manually invoke a function like
CommandLineToArgvW to obtain the command-line as an array on Windows, I
expect that many programs use their own parsing, which may have
different behavior.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk