Не могу найти определение setenv
или чего-то подобного в стандарте.
тогда как getenv
, кажется, есть и доступен в переносимых версиях как в стандартных библиотеках Windows, так и в posix.
Короче говоря, есть ли причина или обсуждение того, почему это может быть?
поэтому я предполагаю, что не существует стандартного переносимого способа, и что мне нужно будет определить реализацию для каждой ОС, будет ли это точным?
Возможно, или измените свой дизайн, чтобы вам не нужно было изменять среду (например, создавать дочерний процесс в новой среде). Практичность во многом зависит от того, сколько операционных систем вам необходимо поддерживать. Часто люди зацикливаются на «переносимом» коде, но планируют запускать его только на «большой тройке»: Linux, Mac и Windows.
на самом деле пытался написать модульный тест для ответа, который я только что дал, и обнаружил, что сборки Windows не работают, когда я запускаю их через CI. возможно, придется немного переработать ситуацию.
@paddy man putenv
в моей системе Arch Linux ничего не говорит о том, что функция устарела.
man putenv
в моей системе говорит: Функция getenv()
соответствует стандарту ISO/IEC 9899:1990 («ISO C90»). Функции setenv()
, putenv()
и unsetenv()
соответствуют стандарту IEEE Std 1003.1-2001 («POSIX.1»).
Я понятия не имел, что getenv
является частью стандарта! Узнавайте что-то новое каждый день.
getenv()
полезноВы можете использовать его для получения данных об окружающей среде в качестве входных данных для вашей программы. Это основная цель таблицы окружения оболочки — предоставить пользователю возможность изменять поведение системных программ.
Например, в Linux переменная среды $LS_COLORS
позволяет изменить цвета, используемые для отображения информации о каталоге, с помощью программы ls
(список каталогов). Каждый пользователь может установить свою собственную цветовую схему, которая будет использоваться при отображении списка файлов с помощью ls
, даже если ls
является системной программой.
putenv()
бесполезно (как правило)Программа может изменять свою таблицу окружения, но не может изменять таблицу окружения других программ, например родительской оболочки! Это сделано специально и является функцией безопасности.
И *nixen, и Windows имеют функции, позволяющие добавлять или изменять переменные в таблице окружения текущего процесса. Это полезно при создании дочернего процесса, который можно явно инициализировать для наследования таблицы окружения текущего процесса. Но такое поведение в значительной степени является специализированной потребностью, поэтому нет веских аргументов для включения такой функции в стандарт C.
It used to be possible to sneakily modify other processes’ environment tables on Windows, assuming you had sufficient permissions to do so, but such behavior has been made much more difficult since XP or so.
Я не согласен с утверждением «putenv()
бесполезно».
Откуда вы знаете, что комментатор - это тот, кто проголосовал против? Это настолько распространенное явление, что сводит меня с ума. Я часто комментирую пост, содержащий какую-то критическую обратную связь, а затем вообще не голосую, но потому, что именно я оставил комментарий, который примерно совпал с моментом, когда человек узнал, что был комментарий и отрицательный голос, внезапно Я плохой парень. Было бы полезно иметь это в виду, прежде чем делать поспешные выводы. На самом деле, любые жалобы на отрицательные голоса — это дурной тон. Мы все это сделали. Я, конечно, сделал это. Потом я понял, какой это плохой вид.
Добавлю, что для того, чтобы свести на нет один голос «за», нужно 5 голосов «против». Если вас беспокоит увеличение количества повторений, то это ваш критерий. Если ваш чистый прирост репутации составляет -10 или меньше, считайте это явным признаком проблемы с контентом, а не проблемой сообщества. Все, что меньше этого значения, следует либо игнорировать как энтропию, либо рассматривать как обратную связь о необходимости улучшить ответ. Прямо сейчас ваши голоса составляют +1/-1, поэтому ваша чистая репутация равна +8, а в какой-то момент, возможно, была -2. Я не вижу проблемы.
Вы ищете
putenv
. Однако я считаю, что это функция POSIX, она нестандартна и может быть устаревшей. Если бы мне пришлось догадываться, почему это не стандартно, я бы сказал, что это потому, что разные операционные системы могут иметь свои собственные правила изменения среды запущенного процесса. См. stackoverflow.com/questions/5873029/…