Bash - exec 系列函数来启动程序

Bash - exec 系列函数来启动程序

我有兴趣了解exec*()Bash shell 使用函数系列的哪个变体来启动程序。例如,该system()函数使用execl(),但是 Bash 使用什么?

我做了一些调查,但我想与大家仔细检查一下,这是否是 Bash 源代码中执行从终端输入的命令的正确位置。

我调查了 Bash 版本 4.2.53,发现了一个名为execute_cmd.c.在那里我观察到以下调用链:

  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);

上面的控制流程是正确的吗?

答案1

我不知道你为什么想知道这一点,但是:

只有一个 exec 调用实际上是系统调用:execve()

所有其他 exec*() 函数都只是充当 execve() 前端的库函数。使用 truss(1) 或克隆只会显示系统调用,除非您使用truss -u libc::

相关内容