2012/4/4 <[email protected]>: > Output of strace: > > brk(0) = 0x21a5000 brk(0x21c6000) > = 0x21c6000 write(1, "a2: MYVALUE\n", 12a2: MYVALUE ) > = 12 execve("./b.out", [0], [/* 57 vars */]) = 0 brk(0) > = 0x189e000 access("/etc/ld.so.nohwcap", F_OK) = -1 > ENOENT (No such file or > directory) > > As you can see, it uses execve() behind the scenes to be able to pass the > modified > local environment. > > This is libc-specific behaviour.
I think I cannot agree. IMO its a POSIX specified behavior. libc, at least in this case, just implements the POSIX specs: http://pubs.opengroup.org/onlinepubs/007904975/functions/exec.html And as the ouptut of executing a.out shows, libc implements it correctly: "For those forms not containing an envp pointer ( execl(), execv(), execlp(), and execvp()), the environment for the new process image shall be taken from the external variable environ in the calling process.", which libc achieves by calling execve() with the current environ, effectively just filling the prescribed default. 'extern **char environ' is no [kernel] magic*, it's just an ordinary pointer variable sitting in the process address space, it's only special in that it gets set (by means which are not important to this discussion) before main() starts executing. -- jan (*) One can e.g. happily set it directly to any other value: 14:41 myname@tux64:~/tmp/c$ cat a.c #include <stdlib.h> #include <stdio.h> #include <unistd.h> extern char **environ; main() { char *e = getenv("MYVAR"); printf("a1: %s\n", e); setenv("MYVAR", "MYVALUE", 1); e = getenv("MYVAR"); printf("a2: %s\n", e); environ = NULL; e = getenv("MYVAR"); printf("a3: %s\n", e); } 14:41 myname@tux64:~/tmp/c$ gcc a.c && ./a.out a1: (null) a2: MYVALUE a3: (null) 14:41 myname@tux64:~/tmp/c$ -- _______________________________________________ Lazarus mailing list [email protected] http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
