O ambiente é uma lista de strings do formulário var=value
( por convenção ) que é passado como o argumento 3 rd para a chamada do sistema execve ().
Essa lista é colocada em algum lugar na pilha do processo quando começa a executar o novo comando como na lista de argumentos (outra lista de strings passou como segundo argumento para execve()
).
Em programas que usam a libc (a maioria), um código de inicialização chamado antes da função main()
ser chamado, disponibiliza essas cadeias de ambiente como a matriz environ
.
O libc
também fornece com putenv
e setenv
funções que podem modificar (uma cópia) dessa lista que o programa recebeu. Essa cópia mantida, modificada, será então passada para o próximo comando executado pelo processo ou qualquer um dos seus filhos através das funções execvp()
/ execl()
/ system()
/ popen()
... da libc (que acabam chamando a chamada do sistema execve()
.
Agora, quando você cria uma lista de cadeias de caracteres que passa manualmente para a chamada de sistema execve()
, pode passar strings como foo
(sem um caractere =
) ou =bar
(com uma variável vazia name), setenv
não permitirá que você faça isso ( setenv("", "bar", 1)
é rejeitado).
setenv("a=b", "c")
também será rejeitado. Portanto, as strings que serão definidas por setenv
sempre terão o formato x=y
, em que x
pode não estar vazio.
Essa é a única restrição (também aplicada por putenv
). Bem, aqueles que estão sendo seqüências terminadas em NUL, é claro que o caractere NUL não pode aparecer no nome ou valor da variável.
setenv("*", "x", 1)
, ou setenv("\n\n", "", 1)
estão todos OK em relação a setenv()
ou o kernel. Agora, se você vai ser capaz de fazer algo útil com isso, é outra questão.