BusyBox 是很多标准 Linux® 工具的一个单个可执行实现。BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大、更复杂的工具,例如 grep、find、mount 连同 telnet(但是他的选项比传统的版本要少);有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。本文将探索 BusyBox 的目标,他是如何工作的,连同为什么他对于内存有限的环境来说是如此重要。
BusyBox 的诞生
BusyBox 最初是由 Bruce Perens 在 1996 年为 Debian GNU/Linux 安装盘编写的。其目标是在一张软盘上创建一个可引导的 GNU/Linux 系统,这能够用作安装盘和急救盘。一张软盘能够保存大约 1.4-1.7MB 的内容,因此这里没有多少空间留给 Linux 内核连同相关的用户应用程式使用。
|
BusyBox 揭露了这样一个事实:很多标准 Linux 工具都能够共享很多一起的元素。例如,很多基于文档的工具(比如 grep 和 find)都需要在目录中搜索文档的代码。当这些工具被合并到一个可执行程式中时,他们就能够共享这些相同的元素,这样能够产生更小的可执行程式。实际上, BusyBox 能够将大约 3.5MB 的工具包装成大约 200KB 大小。这就为可引导的磁盘和使用 Linux 的嵌入式设备提供了更多功能。我们能够对 2.4 和 2.6 版本的 Linux 内核使用 BusyBox。
BusyBox 是如何工作的?
为了让一个可执行程式看起来就像是很多可执行程式相同,BusyBox 为传递给 C 的 main 函数的参数研发了一个很少使用的特性。回想一下 C 语言的 main 函数的定义如下:
|
清单 1. C 的 main 函数
int main( int argc, char *argv[] )
|
在这个定义中,argc 是传递进来的参数的个数(参数数量),而 argv 是个字符串数组,代表从命令行传递进来的参数(参数向量)。argv 的索引 0 是从命令行调用的程式名。
清单 2 给出的这个简单 C 程式展示了 BusyBox 的调用。他只简单地打印 argv 向量的内容。
清单 2. BusyBox 使用 argv[0] 来确定调用哪个应用程式
// test.c
#include <stdio.h>
int main( int argc, char *argv[] )
{
int i;
for (i = 0 ; i < argc ; i ) {
printf("argv[%d] = %s\n", i, argv[i]);
}
return 0;
}
|
调用这个程式会显示所调用的第一个参数是该程式的名字。我们能够对这个可执行程式重新进行命名,此时再调用就会得到该程式的新名字。另外,我们能够创建一个到可执行程式的符号链接,在执行这个符号链接时,就能够看到这个符号链接的名字。
清单 3. 在使用新命令更新 BusyBox 之后的命令测试
$ gcc -Wall -o test test.c
$ ./test arg1 arg2
argv[0] = ./test
argv[1] = arg1
argv[2] = arg2
$ mv test newtest
$ ./newtest arg1
argv[0] = ./newtest
argv[1] = arg1
$ ln -s newtest linktest
$ ./linktest arg
argv[0] = ./linktest
argv[1] = arg
|
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



