#опытным
В POSIX-совместимых системах (Linux, macOS, BSD) существует еще один альтернатива параметру
envp в функции main() и функции std::getenv() для получения значений переменных окружения. Это глобальная переменная extern char** environ, которая предоставляет прямой доступ ко всему окружению процесса.В сущности, у нее такой же функционал, что и у envp, только эту переменную видно из любой единицы трансляции, так как это глобальная переменная, имеющая внешнюю линковку.
#include <stdio.h>
extern char** environ;
void foo() {
for(char** env = environ; *env != NULL; env++) {
printf("%s\n", *env);
}
}
В остальном, особенности работы такие же, как и у envp.
Но если мы уже зашли по колено в Posix, то там есть функция setenv, которая позволяет менять переменные окружения уже в ходе выполнения программы:
#include <stdlib.h>
int setenv(const char *envname, const char *envval, int overwrite);
И эти изменения будут видеть все ранее оговоренные методы получения значений env переменных. Однако это все не тредсейф и нужна защита в виде мьютексов.
Не встречал кейсов изменения переменных окружения. Наверное, это можно использовать, как костыльный механизм общения между модулями программы. Если у кого есть достойные примеры применения setenv, черканите в комментах, буду благодарен.
Интересно, как много в С|С++ методов получения окружения процесса. Но рекомендуется использовать конечно стандартный вариант std::getenv.
Be visiable. Stay cool.
#NONSTANDARD