Quais são os principais estágios de execução no Linux (como um programa basicamente é executado no Linux)?

5

Eu entendo que existem dois estágios de execução no Linux, lidando com todos os comandos que executamos. Eu vou dizer isso como eu os entendo porque eu não sei o fraseado original:

  1. Manipulação de shell --- O shell edita o comando (dividindo-o em linhas diferentes etc) e tudo isso é feito em um shell diferente do atual.

  2. Execução do resultado após o tratamento do shell (no shell original com o qual trabalhamos).

Alguém pode, por favor, responder com o nome dessas operações e fazer referência a algum material de leitura que ele acha melhor para os novos alunos sobre isso?

    

por Arcticooling 11.11.2017 / 23:51

1 resposta

5
  1. Shell handling --- The shell edits the command (splitting it to different rows etc)

Sim, mais ou menos. O shell obtém um comando como uma única string (geralmente uma linha de entrada) e o transforma em um conjunto de strings que realmente vão para o executável que eventualmente executa. O shell divide as palavras separadas por espaços em branco de uma única string em várias strings, mas também manipula aspas e expande as variáveis, etc.

Então, algo como

ls "$options" "/filename with spaces"

pode resultar nas três sequências ls , -l (do valor de $options ) e /filename with spaces (remoção de cotações). Esses são passados para a chamada do sistema exec() que executa o programa.

and all of this is done in a different shell than the current one.

Não, não realmente. Algumas expansões de shell (como $( ... ) ) geram subshells para fazer o trabalho pesado, mas isso não acontece com uma linha de comando "simples" regular.

  1. Execution of the outcome after shell handling (in the original shell we work with).

Realmente executar o programa como após a linha de comando ser analisada é uma etapa logicamente separada. Mas tecnicamente isso acontece em outro processo, já que a maneira de executar outro programa no Unix envolve primeiramente chamar fork() , que cria um novo processo como uma cópia do primeiro, e chamando exec() para substituir essa cópia (do shell) com o programa real a ser executado (por exemplo, ls no exemplo).

Se o comando for iniciado com exec (como em exec ls , o bifurcação será ignorado e o shell será substituído pelo comando que está sendo iniciado.

Como mencionado nos comentários, os shell builtins (como echo em muitos shells) também são executados no mesmo processo, sem bifurcação.

(Todos os itens acima são um pouco simplificados. Os shells reais podem ter outros recursos que não estão descritos aqui.)

    
por 12.11.2017 / 01:09

Tags