Chinaunix首页 | 论坛 | 博客
  • 博客访问: 282248
  • 博文数量: 33
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1928
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-22 16:27
文章分类

全部博文(33)

文章存档

2015年(33)

分类: LINUX

2015-04-12 00:01:27

这里先简单的解释一下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命令可以使用,
不知道是怎么回事,知道的还望指点一下

阅读(5555) | 评论(1) | 转发(2) |
给主人留下些什么吧!~~

lenglingx2015-04-28 13:52:51

CD内嵌了的吧,shell中都是内嵌了CD的,这个应该是参照了shell实现的。