Как перечислить все переменные среды в приложении c/c++

Я знаю, что при программировании на С++ я могу получить доступ к отдельным переменным среды с помощью getenv.

Я также знаю, что в терминале os x я могу перечислить ВСЕ текущие переменные среды, используя env.

Мне интересно получить полный список переменных среды, доступных для моей запущенной программы на С++. Есть ли функция c/c++, которая будет их перечислять? Другими словами, есть ли способ вызвать env из моего кода на С++?


person dB'    schedule 27.05.2013    source источник


Ответы (3)


Используйте глобальную переменную environ. Это указатель с завершающим нулем на массив строк в формате name=value. Вот миниатюрный клон env:

#include <stdlib.h>
#include <stdio.h>

extern char **environ;

int main(int argc, char **argv) {
    for(char **current = environ; *current; current++) {
        puts(*current);
    }
    return EXIT_SUCCESS;
}
person icktoofay    schedule 27.05.2013
comment
Конечно. man getenv имеет внизу (в OS X, о котором упоминает ОП) раздел SEE ALSO, в котором упоминается environ(7). Итак, man environ предоставляет справочную страницу, которая объясняет это. apropos environment включает и эту страницу. Это не предназначено для RTFM, а является намеком на то, что разделы SEE ALSO справочных страниц могут быть проверены. - person Norman Gray; 02.07.2013

Вы можете использовать непереносимую envp. аргумент для main:

int main(int argc,char* argv[], char** envp)

и в качестве бонуса, очевидно, на OSX у вас есть яблоко, которое дает вам другую информацию, предоставленную ОС:

int main(int argc, char **argv, char **envp, char **apple)

Но для чего он используется? Ну, Apple может использовать вектор яблока для передачи любых «скрытых» параметров, которые они хотят, в любую программу. И они действительно этим пользуются. В настоящее время apple[0] содержит путь, по которому исполняемый двоичный файл был найден на диске. Что ты говоришь? Чем яблоко[0] отличается от argv[0]? Разница в том, что argv[0] может быть установлено в любое произвольное значение при вызове execve(2). Например, оболочки часто отличают оболочку входа в систему от обычной оболочки, запуская оболочки входа в систему с первым символом в argv[0], являющимся -

person Shafik Yaghmour    schedule 27.05.2013

Упс, я забыл, что system позволяет выполнять команды терминала.

Этот фрагмент дает мне то, что мне нужно:

std::cout << "List of environment variables: << std::endl;
system("env");
person dB'    schedule 27.05.2013
comment
Это не делает переменную доступной для вашей программы, она просто выводит ее на стандартный вывод. - person Keith Thompson; 21.02.2014