I apologise if this gets posted twice, but my newsgroup client is acting up.

On Saturday, 23 February 2013 at 16:44:30 UTC, H. S. Teoh wrote:
I just looked over the docs. Looks very good!

Thanks! :)

Just a few minor comments:

- wait():
   - Some code examples would be nice.

The wait() documentation says "Examples: See the spawnProcess documentation", and provides a link. I didn't see any point in duplicating the examples there just for the sake of it.


- For the POSIX-specific version, I thought the Posix standard specifies that the actual return code / signal number should be
     extracted by means of system-specific macros (in C anyway)?
Wouldn't it be better to encapsulate this in a POD struct or something instead of exposing the implementation-specific values to
     the user?

Steve already answered this, but yes, the number returned by wait() has already been processed by these macros. wait() therefore has the same result on all POSIX systems.


- How do I wait for *any* child process to terminate, not just a
     specific Pid?

I will write a separate post about this shortly.


- execute() and shell(): I'm a bit concerned about returning the
*entire* output of a process as a string. What if the output generates too much output to store in a string? Would it be better to return a range instead (either a range of chars or range of lines maybe)? Or is this what pipeProcess was intended for? In any case, would it make sense to specify some kind of upper limit to the size of the output so that the program won't be vulnerable to bad subprocess behaviour
  (generate infinite output, etc.)?

Again, Steve answered this, but let me clarify: There are three layers of functionality in this module.

1. spawnProcess() gives you detailed control over process creation, in a cross-platform manner.

2. pipeProcess()/pipeShell() are convenience functions that take care of creating pipes to the child process for you, as this is a common use case. Use this if you need detailed control over what goes in and out of the process.

3. execute()/shell() are a second layer of convenience, if you just want a simple way to execute a process and retrieve its output. If there is any chance of the process producing vast amounts of output, you really should use pipeProcess() or even spawnProcess().

Of course, it is a simple matter to add an optional maxOutputSize parameter to execute() and an "overflow" flag to the returned tuple, but I think it adds more API clutter than it is worth. I'd love to hear others' opinions about it, though.


- ProcessException: are there any specific methods to help user code extract information about the error? Or is the user expected to check
  errno himself (on Posix; or whatever it is on Windows)?

Well, no. The thing is, ProcessException may be associated with an errno code, with a Windows GetLastError() code, or it may simply be a pure "D error" with no relation at all to the underlying C APIs.

Personally, I believe that the distinction between ProcessException (for process management errors) and StdioException (for I/O errors, mostly related to pipes) provides enough granularity for most use cases. I believe it's the best we can do in a cross-platform manner without inventing our own error codes and mapping them to errno/GetLastError() codes. If anyone needs the underlying OS error code, they can still retrieve them using the system-specific APIs.

Again, I am of course open for discussion about this.

Lars

Reply via email to