Почему в стандарте C++ определен getenv, а не setenv?

Не могу найти определение setenv или чего-то подобного в стандарте.

тогда как getenv, кажется, есть и доступен в переносимых версиях как в стандартных библиотеках Windows, так и в posix.

Короче говоря, есть ли причина или обсуждение того, почему это может быть?

Вы ищете putenv. Однако я считаю, что это функция POSIX, она нестандартна и может быть устаревшей. Если бы мне пришлось догадываться, почему это не стандартно, я бы сказал, что это потому, что разные операционные системы могут иметь свои собственные правила изменения среды запущенного процесса. См. stackoverflow.com/questions/5873029/…

paddy 29.04.2024 04:11

поэтому я предполагаю, что не существует стандартного переносимого способа, и что мне нужно будет определить реализацию для каждой ОС, будет ли это точным?

Martein Txz 29.04.2024 04:16

Возможно, или измените свой дизайн, чтобы вам не нужно было изменять среду (например, создавать дочерний процесс в новой среде). Практичность во многом зависит от того, сколько операционных систем вам необходимо поддерживать. Часто люди зацикливаются на «переносимом» коде, но планируют запускать его только на «большой тройке»: Linux, Mac и Windows.

paddy 29.04.2024 04:19

на самом деле пытался написать модульный тест для ответа, который я только что дал, и обнаружил, что сборки Windows не работают, когда я запускаю их через CI. возможно, придется немного переработать ситуацию.

Martein Txz 29.04.2024 04:22

@paddy man putenv в моей системе Arch Linux ничего не говорит о том, что функция устарела.

Jesper Juhl 29.04.2024 04:24
man putenv в моей системе говорит: Функция getenv() соответствует стандарту ISO/IEC 9899:1990 («ISO C90»). Функции setenv(), putenv() и unsetenv() соответствуют стандарту IEEE Std 1003.1-2001 («POSIX.1»).
Eljay 29.04.2024 04:42

Я понятия не имел, что getenv является частью стандарта! Узнавайте что-то новое каждый день.

Mark Ransom 29.04.2024 04:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
7
136
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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() бесполезно».

Chukwujiobi Canon 29.04.2024 06:18

Откуда вы знаете, что комментатор - это тот, кто проголосовал против? Это настолько распространенное явление, что сводит меня с ума. Я часто комментирую пост, содержащий какую-то критическую обратную связь, а затем вообще не голосую, но потому, что именно я оставил комментарий, который примерно совпал с моментом, когда человек узнал, что был комментарий и отрицательный голос, внезапно Я плохой парень. Было бы полезно иметь это в виду, прежде чем делать поспешные выводы. На самом деле, любые жалобы на отрицательные голоса — это дурной тон. Мы все это сделали. Я, конечно, сделал это. Потом я понял, какой это плохой вид.

paddy 29.04.2024 09:06

Добавлю, что для того, чтобы свести на нет один голос «за», нужно 5 голосов «против». Если вас беспокоит увеличение количества повторений, то это ваш критерий. Если ваш чистый прирост репутации составляет -10 или меньше, считайте это явным признаком проблемы с контентом, а не проблемой сообщества. Все, что меньше этого значения, следует либо игнорировать как энтропию, либо рассматривать как обратную связь о необходимости улучшить ответ. Прямо сейчас ваши голоса составляют +1/-1, поэтому ваша чистая репутация равна +8, а в какой-то момент, возможно, была -2. Я не вижу проблемы.

paddy 29.04.2024 09:15

Другие вопросы по теме