Bash - função familiar exec para iniciar programas

2

Estou interessado em descobrir qual variante da família de funções exec*() usa o shell Bash para lançar programas. Por exemplo, a função system() usa execl() , mas o que o Bash usa?

Eu fiz algumas investigações, mas eu quero verificar com todo mundo se este é o lugar certo no código fonte do Bash onde um comando digitado do terminal é executado.

Eu investiguei o Bash versão 4.2.53 e encontrei um arquivo chamado execute_cmd.c . Lá eu observo a seguinte cadeia de chamadas:

  1. execute_disk_command()
// I think this is where bash forks a child
pid = make_child (savestring (command_line), async); 
...
exit (shell_execve (command, args, export_env)); 
  1. shell_execve (command, args, env)
// I think this is where the child invokes the new program
execve (command, args, env);

O fluxo de controle está acima do certo?

    
por Jake 22.09.2015 / 06:33

1 resposta

2

Não sei por que você gosta de saber isso, mas:

Existe apenas uma chamada exec que é realmente um syscall: execve()

Todas as outras funções exec * () são apenas funções de biblioteca que atuam como frontend para execve (). O uso de treliça (1) ou clones mostrará apenas o syscalls, a menos que você use truss -u libc::

    
por 22.09.2015 / 09:53

Tags