Extend faq.using to discuss fork failures

Ryan Johnson ryan.johnson@cs.utoronto.ca
Tue Aug 30 13:42:00 GMT 2011


Hi Corinna,

That sounds reasonable, though I suspect we'd want want to keep the 
concluding bits in the FAQ as well. Unfortunately, summertime free time 
has come to an end so I don't know when I'll get to this next. Perhaps a 
good compromise for now would be for you to post only the first FAQ 
question? That would at least cut traffic to the cygwin ML a bit.

Ryan

On 30/08/2011 2:00 AM, Corinna Vinschen wrote:
> Hi Ryan,
>
> Thanks for the FAQ entry.  I had a look now, finally.  Two nits:
>
> On Aug 25 22:08, Ryan Johnson wrote:
>> Index: winsup/doc/faq-using.xml
>> ===================================================================
>> RCS file: /cvs/src/src/winsup/doc/faq-using.xml,v
>> retrieving revision 1.35
>> diff -u -r1.35 faq-using.xml
>> --- winsup/doc/faq-using.xml	4 Aug 2011 18:25:41 -0000	1.35
>> +++ winsup/doc/faq-using.xml	26 Aug 2011 01:58:44 -0000
>> @@ -1199,3 +1199,92 @@
>>   </listitem>
>>   </itemizedlist></para>
>>   </answer></qandaentry>
>> +<qandaentry id='faq.using.fixing-fork-failures'>
>> +<question><para>Calls to<literal>fork</literal>  fail a lot. How can
>> +  I fix the problem?</para></question>
>> +<answer>
>> +
>> +<para>Unix-like applications make extensive use of
>> +<literal>fork</literal>, a function which spawns an exact copy of
>> +  the running process. Notable fork-using applications include bash
>> +  (and bash scripts), emacs, gcc, make, perl, python, and
>> +  ruby. Unfortunately, the Windows ecosystem is quite hostile to a
>> +  reliable fork implementation, leading to error messages such as:</para>
>> +<para><itemizedlist>
>> +<listitem>unable to remap<emphasis>$dll</emphasis>  to same address as parent</listitem>
>> +<listitem>couldn't allocate heap</listitem>
>> +<listitem>died waiting for dll loading</listitem>
>> +<listitem>child -1 - died waiting for longjmp before initialization</listitem>
>> +<listitem>STATUS_ACCESS_VIOLATION</listitem>
>> +<listitem>resource temporarily unavailable</listitem>
>> +</itemizedlist></para>
>> +<para>If you find that frequent fork failures interfere with normal
>> +  use of cygwin, please try the following:</para>
>> +<para><itemizedlist>
>> +<listitem>Restart whatever process is trying (and failing) to use
>> +<literal>fork</literal>. Sometimes Windows sets up a process
>> +    environment that is even more hostile to fork than usual.</listitem>
>> +<listitem>Ensure that you have eliminated (not just disabled) all
>> +    software on the BLODA (see<ulink
>> +    url="http://cygwin.com/faq/faq.using.html#faq.using.bloda"
>> +    />)</listitem>
>> +<listitem>Install the 'rebase' package, read its README in
>> +<literal>/usr/share/doc/Cygwin</literal>, and follow the
>> +    instructions there to run 'rebaseall'.</listitem>
> The rebase package is always installed since it's part of the Base
> category.  This entry should be rephrased accordingly.
>
>> +</itemizedlist></para>
>> +<para>Please note that installing new packages or updating existing
>> +  ones often undoes the effects of rebaseall and cause fork failures
>> +  to reappear. If so, just run rebaseall again.
>> +</para></answer>
>> +</qandaentry>
>> +<qandaentry id='faq.using.why-fork-fails'>
>> +<question><para>Why does<literal>fork</literal>  fail so much,
>> +  anyway? (or: Why does<literal>fork</literal>  still fail even though
>> +  I ran rebaseall?)</para></question>
>> +<answer>
>> +<para>The semantics of<literal>fork</literal>  require that a forked
>> +  child process have<emphasis>exactly</emphasis>  the same address
>> +  space layout as its parent. However, Windows provides no native
>> +  support for cloning address space between processes and several
>> +  features actively undermine a reliable<literal>fork</literal>
>> +  implementation.
> Everything else which follows from here is a good description of the
> inner workings, but that shouldn't go into the FAQ.  What about creating
> a link to the user's guide "Process Creation" section here.  The technical
> details could then go into the "Process Creation" section.
>
>> +  Three issues are especially prevalent:</para>
>> +<para><itemizedlist>
>> +<listitem>DLL base address collisions. Unlike *nix shared
>> +    libraries, which use "position-independent code", Windows shared
>> +    libraries assume a fixed base address. Whenever the hard-wired
>> +    address ranges of two DLLs collide (which occurs quite often), the
>> +    Windows loader must "rebase" one of them to a different
>> +    address. However, it does not resolve collisions consistently, and
>> +    may rebase a different dll and/or move it to a different address
>> +    every time. Cygwin can usually compensate for this effect when it
>> +    involves libraries opened dynamically, but collisions among
>> +    statically-linked dlls (dependencies known at compile time) are
>> +    resolved before<literal>cygwin1.dll</literal>  initializes and
>> +    cannot be fixed afterward. This problem can only be solved by
>> +    removing the base address conflicts which cause the problem,
>> +    usually using the<literal>rebaseall</literal>  package.</listitem>
>> +
>> +<listitem>Address space layout randomization (ASLR). Starting with
>> +    Vista, Windows implements ASLR, which means that thread stacks,
>> +    heap, memory-mapped files, and statically-linked dlls are placed
>> +    at different (random) locations in each process. This behavior
>> +    interferes with a proper<literal>fork</literal>, and if an
>> +    unmovable object (process heap or system dll) ends up at the wrong
>> +    location, Cygwin can do nothing to compensate (though it will
>> +    retry a few times automatically). In a 64-bit system, marking
>> +    executables as large address-ware and rebasing dlls to high
>> +    addresses has been reported to help, as ASLR affects only the
>> +    lower 2GB of address space.</listitem>
>> +
>> +<listitem>DLL injection by BLODA. Badly-behaved applications which
>> +    inject dlls into other processes often manage to clobber important
>> +    sections of the child's address space, leading to base address
>> +    collisions which rebasing cannot fix. The only way to resolve this
>> +    problem is to remove (usually uninstall) the offending
>> +    app.</listitem></itemizedlist></para>
>> +<para>In summary, current Windows implementations make it
>> +    impossible to implement a perfectly reliable fork, and occasional
>> +    fork failures are inevitable. PTC.
>> +</para>
>> +</answer>
>> +</qandaentry>
>
> Corinna
>



More information about the Cygwin-patches mailing list