Por que os shells chamam fork ()?

28

Quando um processo é iniciado a partir de um shell, por que o shell se separa antes de executar o processo?

Por exemplo, quando o usuário insere grep blabla foo , por que o shell não pode chamar exec() no grep sem um shell filho?

Além disso, quando um shell se bifurca dentro de um emulador de terminal GUI, ele inicia outro emulador de terminal? (como pts/13 começando pts/14 )

    
por user3122885 02.03.2014 / 18:39

3 respostas

33

Quando você chama um método da família exec , ele não cria um novo processo; em vez disso, exec substitui a memória do processo atual e o conjunto de instruções, etc., pelo processo que você deseja executar.

Como exemplo, você deseja executar grep usando exec. bash é um processo (que possui memória separada, espaço de endereço). Agora, quando você chamar exec(grep) , exec substituirá a memória, o espaço de endereço, o conjunto de instruções etc do processo atual por grep's data. Isso significa que bash processo não existirá mais. Como resultado, você não pode voltar ao terminal depois de concluir o comando grep . É por isso que os métodos da família exec nunca retornam. Você não pode executar nenhum código após o exec; é inacessível.

    
por shantanu 02.03.2014 / 18:49
3

De acordo com o pts , verifique você mesmo: em um shell, execute

echo $$ 

para saber o seu processo-id (PID), tenho por exemplo

echo $$
29296

Em seguida, execute por exemplo sleep 60 e, em outro terminal

(0)samsung-romano:~% ps -edao pid,ppid,tty,command | grep 29296 | grep -v grep
29296  2343 pts/11   zsh
29499 29296 pts/11   sleep 60

Portanto, não, em geral você tem o mesmo tty associado ao processo. (Note que este é seu sleep porque tem seu shell como pai).

    
por Rmano 02.03.2014 / 19:08
1

Para cada comando (exemplo: grep) que você emite no prompt do bash, você realmente pretende iniciar um novo processo e retornar ao prompt do bash após a execução.

Se o processo do shell (bash) chamar exec () para executar o grep, o processo do shell será substituído por grep. O grep funcionará bem, mas após a execução, o controle não pode retornar ao shell porque o processo bash já foi substituído.

Por esse motivo, o bash chama fork (), que não substitui o processo atual.

    
por FlowRaja 03.03.2014 / 18:45