A quem pertencem as variáveis de ambiente?

2

De vários sites, li que getenv é uma chamada de sistema. No entanto, não consigo encontrar nenhuma referência a sys_getenv .

Estou tentando entender exatamente quais são as "variáveis de ambiente". Eles são parte do kernel ou um mecanismo do shell? Indo um pouco mais a fundo, descobri que getenv faz parte da biblioteca C padrão. Infelizmente isso não me ajuda a responder a minha pergunta original.

    
por nowox 24.06.2015 / 20:00

3 respostas

4

Para quem as variáveis de ambiente pertencem?

Cada processo possui suas próprias variáveis de ambiente.

Notas:

  • Todo processo tem um bloco de ambiente que contém um conjunto de variáveis de ambiente e seus valores.

  • As variáveis de ambiente são herdadas do processo pai e são uma cópia do bloco pai.

  • Por padrão, um processo filho herda as variáveis de ambiente de seu processo pai.

  • Um processo pode optar por passar um ambiente diferente para um processo filho, criando um novo bloco de ambiente e passando-o para o processo filho quando for criado.

  • Não é possível para nenhum processo alterar as variáveis de ambiente de qualquer outro processo.

O que é getenv

getenv é função na Biblioteca C Padrão.

Name

getenv, secure_getenv - get an environment variable Synopsis

#include <stdlib.h>

char *getenv(const char *name);

char *secure_getenv(const char *name);

Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

secure_getenv(): _GNU_SOURCE

Description

The getenv() function searches the environment list to find the environment variable name, and returns a pointer to the corresponding value string.

The GNU-specific secure_getenv() function is just like getenv() except that it returns NULL in cases where "secure execution" is required.

...

Source getenv (3) - Página man do Linux

Outras leituras

getenv() do código-fonte

"Estou tentando entender quais são as" variáveis de ambiente "exatamente."

Veja a resposta link por Scott para uma explicação detalhada a partir de uma perspectiva de codificação.

    
por 24.06.2015 / 20:10
7

Você entende a lista de argumentos? Por exemplo, se você digitar ls -l foo bar , o shell executa /bin/ls com uma lista de argumentos que consiste em quatro strings:

    ls -l foo bar

considerando que, se você digitar ls -l "foo bar" (ou ls -l 'foo bar' ou ls -l foo\ bar ) o shell executa /bin/ls com uma lista de argumentos que consiste em três strings:

    ls -l foo bar

e ls -l * podem te dar algo como:

    ls -l ant bat cat dog etc

, ou seja, quaisquer arquivos que estejam no diretório atual.

Bem,

o ambiente é basicamente apenas uma segunda lista de argumentos.

Talvez seja melhor dizer que "o ambiente é uma segunda lista de strings, estruturado exatamente como a lista de argumentos, mas tratado de forma diferente ”. Se você olhar para execve (2) , você verá que a chamada do sistema execve recebe três argumentos:

  • char * filename, (o programa a ser executado; por exemplo, /bin/ls )
  • char * argv [],
  • char * envp []

Sempre que algum programa executa qualquer outro programa, ele está basicamente usando execve (possivelmente através de alguma função de nível superior, como execl ), então está passando uma lista de argumentos e uma lista de ambientes. A lista de ambientes parece muito com a saída de env ; por exemplo,

    HOME=/home/fred USERNAME=fred PATH=/bin:/usr/bin:… TERM=xterm SHELL=/bin/bash PWD=/home/fred/Super_User_files
    etc…

O programa executado pode fazer o que quiser com a lista de ambientes - olhar para ele (por exemplo, com getenv ), modificá-lo ou ignorá-lo - as mesmas coisas que pode fazer com a lista de argumentos. Quando um programa executa outro programa com uma das funções de execução de nível mais alto, como execl , chama automaticamente execve com a mesma lista de ambiente que foi passada para o programa. E é isso que acontece em 90% dos programas que executam outros programas. Mas os shells permitem modificar o ambiente e então eles usam execve diretamente para passar o ambiente especificado pelo usuário mais atualizado para todos os programas que são executados.

TL; DR

Todo processo contém sua lista de ambientes na memória, da mesma forma que contém sua lista de argumentos e variáveis ordinárias. O ambiente é passado de programa para programa através do mecanismo exec . Funções de biblioteca facilitam para um programa passar seu próprio ambiente para qualquer outro programa que seja executado. (Naturalmente, o ambiente é preservado (copiado) em um fork , assim como todas as outras memórias locais. O kernel não sabe nada sobre o meio ambiente exceto pelo fato de que fornece um meio para que o ambiente seja passado por execve .

    
por 24.06.2015 / 21:38
2

getenv faz parte da Biblioteca C Padrão. Então, em C você precisaria incluir stdlib.h .

    
por 24.06.2015 / 20:06