【问题标题】:What happens when you execute "ls" in Bash在 Bash 中执行“ls”时会发生什么
【发布时间】:2017-08-19 10:30:03
【问题描述】:

谁能给我详细描述一下在linux中执行“ls”命令时会发生什么。使用了哪些系统调用?文件系统有什么作用?显然取决于使用哪个文件系统。是否有人可以就这个主题进行深入讨论,或者向我指出一些很棒的资源!谢谢!

【问题讨论】:

标签: linux linux-kernel operating-system filesystems


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

【讨论】:

  • 我知道这是一个高级概述,但这里有很多不准确之处。 (1,2)首先解析命令很重要,我们不能简单地检查别名映射中的每个令牌(5)更重要的是,没有会话领导或前台/后台之类的东西 - 子进程从 step4 调用 exec*() 来运行 /bin/ls,而父进程在子进程的 pid 上调用 wait() 并阻塞。当子进程退出时,父进程从 wait() 调用继续。 (8) 不正确,child 刚退出,parent 从 wait() 继续。
【解决方案2】:
  1. 当前进程(我们称为父进程或父进程)在 $PATH 变量中查找 ls,例如 /usr/bin/ls
  2. 父(进程)派生一个子(进程),并传递所有环境,子进程映像是/usr/bin/ls
  3. 没有参数,所以孩子找到 env PWD,例如 /foo/bar 并执行 (/usr/bin/ls /foo/bar)
  4. 子进程输出,退出
  5. 父母再次变得互动

【讨论】:

    猜你喜欢
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 2013-01-11
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多