Вопросы о putenv () и setenv ()

Я немного подумал о переменных среды и у меня есть несколько вопросов / наблюдений.

  • putenv (char * string);

    Этот вызов кажется фатальным ошибочный. Поскольку он не копирует переданную строку, вы не можете вызвать ее с помощью локального, и нет гарантии, что строка, выделенная кучей, не будет перезаписана или случайно удалена. Кроме того (хотя я не тестировал), поскольку переменные среды используются только для передачи значений в дочернюю среду, это кажется бесполезным, если дочерний элемент вызывает одну из функций exec * () . Я ошибаюсь в этом?

  • На странице руководства Linux указано, что glibc 2.0-2.1.1 отказался от описанного выше поведения и начал копировать строку, но это привело к утечке памяти, которая была исправлена ​​в glibc 2.1.2. Мне не ясно, что это была за утечка памяти и как ее исправить.

  • setenv () копирует строку, но я не знаю точно, как это работает. При загрузке процесса выделяется пространство для среды, но оно фиксировано. Здесь работает какое-то (произвольное?) Соглашение? Например, выделять больше слотов в массиве указателей строк env, чем используется в настоящее время, и перемещать нулевой указатель завершения вниз по мере необходимости? Выделена ли память для новой (скопированной) строки в адресном пространстве самой среды, и если она слишком велика, вы просто получаете ENOMEM?

  • Учитывая вышеуказанные проблемы, есть ли причина предпочесть putenv () перед setenv () ?

38
задан curiousguy 20 January 2019 в 23:25
поделиться