Jak*_*ake 11 shell process executable
如果我使用 gcc 编译一个程序,并尝试从 bash shell 执行它,那么 bash 执行它所遵循的确切步骤顺序是什么?
我知道fork()
,execve()
,loader
,dynamic linker
(和其他东西)都参与,但也有人给的步骤的确切顺序和一些适合阅读的参考?
编辑:
从答案来看,这个问题似乎意味着很多可能性。我想缩小到一个简单的案例:
(test.c 只打印 hello world)
$ gcc test.c -o test
$ ./test
Run Code Online (Sandbox Code Playgroud)
上述案例(./test
)中的步骤是什么,具体涉及一些子进程中的bash启动程序,进行加载,链接等?
好吧,确切的顺序可能会有所不同,因为可能有一个 shell 别名或函数在执行实际程序之前首先被扩展/解释,然后是限定文件名 ( /usr/libexec/foo
) 与将在所有目录中查找的文件名的差异的PATH
环境变量(只是foo
)。此外,执行的细节可能使问题复杂化,因为foo | bar | zot
需要壳更多的工作(一些号码fork(2)
,dup(2)
以及,当然pipe(2)
,其他系统调用中),而像exec foo
作为外壳仅仅用替换本身要少得多的工作新程序(即它没有fork
)。同样重要的是进程组(尤其是前台进程组,其所有 PID 都吃SIGINT
当有人开始混搭Ctrl+ 时C,会话,以及该作业是在后台运行、受监控 ( foo &
) 还是后台运行、忽略 ( foo & disown
)。I/O 重定向细节也会改变一些事情,例如,标准输入是否被 shell ( foo <&-
)关闭,或者文件是否作为 stdin ( foo < blah
)打开。
strace
或类似的将提供有关在此过程中进行的特定系统调用的信息,并且每个调用都应该有手册页。合适的系统级阅读可以是 Stevens 的“UNIX 环境中的高级编程”中的任意数量的章节,而 shell 书籍(例如,“从 Bash 到 Z Shell”)将更详细地介绍 shell 方面的内容。