On Fri, Apr 18, 2008 at 03:20:56PM +0200, Jurjen Oskam wrote:

> Hi there,
> 
> I'm seeing something I don't quite understand concerning environment
> variables. (This is on an OpenBSD 4.2 amd64 system) I hope someone here
> can explain.
> 
> Given the following C-program:
> 
> #include <stdio.h>
> #include <errno.h>
> #include <stdlib.h>
> 
> int main(int argc, char **argv)
> {
>  char     *var1  = "FOO=TESTING";
>  int      rc;
> 
>  sleep(10);
> 
>  rc = putenv(var1);
>  if (rc < 0) {
>    printf("Error inserting <%s> in environ, errno = %d\n",
>            var1, errno);
>    return 1;
>  }
> 
>  printf("<%s> inserted in environ\n", var1);
>  sleep(10);
> 
>  return 0;
> }
> 
> In another terminal, I start a while loop:
> 
> $ while true ; do ps -eww | grep F[O]O ; sleep 1 ; done
> 
> When I run this program using "env -i ./a.out", the while loop
> in the other terminal doesn't show any output at all. ps doesn't
> seem to see FOO being put in the environment.
> 
> However, when I start the program using "env -i FOO=BAR ./a.out", the
> while loop in the other terminal shows this output, beginning right after
> the start of the program:
> 
> 20571 p2  I+      0:00.00 FOO=BAR (a.out)
> 20571 p2  I+      0:00.00 FOO=BAR (a.out)
> 20571 p2  I+      0:00.00 FOO=BAR (a.out)
> 20571 p2  I+      0:00.00 FOO=BAR (a.out)
> 20571 p2  I+      0:00.00 FOO=BAR (a.out)
> 20571 p2  I+      0:00.00 FOO=BAR (a.out)
> 20571 p2  I+      0:00.00 FOO=BAR (a.out)
> 20571 p2  I+      0:00.00 FOO=BAR (a.out)
> 20571 p2  I+      0:00.00 FOO=BAR (a.out)
> 20571 p2  I+      0:00.00 FOO=BAR (a.out)
> 20571 p2  I+      0:00.00 FOO=TESTING (a.out)
> 20571 p2  I+      0:00.00 FOO=TESTING (a.out)
> 20571 p2  I+      0:00.00 FOO=TESTING (a.out)
> 20571 p2  I+      0:00.00 FOO=TESTING (a.out)
> 20571 p2  I+      0:00.00 FOO=TESTING (a.out)
> 20571 p2  I+      0:00.00 FOO=TESTING (a.out)
> 20571 p2  I+      0:00.00 FOO=TESTING (a.out)
> 20571 p2  I+      0:00.00 FOO=TESTING (a.out)
> 20571 p2  I+      0:00.00 FOO=TESTING (a.out)
> 20571 p2  I+      0:00.00 FOO=TESTING (a.out)
> 
> 
> So ps does show FOO, *and* it shows the value of FOO changing after
> ten seconds.
> 
> I don't understand this behaviour. On another system (AIX), ps does pick
> up newly set environment variables. Is this behaviour implementation
> dependent? 

It might be the number of env vars is fixed in the process info, while
the environ array can be modified by the process, I suspect that
ps_nenvstr in struct ps_strings on the kernel side is not updated.

        -Otto

Reply via email to