I’m assuming that OS X’s method for setting a pthread’s cwd is private API.  
Unless a better way to accomplish the same end-goal is in the works, is there 
any way to expose it?

In regards to Linux, the more I look at this, the less attractive posix_spawn() 
appears as a way of implementing this on that platform.  I’ll likely have a 
better idea how to approach this following some prototyping later tonight, but 
my current line of thinking involves vfork() -> unshare() -> chdir() -> 
execve().

Dan

> On Dec 18, 2015, at 12:39 PM, Pierre Habouzit <pie...@habouzit.net> wrote:
> 
> FWIW Glibc implements posix_spawn on posix platforms in terms of {,v}fork + 
> execve.
> So that means that SIGCHLD can be used.
> 
> I don’t think linux has per-thread wd, since linux has had atcalls for a very 
> long time, which makes this system interface not useful and only weird 
> (pthread_{,f}chdir).
> 
> I don’t think there’s a good way to fix this beside asking for POSIX to have 
> a posix_spawnattr_setwd(attr, const char *); or changing it around the spawn, 
> which of course, is bad and racy
> 
> The other alternative is to use a trampoline execv() when -[NSTask 
> currentDirectoryPath] has been set that will just chdir() and exec's again. 
> it’s not really pretty but does the job. Given that this should be the 
> exception and not the rule, maybe that’s acceptable.
> 
> 
> -Pierre
> 
>> On Dec 18, 2015, at 11:37 AM, David Smith via swift-corelibs-dev 
>> <swift-corelibs-dev@swift.org> wrote:
>> 
>> One issue that we ran into in the ObjC NSTask is setting the current working 
>> directory in the child process. We worked around the lack of an API for that 
>> by using per-thread working directories, which is kind of awful. I'm not up 
>> to date on what the best approach to use for this on Linux would be; it 
>> sounds like clone() can do it, but I don't know if that's exposed at the 
>> posix_spawn level at all.
>> 
>>      David
>> 
>>> On Dec 18, 2015, at 11:08 AM, Dan Stenmark via swift-corelibs-dev 
>>> <swift-corelibs-dev@swift.org> wrote:
>>> 
>>> I hope to take a crack at implementing some of NSTask this weekend.  What 
>>> are the recommended posix_spawnattr_t flags that should be set?  Do we also 
>>> want to take the opportunity to expose the ability to override some of 
>>> these flags (like POSIX_SPAWN_SETPGROUP) or do we want to avoid tying this 
>>> with posix_spawn() too closely?
>>> 
>>> Dan
>>> _______________________________________________
>>> swift-corelibs-dev mailing list
>>> swift-corelibs-dev@swift.org
>>> https://lists.swift.org/mailman/listinfo/swift-corelibs-dev
>> 
>> _______________________________________________
>> swift-corelibs-dev mailing list
>> swift-corelibs-dev@swift.org
>> https://lists.swift.org/mailman/listinfo/swift-corelibs-dev
> 

_______________________________________________
swift-corelibs-dev mailing list
swift-corelibs-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-corelibs-dev

Reply via email to