Quando um programa é iniciado (por uma das famílias exec(3)
de chamadas do sistema), ele herda o ambiente (por exemplo, variáveis de shell export
ed) e os arquivos abertos do pai. O que é feito ao iniciar um programa é um fork(2)
, o filho configura o ambiente e os arquivos e, em seguida, exec(3)
s o novo programa. Quando um shell faz isso, STDIN, STDOUT e STDERR são conectados ao terminal. O que qualquer lançador gráfico faz depende dele, mas deve conectá-los a /dev/null
(de onde deve vir a entrada do teclado e para onde deve ir a saída?).
Se um programa lançado assim, por sua vez, chama exec(3)
, é como explicado acima. system(3)
é um pouco mais complexo, pois gera um shell para fazer a análise de linha de comando e assim por diante, e esse shell então exec(3)
s o comando. Mas a mecânica é a mesma: os arquivos são herdados, assim como o ambiente.