2017-03-26 101 views
-1

有人能給我詳細描述當你在linux中執行「ls」命令時會發生什麼。使用什麼系統調用?文件系統是做什麼的?顯然取決於使用哪個文件系統。有人可以提供有關此主題的深入討論,或者指出一些好的資源!謝謝!當你在Bash中執行「ls」時會發生什麼

+1

*「使用什麼系統調用?」* - 執行shell命令'strace ls'。 – sawdust

+0

如果您想深入瞭解muche,請在現代x86上使用'perf',它會根據英特爾處理器追蹤技術向您顯示完整的命令跟蹤信息。 – 0andriy

+0

爲什麼不檢查源代碼? https://opensource.apple.com/source/file_cmds/file_cmds-230/ls/ http://www.gnu.org/software/coreutils/coreutils.html – user3344003

回答

0
  1. 當前進程(我們稱之爲父進程,或父母),發現在$ PATH變量LS,例如,/ usr/bin中/ LS
  2. 父(進程)fork一個孩子(的過程),並通過所有環境,子過程映像是/ usr/bin中/ LS
  3. 沒有參數,所以孩子找到ENV PWD,如/富/酒吧和EXCUTE(在/ usr/bin中/ LS /富/條)
  4. 子進程輸出,退出
  5. 家長再次互動
1
  1. Bash作爲命令解釋程序檢查它是否有自己的語言中有這樣的特殊字詞:shell關鍵字或shell內置函數。
  2. LS不是外殼關鍵字中,然後它再檢查別名和替換的別名與它的價值,最有可能的應該有這樣的事情:ls='ls --color=auto'
  3. 它看起來LS在由PATH環境變量指定的路徑可執行文件。通常它是/bin/ls
  4. 它叉(fork())新進程和執行它的代碼(exec())。進程環境從父進程繼承到新的「ls」進程。
  5. 新過程變得會議領導,並開始從LD_PATHs(ldd /bin/ls
  6. 它執行很多systemcalls的工作前景(bash的移動到背景)
  7. LS進程加載共享庫,你可以通過strace檢查,以及主要部分我認爲是openat()getdents()第一次打開目錄,第二次讀取那裏的條目。
  8. 打印輸出並退出,發送wait()信號和父進程bash完全終止它。
相關問題