Howdy,

I just came across the apr_procattr_child_{in,out,err}_set() 
implementations for UNIX and got to wonder about the semantics of those 
functions. Their doxygen comments are lacking a bit of preciseness.

What I understand is, that by using apr_procattr_io_set() it is defined, 
which of stdin/stdout/stderr the child process inherits from its parents 
and for which pipes are created. I also see what 
apr_procattr_child_{in,out,err}_set() shall do, if I pass a pipe. But in 
case one or both of the supplied file handles are NULL, the implementation 
behaves a bit strange, IMHO.

If I want to direct my child process' stdout to a log file I have already 
open, I would intuitively pass the pair (<log file>, NULL) to 
apr_procattr_child_out_set(). What the implementation does in this case, is 
to create a pipe and then replace the child part with my log file, but keep 
the parent part.

Even stranger I find the behavior in case of passing a (NULL, NULL) pair. I 
would expect the inheritence behavior from the parent process to be 
restored, but instead a pipe is installed.

Personally I would consider it straight forward, if the functions would 
always close the file handles that are there and set them to NULL and then 
dup() the non-NULL arguments. A (NULL, non-NULL) argument pair doesn't seem 
to make much sense, so it could be considered an error case.

Does that sound reasonable or do I miss something?

CU, Ingo

Reply via email to