sts писал(а):И?
И ничего. Механизм переменных окружения не предназначен ни для хранения ни для передачи сетевого имени.
Допустим у нас есть процесс, который параллельно запускает два дочерних процесса. Но перед запуском первого он устанавливает в своих переменных окружения HOSTNAME в значение 123, а перед запуском второго процесса ещё раз устанавливает HOSTNAME в 456. Тогда у первого дочернего процесса переменная окружения останется в значении 123, т.к. он получит копию этих переменных от родительского процесса во время его запуска, а у второго эта же переменная будет иметь значение 456. Даже если один из дочерних процессов изменит значение этих переменных скажем на 789, то об этом не узнает родительский процесс и у него значение HOSTNAME останется равным 456.
Начальные значения переменных окружения хранятся в файлах инициализации оболочки и для их перманентной установки надо прописать эти переменные в этих файлах. Но даже после этого изменения вступят в силу только после запуска новой копии оболочки или перезагрузки системы. В старом процессе оболочки переменные среды останутся без изменения.
Итого: механизм переменных окружения, к которому обращается GetEnvironmentVariable, не подходит для хранения значения системного параметра типа hostname. При изменении этого параметра обновлённое значение должно стать доступным всем процессам сразу же. Поэтому лучше не ограничиваться однократным получением hostname, а запрашивать его у системы периодически. Хотя бы раз в 100 мс через соответствующий системный вызов или функцию-переходник, чтобы реагировать на изменения, которые сделают в других процессах. И я не имею ввиду, что надо циклически его запрашивать и реагировать на изменения. Достаточно глобальную переменную, хранящую имя hostname, снабдить дополнительным значением time и перед использованием этой переменной проверять интервал времени прошедший с записанной точки. Если прошло больше 100 мс, то выполнять повторный системный вызов, а не использовать старое значение. Или просто каждый раз запрашивать его и не страдать фигней. А вот bash запрашивает значение hostname однократно при запуске и не реагирует на изменения этого параметра. Поэтому не стоит полагаться на значение локальной переменной HOSTNAME предоставляемой bash.
Кстати, в Windows после изменения hostname вам все так же предлагают перезагрузить компьютер, чтобы изменения вступили в силу. Хотя там оно так же не хранится переменных окружения, но изменения должны получить системные программы и сервисы, а механизма уведомления об этих изменениях нету.
Добавлено спустя 20 минут 57 секунд:P.S. Обратите внимание на этот скриншот, который я показывал в предыдущем ответе
Screenshot_20231220_193243.png
А именно посмотрите на значение распечатанные в правом нижнем углу. Это значения с вершины стека программы после её запуска. Первое из них это 1 - количество параметров в командной строке, а сразу после этой 1 (int argc) идёт два значения (char *argv[]). Первое это указатель на строку ./testFASM т.к. gdb запускал программу именно таким образом, а второе это 0 - конец массива. И вот сразу после этого массива в стеке расположен ещё один массив (char *environ[]), который содержит указатели на строки с переменными окружения и заканчивается нулевым указателем. Сами строки, судя по значению указателей, тоже находятся в стеке программы. Для архитектуры x86_64 минимальный размер страницы памяти составляет 4096 байт (или 0x1000). Т.е. программа получили полную копию этих данных и они не обновляются динамически т.к. стек ветви программы это сугубо интимный компонент программы, а все значения, включая и сами строки с именами и значениями переменных, уместились на одной странице памяти. Ядро для составления виртуального адресного пространства пользовательских программ использует страничный механизм и разделяемой памятью может быть только кратная страницам область памяти. А тут все на одной странице, включая и вершину стека. Но стек программы явно не может быть в общедоступной области памяти.
У вас нет необходимых прав для просмотра вложений в этом сообщении.