在Bash中执行“ls”会发生什么

时间:2017-03-26 20:28:41

标签: linux linux-kernel operating-system filesystems

有人可以向我详细介绍在linux中执行“ls”命令时会发生什么。使用了什么系统调用?文件系统做什么?显然取决于使用哪个文件系统。有人可以就这个话题提供深入的讨论,或者指出一些很好的资源!谢谢!

2 个答案:

答案 0 :(得分:1)

  1. Bash as command interpreter检查它自己的语言中是否有这样的特殊单词:shell关键字或shell内置函数。
  2. ls不在shell关键字中,然后它检查别名并用它的值替换别名,很可能应该有类似的东西:ls='ls --color=auto'
  3. 它在PATH env变量指定的路径中查找ls可执行文件。通常是/bin/ls
  4. 它分叉(fork())新进程并执行它的代码(exec())。进程env从父进程继承到新的“ls”进程。
  5. 新进程成为会话负责人并开始处理前台(bash被移至后台)
  6. ls进程从LD_PATHs(ldd /bin/ls
  7. 加载共享库
  8. 它执行了很多系统调用,您可以通过strace进行检查,我认为主要部分是openat()getdents()首先打开目录,然后再读取其中的条目。
  9. 打印输出并退出,发送wait()信号,父进程bash完全终止。

答案 1 :(得分:0)

  1. 当前进程(我们称之为父进程或父进程)在$ PATH变量中查找ls,例如/ usr / bin / ls
  2. 父(进程)fork一个子进程(进程),并传递所有环境,子进程映像为/ usr / bin / ls
  3. 没有参数,所以孩子找到env PWD,例如/ foo / bar和excute(/ usr / bin / ls / foo / bar)
  4. 子进程输出,退出
  5. 父母再次成为互动