Зачем нужна функция putenv, когда у нас есть переменная environ?
Здравствуйте
В ходе написания программы, которая будет изменять окружение процесса, столкнулся с таким вопросом: зачем нам нужна функция putenv() и как она кардинально может отличаться от простого доступа по указателю к переменной char** environ?
Какой смысл ее вводить? Если только безопасность ( в putenv есть проверка по типу, на сколько я понял ), можно добавить с помощью putenv() новую переменную окружения ну и банальное удобство. Хотя как по мне, особой разницы выносить это в отдельную функцию смысла нет, ради таких причин. Объясните пожалуйста суть, буду очень благодарен
как она кардинально может отличаться от простого доступа по указателю к переменной char** environ?
getenv получает значение одной переменной по имени, в отличии от environ который содержит все пары переменных которые ещё придётся парсить. putenv добавляет/изменяет пару имя-значение. Доступ через environ не позволяет этого сделать:
If the application modifies the pointers to which environ points, the behavior of all interfaces described in the System Interfaces volume of POSIX.1-2008 is undefined.
Почитал сорцы - теперь понял. У нас putenv к тому же еще и thread-safe. Ну на самом деле, работать изменение по environ будет, если новое значение переменной среды будет по размеру <= старого. А иначе вылетит SIGSEGV.
Ну и проблемы возникнут, если потом будем через putenv переменные добавлять.
> работать изменение по environ будет
Это вам просто везёт, что в конкретной реализации это работает.
На самом деле можно присвоить указателю environ другое значение и это будет работать как положено по стандарту POSIX. Главное не изменять указатели на которые он указывает.