我有兴趣了解exec*()
Bash shell 使用函数系列的哪个变体来启动程序。例如,该system()
函数使用execl()
,但是 Bash 使用什么?
我做了一些调查,但我想与大家仔细检查一下,这是否是 Bash 源代码中执行从终端输入的命令的正确位置。
我调查了 Bash 版本 4.2.53,发现了一个名为execute_cmd.c
.在那里我观察到以下调用链:
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));
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::