Может ли кто-нибудь объяснить мне, как работает переменная окружения в C++?

Я пытаюсь написать свою собственную версию getenv. Я еще не начал, поэтому сначала пытаюсь понять окружающую среду.

Если это глобально, почему я не могу напечатать его в своей функции? Является ли окружение строкой или массивом символов? Почему environ является двойным указателем? Спасибо.

#include <iostream>
#include <string>
#include <stdlib.h>
void myenv(char*);

void myenv(char* name)
{
std::cout<<environ;
}

int main(int argc, char** argv, char** environ)
{
myenv("PATH");
}

person Sal Rosa    schedule 08.02.2013    source источник


Ответы (3)


environ это char**. Он указывает на массив char*, каждый из которых указывает на строку char. Так что это похоже на массив строк. Например, environ[0] — это строка с завершающим нулем. Попробуйте распечатать это:

std::cout << environ[0];

Каждая строка является переменной окружения в форме name=value. Они соответствуют переменным среды для текущего процесса.

Однако environ не является функцией C++ и не является переносимой. Он исходит из заголовка unistd.h, который определен POSIX.

person Joseph Mansfield    schedule 08.02.2013

Это char **, содержащий env. переменные

extern char **environ;

http://pubs.opengroup.org/onlinepubs/007908799/xsh/environ.html

person Tom    schedule 08.02.2013

Просто добавление;

Является ли окружение строкой или массивом символов? Почему environ является двойным указателем?

environ обращается к массиву указателей, каждый из которых указывает на первый адрес строки символов. Окружение — это не одна строка, это набор строк (ну, окружение может быть пустым, так что «куча» может быть равна нулю).

environ[0] contains a pointer to the 'first' environment variable.
environ[1] contains a pointer to the 'second'.

environ[0][0] would reference the first character of the 'first' name in the environment.
environ[1][0] would reference the first character of the 'second' name.

Или, если нет по крайней мере двух переменных окружения, environ[1] указывает на область segfault или, что еще хуже, на случайную память.

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

person Brian Tiffin    schedule 08.02.2013