14

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

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

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

4

5 回答 5

41

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

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

于 2008-10-15T09:59:00.423 回答
10

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

于 2008-10-15T10:11:17.250 回答
4

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

如果那是压倒性的,那么在 Solaris 上,您首先使用 truss 查看 ls 发出的系统调用,以了解它的作用。使用桁架,尝试:

桁架 -afl -o ls.out /bin/ls

然后查看 ls.out 中的输出

我相信trace相当于Linux中的truss。

于 2008-10-28T20:50:47.727 回答
3

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

我会特别推荐 4.4BSD 源代码。

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

于 2008-10-31T22:20:53.450 回答
-1

这是一个旧线程,但我仍然在发表评论,因为我相信被赞成和接受的答案部分不正确。@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。

于 2011-12-18T13:10:54.067 回答