Я немного подумывал о переменных окружения и имею несколько вопросов/наблюдений.
-
putenv(char *string);
Этот вызов кажется смертельно ошибочным. Поскольку он не копирует переданную строку, вы не можете называть ее локальным, и нет никакой гарантии, что выделенная кучей строка не будет перезаписана или случайно удалена. Кроме того (хотя я его не тестировал), поскольку одно использование переменных среды - это передача значений в дочернюю среду, это кажется бесполезным, если ребенок вызывает одну из функций
exec*()
. В чем я ошибаюсь? -
Персональная страница Linux указывает, что glibc 2.0-2.1.1 отказался от вышеуказанного поведения и начал копировать строку, но это привело к утечке памяти, которая была исправлена в glibc 2.1.2. Мне непонятно, что такое утечка памяти и как она была исправлена.
-
setenv()
копирует строку, но я точно не знаю, как это работает. Пространство для среды выделяется при загрузке процесса, но оно фиксируется. Существует ли какое-то (произвольное?) Соглашение? Например, выделение большего количества слотов в массиве указателей строки env, чем в настоящее время, и перемещение нулевого ограничивающего указателя вниз по мере необходимости? Является ли память для новой (скопированной) строки, выделенной в адресном пространстве самой среды, и если она слишком велика, чтобы соответствовать вам, просто получите ENOMEM? -
Учитывая вышеизложенные проблемы, есть ли основания предпочесть
putenv()
надsetenv()
?