他们这样做execl(_PATH_BSHELL, "sh", "-c", command, NULL)而不是execl(_PATH_BSHELL, command, NULL)
后者不会command直接执行,而是_PATH_BSHELL( /bin/sh)$0设置为command并且没有参数,导致 shell 期望来自其标准输入的命令。
此外,该语法依赖于NULL被定义为显式指针(例如((void*)0)),而不仅仅是0,在任何地方都不能保证。虽然他们可以在他们的实现中做到这一点(因为他们控制所有的标题),但这不是你应该在应用程序代码中做的。
不,execl(command, command, (void*)NULL)也不会command直接执行,除非command是a)完整路径和b)以可执行格式(二进制或以 she-bang 开头的脚本#!- 后者是非标准扩展名)。如果command是要在其中查找的简单命令名称PATH(如pwdor a.out)或不以 she-bang 开头的可执行脚本,则应该使用execlp而不是execl.
这些函数完成了shellexec[lv]p[e]所做的一些事情(比如查看. 请注意,使用 it's ,而不是用户的登录 shell 或使用的环境。PATHsystem(3)popen(3)/bin/sh -c/bin/sh$SHELL
如果您执行sh -c a.out而不是仅执行a.out自身,那么实际a.out进程是否最终成为“孙”进程而不是子进程?
只有一些像dash. 不使用bash, ksh93, mksh, zsh, yash,busybox等,它将a.out直接执行而不是分叉并等待它。