今天看了busybox的代码,感觉它的框架很明了,也很简单,所以写了一个模拟框架的代码,没有去考虑如MAKEFILE及编译控制的东西,只是简单的模拟了一下主程序的主框架,有两个文件,如下。
busybox.c:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 extern int ls_main(int argc, char** argv);
6
7
8 struct applet {
9 char* name;
10 int (*main)(int argc, char** argv);
11 };
12
13 #define ENTRY(a,b) {#a, b}
14 #define APPLET_NUM (sizeof(applets)/sizeof(struct applet))
15 struct applet applets[] = {
16 ENTRY(ls, ls_main)
17 };
18
19 struct applet* findappletbyname(char* app_wanted){
20 int i = 0;
21 for(;i<APPLET_NUM;i++){
22 if(!strcmp(app_wanted, applets[i].name))
23 return &applets[i];
24 }
25 return NULL;
26 }
27
28 /************************************************************/
29 char* appname;
30
31 int main(int argc, char** argv){
32 struct applet* applet = NULL;
33 char*s=argv[0];
34 while(*s != '\0') {
35 if(*s++ == '/')
36 appname=s;
37 }
38 if((applet=findappletbyname(appname)) !=NULL){
39 applet->main(argc, argv);
40 }else{
41 fprintf(stderr, "Cannot find application you want!\n");
42 return 1;
43 }
44 return 0;
45 }
|
ls.c:
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int ls_main(int argc, char** argv) {
5 printf("This is example for real \"ls\" application.\n");
6 printf("have fun for linux.\n");
7 return 0;
8 }
|
这个是模拟shell命令中的ls程序,当然只是做个样子。
两个文件在一起编译生成busybox程序,再使用ln -s $PWD/busybox $PWD/ls,这样在当前目录下面运行./ls就有了busybox的效果了。
阅读(1260) | 评论(0) | 转发(0) |