Chinaunix首页 | 论坛 | 博客
  • 博客访问: 121885
  • 博文数量: 7
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-05 12:45
文章分类
文章存档

2008年(7)

我的朋友

分类: LINUX

2008-05-23 18:17:21

今天看了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) |
给主人留下些什么吧!~~