3

С нескольких сайтов я читал, что getenv - системный вызов. Однако я не могу найти ссылку на sys_getenv .

Я пытаюсь понять, что такое "переменные среды". Являются ли они частью ядра или механизма оболочки? Покопавшись немного глубже, я обнаружил, что getenv является частью стандартной библиотеки C. К сожалению, это не помогает мне ответить на мой первоначальный вопрос.

3 ответа3

7

Вы понимаете список аргументов?  Например, если вы ls -l foo bar , оболочка выполнит /bin/ls со списком аргументов, состоящим из четырех строк:

    ls -l foo bar

тогда как, если вы ls -l "foo bar" (или ls -l 'foo bar' или ls -l foo\ bar), оболочка выполнит /bin/ls со списком аргументов, состоящим из трех строк:

    ls -l foo bar

и ls -l * может дать вам что-то вроде:

    ls -l ant bat cat dog etc

т.е. все файлы в текущем каталоге.

Что ж,

среда в основном просто список второго аргумента.

Возможно, было бы лучше сказать:«среда - это второй список строк, структурированный точно так же, как список аргументов, но обработанный по-другому».  Если вы посмотрите на execve(2), то увидите, что системный вызов execve принимает три аргумента:

  • char * имя файла, (программа для выполнения; например, /bin/ls )
  • char * argv [],
  • char * envp []

Всякий раз, когда какая-либо программа выполняет любую другую программу, она в основном использует execve (возможно, через какую-то высокоуровневую функцию, например, execl), поэтому она передает список аргументов и список окружения.  Список окружения очень похож на вывод env ; например,

    HOME=/home/fred USERNAME=fred PATH=/bin:/usr/bin:… TERM=xterm SHELL=/bin/bash PWD=/home/fred/Super_User_files
    так далее…

Выполняемая программа может делать со списком окружения все, что захочет - просматривать его (например, с помощью getenv), изменять его или игнорировать - то же самое, что можно делать со списком аргументов.  Когда программа выполняет другую программу с одной из функций выполнения более высокого уровня, например execl , она автоматически вызывает execve с тем же списком среды, который был передан программе.  И это то, что происходит в 90% программ, которые выполняют другие программы.  Но оболочки позволяют вам изменять среду, а затем они используют execve напрямую для передачи самой современной пользовательской среды каждой программе, которую она запускает.

TL; DR

Каждый процесс содержит свой список среды в памяти так же, как он содержит список аргументов и обычные переменные.  Среда передается из программы в программу через механизм exec .  Библиотечные функции позволяют программе легко передавать свою среду любой другой программе, которую она запускает.  (Естественно, среда сохраняется (копируется) по всей fork , как и вся остальная локальная память.)  Ядро на самом деле ничего не знает об окружающей среде, за исключением того факта, что оно предоставляет средства для передачи среды через execve .

4

Кому принадлежат переменные среды?

Каждый процесс имеет свои собственные переменные среды.

Заметки:

  • Каждый процесс имеет блок среды, который содержит набор переменных среды и их значений.

  • Переменные среды наследуются от родительского процесса и являются копией родительского блока.

  • По умолчанию дочерний процесс наследует переменные среды своего родительского процесса.

  • Процесс может выбрать передачу другой среды дочернему процессу, создав новый блок среды и передав его дочернему процессу при его создании.

  • Ни один процесс не может изменять переменные среды любого другого процесса.


Что такое гетенв

getenv является функцией в стандартной библиотеке C.

название

getenv, secure_getenv - получить переменную окружения

#include <stdlib.h>

char *getenv(const char *name);

char *secure_getenv(const char *name);

Требования к макросу тестирования возможностей для glibc (см. Feature_test_macros (7)):

secure_getenv (): _GNU_SOURCE

Описание

Функция getenv () выполняет поиск в списке среды, чтобы найти имя переменной среды, и возвращает указатель на соответствующую строку значения.

Специфичная для GNU функция secure_getenv () аналогична getenv () за исключением того, что она возвращает NULL в случаях, когда требуется "безопасное выполнение".

...

Источник getenv(3) - справочная страница по Linux


дальнейшее чтение

getenv() исходный код


«Я пытаюсь понять, что такое" переменные среды ".»

Смотрите ответ https://superuser.com/a/932191/337631 Скотта для подробного объяснения с точки зрения кодирования.

2

getenv является частью стандартной библиотеки C. Итак, в C вам нужно включить stdlib.h .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .