This is the mail archive of the cygwin@sourceware.cygnus.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[BUG] environment not inherited by fork


The following code illustrates a problem with cygwin.dll b18 (the Cygnus
release version).

#include <stdio.h>
main(int argc, char **argv)
{
putenv("FOO=BAR");
printf("parent FOO=%s\n", getenv("FOO"));
if (fork() > 0) {
    wait(0);
    exit(0);
}
printf("child FOO=%s\n", getenv("FOO"));
exit(0);
}

It erroneously produces the following output:

parent FOO=BAR
child FOO=(null)

This is due to the fact that there are two environ pointers being maintained:
one is in the "user space" the other is in "dll space".  The one in "dll space"
is the one that is updated by putenv() but fork overwrites this with the
"user space" one when it copies stuff.  I think that, if possible, the
routines in the .dll that manipulate the environment should only be using
the environ table in the user space.  Trying to keep the two pointers in
sync would otherwise be very difficult.

This unfortunately would require, I think, changes to the newlib code
to accomodate the gnuwin32 code.
-- 
http://www.bbc.com/	cgf@bbc.com			"Strange how unreal
VMS=>UNIX Solutions	Boston Business Computing	 the real can be."
-
For help on using this list (especially unsubscribing), send a message to
"gnu-win32-request@cygnus.com" with one line of text: "help".


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]