Строки, используемые переменными среды в текущем состоянии процесса, не обязательно находятся в непрерывной памяти.Некоторые переменные среды могут быть удалены кодом запуска, изменены или добавлены путем вызова putenv
или setenv
.Эти изменения не обязательно отражаются в массиве строк, который envz_get
проверяет, потому что они выполняются путем изменения указателей (не строк) в массиве среды.
Вот пример, демонстрирующий это:
#include <assert.h>
#include <envz.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main (int argc, char **argv, char **envp)
{
assert (envp[0] != NULL);
assert (envp[1] != NULL);
char *first_name = strndup (envp[0], strcspn (envp[0], "="));
char *second_name = strndup (envp[1], strcspn (envp[1], "="));
printf ("removing: %s\n", second_name);
unsetenv (second_name);
printf ("getenv (%s): %s\n", first_name, getenv (first_name));
size_t size = 0;
for (size_t i = 0; envp[i] != NULL; ++i)
size += strlen (envp[i]) + 1;
printf ("envz_get (%s): %s\n",
first_name, envz_get (envp[0], size, first_name));
printf ("getenv (%s): %s\n",
second_name, getenv (second_name));
printf ("envz_get (%s): %s\n",
second_name, envz_get (envp[0], size, second_name));
}
В моей системе это печатается так:
removing: LESSCLOSE
getenv (STY): 9173.pts-0.deneb
envz_get (STY): 9173.pts-0.deneb
getenv (LESSCLOSE): (null)
envz_get (LESSCLOSE): /usr/bin/lesspipe %s %s