The new std.process is ready for review

Steven Schveighoffer schveiguy at yahoo.com
Tue Mar 12 14:39:47 PDT 2013


On Tue, 12 Mar 2013 17:18:43 -0400, Lars T. Kyllingstad  
<public at kyllingen.net> wrote:

> On Tuesday, 12 March 2013 at 14:10:34 UTC, Steven Schveighoffer wrote:
>> On Tue, 12 Mar 2013 03:31:30 -0400, Lars T. Kyllingstad  
>> <public at kyllingen.net> wrote:
>>>
>>> If you omit the AA parameter altogether, the child inherits the  
>>> parent's environment.  A null pointer is passed as 'envz' to  
>>> spawnProcessImpl(), which in turn passes this straight to  
>>> CreateProcess() on Windows and replaces it by 'environ' on POSIX.
>>>
>>> If you do specify the AA parameter, it is passed through toEnvz() on  
>>> its way to spawnProcessImpl().  If the AA is empty/null, toEnvz() will  
>>> create an empty (but non-null) environment block, and the child's  
>>> environment will be empty.
>>
>> I understand that point.  I am a little concerned, however, that  
>> passing null as env results in clearing the child environment.  These  
>> concerns are simply that the most common desire is to inherit the  
>> environment, and that there is no parameter that simply says "inherit  
>> parent environment," you have to call a different function.
>
> I'd be very interested to hear if you have a suggestion for a better way  
> to do it, keeping in mind that there needs to be *some* way to clear the  
> environment too.

Sadly, no I don't.  I had hoped [] would allocate an empty AA, but it  
fails to compile.

Note that you can "hack" it by setting a single environment variable which  
nobody will ever use.

i.e. spawnProcess("blah.exe", ["_____":"_____"]);

But that is really, really ugly.

>
>> I suppose it's no different than exec, which you have to call the right  
>> function depending on what you want.
>>
>> So this sounds fine.  The toEnvz still should be fixed to add an extra  
>> null, I'm assuming you're doing that right? :)
>
> Yes.  I have some local modifications based on the discussion here,  
> which I haven't pushed yet.  Waiting for you guys to finish debating the  
> file descriptor issue. ;)

I think all are in agreement at this point that closing the files between  
fork and exec is a good solution.  Whether or not to ALSO set F_CLOEXEC  
wherever Phobos opens a file descriptor is an additional matter.

As a fallback to standard unix behavior, we can have a Config option that  
says "don't do the close thing".

-Steve


More information about the Digitalmars-d mailing list