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.