【问题标题】:How does the 'ls' command work in Linux/Unix?'ls' 命令在 Linux/Unix 中如何工作?
【发布时间】:2010-09-17 06:43:58
【问题描述】:

我想确切地知道“Is”命令在 Linux 和 Unix 中的工作原理。

据我所知,ls forks & exec 到 Linux/Unix shell,然后获取输出(当前文件树的输出。例如/home/ankit/)。我需要更详细的解释,因为我不确定调用 fork 后会发生什么。

谁能详细解释一下'ls'命令的功能?

【问题讨论】:

    标签: linux unix open-source operating-system solaris


    【解决方案1】:

    ls 不会分叉。 shell fork 和 execs 是为了运行任何未内置的命令,它可以运行的命令之一是 ls。

    ls 使用 opendir() 和 readdir() 来逐步浏览目录中的所有文件。如果它需要有关其中之一的更多信息,它会调用 stat()。

    【讨论】:

    • 作为一个有趣的点,我想你会发现它几乎是目录中的每个文件,尤其是在颜色和/或文件类型前/后缀打开的情况下。
    • 一氧化碳:没有 fork() 的 exec() 将替换当前正在运行的进程,这意味着您的 shell 将在您第一次运行命令时消失。
    • @Mark:它也使用 lstat() 否则它只会看到符号链接远端的文件权限,而不是符号链接本身。
    • @monoxide:shell 可以通过以下两种方式之一运行其他程序 - 使用 exec() 将自身替换为其他程序,或者使用 fork() 然后 exec()。这些是 Unix 中唯一可用的机制(除非您计算 pthread_spawn())。
    • jonathan,pthread 库基于 clone() 系统调用(在 linux 中 - 具有内核线程的其他 unix 版本将具有类似但可能不相同的内容)。直接使用 clone() 然后 exec() 是启动程序的另一种方式,尽管在实践中没有用处。
    【解决方案2】:

    为了补充答案,他们在 The C Programming Language book (K&RC) 中给出了一个关于如何实现 ls 的小示例。他们已经很好地解释了使用的数据结构和函数。

    【讨论】:

    • 如果有人来找,该部分是8.6 in book。
    • 也许注意到现代文件系统的数据结构有些不同。
    【解决方案3】:

    要了解 ls 的作用,您可以查看 OpenSolaris 源代码:https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/cmd/ls/ls.c

    如果这太过分了,那么在 Solaris 上,您首先使用 truss 查看 ls 发出的系统调用,以了解它的作用。使用 truss,试试:

    truss -afl -o ls.out /bin/ls

    然后查看ls.out中的输出

    我认为trace相当于Linux中的truss。

    【讨论】:

    • “truss”的Linux版本称为“strace”。
    【解决方案4】:

    如果你真的想了解 ls 的详细内容,请查看源代码。您可以按照 tpgould 的链接访问 Solaris 源代码,或者很容易从任何 Linux 或 BSD 发行版在线找到源代码。

    我会特别推荐4.4BSD源码。

    我记得,ls 从解析它的许多选项开始,然后从命令行中列出的文件或目录开始(默认为“.”)。子目录通过递归到目录列表例程中来处理。我记得没有 fork() 或 exec()。

    【讨论】:

    • 完整的 C 新手,一天早上醒来想知道 C 是如何工作的。这是有问题的 4.4BSD 文件吗? (显然,我还需要一段时间才能理解它,但必须从某个地方开始……)github.com/sergev/4.4BSD-Lite2/blob/master/usr/src/bin/ls/ls.c
    • @henry 就是这个文件,尽管它(或任何其他 ls.c)对于使用它进行学习的“完整的 C 新手”来说可能太复杂了。
    • 是的,肯定不会很快理解这一点,但至少我知道目标。谢谢!
    【解决方案5】:

    这是一个旧线程,但我仍然在发表评论,因为我相信被赞成和接受的答案部分不正确。 @Mark 说 ls 内置在 shell 中,因此 shell 不会执行和分叉。当我在 bash 上研究 tldp 文档时(我已附上链接) “ls”未列为内置命令。

    http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_01_03.html

    Bash 内置命令:

    alias、bind、builtin、command、declare、echo、enable、help、let、local、logout、printf、read、shopt、type、typeset、ulimit 和 unalias。

    【讨论】:

    • 我认为您误解了原始答案并强烈同意它。问题是“ls forks & exec to the linux/unix shell”,答案正确地回答了“ls 不分叉。shell fork 和 execs”并接着说 ls 是 shell forks/ 的命令之一执行官。
    • @alanc 感谢您的澄清。投票接受的答案:)
    猜你喜欢
    • 2015-06-10
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 2015-10-28
    • 2014-01-02
    • 1970-01-01
    相关资源
    最近更新 更多