IO e outros comandos shell quando um programa não é iniciado por um terminal

5

Tenho vários iniciadores no meu ambiente de trabalho para vários programas e existe uma definição "executar num terminal" para esses iniciadores.

Quando eu verifico essa configuração, o programa é executado a partir de um terminal e registra sua saída lá. Eu suponho que ele poderia ler stdin do terminal também.

No entanto: o que acontece com o pedido de veiculação quando o programa não é executado por um terminal? Além disso, o que acontece quando executo comandos do sistema (shell) de um programa como esse?

Existe um shell "em segundo plano" que executa esses programas? Ou todo programa recebe seu shell através do qual ele faz interface com o resto do sistema?

    
por jcora 01.03.2013 / 11:51

1 resposta

2

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.

    
por 01.03.2013 / 13:54