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