Se eu compilar um programa usando o gcc e tentar executá-lo no shell bash, qual é a sequência exata de etapas seguidas pelo bash para executá-lo?
Eu sei fork()
, execve()
, loader
, dynamic linker
(e outras coisas) estão envolvidos, mas alguém pode dar uma seqüência exata de passos e alguma referência de leitura adequado?
Editar:
A partir das respostas, parece que a pergunta poderia implicar muitas possibilidades. Eu quero limitar a um caso simples:
(test.c apenas imprime olá mundo)
$ gcc test.c -o test
$ ./test
Quais serão as etapas no caso acima ( ./test
), relacionando especificamente o programa de inicialização do bash em algum processo filho, carregando, vinculando etc.?
shell
process
executable
Jake
fonte
fonte
Respostas:
Bem, a sequência exata pode variar, pois pode haver um alias ou função de shell que primeiro seja expandido / interpretado antes que o programa real seja executado e depois diferenças para um nome de arquivo qualificado (
/usr/libexec/foo
) versus algo que será procurado em todos os diretórios daPATH
variável de ambiente (apenasfoo
). Além disso, os detalhes da execução podem complicar as coisas, poisfoo | bar | zot
exigem mais trabalho para o shell (um certo número defork(2)
,dup(2)
e, é claropipe(2)
, entre outras chamadas do sistema), enquanto algo comoexec foo
é muito menos trabalho, pois o shell simplesmente se substitui por o novo programa (ou seja, nãofork
). Também são importantes grupos de processos (especialmente o grupo de processos em primeiro plano, todos os PIDsSIGINT
quando alguém começa a mascarar Ctrl+ C, sessões e se o trabalho será executado em segundo plano, monitorado (foo &
) ou em segundo plano, ignorado (foo & disown
). Os detalhes de redirecionamento de E / S também mudarão as coisas, por exemplo, se a entrada padrão for fechada pelo shell (foo <&-
) ou se um arquivo for aberto como stdin (foo < blah
).strace
ou similar será informativo sobre as chamadas de sistema específicas feitas ao longo desse processo, e deve haver páginas de manual para cada uma dessas chamadas. A leitura adequada no nível do sistema seria qualquer número de capítulos da "Programação Avançada no Ambiente UNIX" de Stevens, enquanto um livro de shell (por exemplo, "From Bash to Z Shell") cobrirá o lado do shell com mais detalhes.fonte
Supondo que um exemplo de shell de livro (para maior clareza do código) já esteja em execução (para que o vinculador dinâmico esteja pronto), os comandos mencionados exigirão que o shell faça as seguintes chamadas de sistema:
Comandos mais complicados, é claro, adicionam mais complicações a essa sequência básica. Dois exemplos mais simples de complicações básicas são o redirecionamento básico io, onde uma sequência dup aberta e fechada é inserida entre a bifurcação e os processos exec e background em que a espera é ignorada (e outra espera é adicionada a um manipulador de sigchld).
fonte
Sugiro ler a Seção 8.4.6 Usando fork e execve para executar programas
em http://www.groupes.polymtl.ca/inf2610/documentation/ComputerSystemBook.pdf
fonte