这里先简单的解释一下busybox
它其实就是一个工具集,用函数实现了我们常用的命令,我们在终端输入的命令其实就可以认为是对于busybox的一个函数名,执行命令就是
相当于调用函数,同时跟上相应的参数(有的有参数,如:cat;有的没有参数:如:ls、pwd)。其实busybox就是一个应用程序,
我们通过终端命令给这个应用程序传参数(命令ls就相当于参数)调用它,根据命令的不同调用不同的函数。所以,它也是用系统调用和C库函数写的。
下面给出终端命令调用的层次关系:
对于上述过程:
序号1:相当于一个应用程序(busybox)调用。
序号2:相当于应用程序调用库函数。
序号3:从库函数到内核
下面来详细说一下
我们对文件系统的操作无非就是使用各种命令对文件进行操作,如最常用的:ls、cat、vim、cp等。
那么为什么我们执行ls这些命令的时候到底会执行什么操作呢?
我们可以用“ls -l”查看到/bin下面的命令基本上都是链接文件
lrwxrwxrwx 1 root root 7 Sep 13 2012 mv -> busybox
lrwxrwxrwx 1 root root 7 Sep 13 2012 ls -> busybox
链接到busybox,这个链接文件相当于执行“ln -s busybox cp /bin/cp”
(ln -s a b 中的 a 就是源文件,b是链接文件名,其作用是当执行b命令时,实际执行的是a命令)
所以文件系统中命令的执行有两种方式:
/bin/busybox ls
ls(执行的其实就是上面的这条指令)
以ls为例来看一下具体调用过程(这里只大概说下过程,不详细讲busubox源码,其实也没那个能力将)
由上面知道,busybox就是一个应用程序,我们执行 ls 的时候其实就是调用 /bin/busybox ls,ls相当于busybox的参数。
想一下我们的应用程序,调用的时候会从main函数开始执行,busybox也是的。它的main函数是:
busybox-1.16.0\libbb\Appletlib.c:
#if ENABLE_BUILD_LIBBUSYBOX
int lbb_main(char **argv)
#else
int main(int argc UNUSED_PARAM, char **argv)
#endif
这个函数会根据传入的 ls 去查找自己的命令库,找到之后调用对于的函数,这里找到的是
busybox-1.16.0\coreutils\ls.c
int ls_main(int argc UNUSED_PARAM, char **argv)
注:很奇怪的是,在文件系统的 bin 目录下没有cd命令,在busybox也没有发现对应的文件,但cd命令可以使用,
不知道是怎么回事,知道的还望指点一下