免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1767 | 回复: 0
打印 上一主题 下一主题

g-bios中一条命令执行流程以ping命令为例 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-21 18:11 |只看该作者 |倒序浏览
Email:longxinhui276@126.com

g-bios中一条命令执行流程以ping命令为例。一条命令的执行流程,首先介绍下相关的目录流程:
g-bios/thread/main.c –> g-bios/app/shell.c ->  g-bios/app/net/ping.c

具体分析:系统先执行main.c文件的main函数,对命令执行重要的代码段是

        while (GetMessage(szMsg))
        {
                int   argc;
                char *argv[MAX_APP_ARG];

                argc = TranslateMessage(szMsg, argv);
                // if argc < 0

                DispatchMessage(argc, argv);
        }
GetMessage在shell.c文件定义,函数的作用是把我们输入的字符串存到一个buff里面,以本文为例子,输入ping存到szMsg里,然后执行到argc = TranslateMessage(szMsg,argv),函数TranslateMessage在shell.c中定义,把一个buff里的字符串以结束符'\0'为单元,定义一个指针数组作为函数第二个参数,指针数组分别指向buff的内容,具体本文的例子就是argv[0]就是ping的地址。

        然后执行到DispatchMessage(argc,argv),DispatchMessage在shell.c中定义,他的作用是遍历一遍命令段(关于命令段我们将在下篇文档讲述),看命令段有没有与argv[0]指向的字符串想匹配的命令。以本文为例
        for (pApp = g_pGBiosAppBegin; pApp < g_pGBiosAppEnd; pApp++)
        {
                if (!strncmp(pApp->pchName, argv[0], MAX_ARGV_SIZE))
                {
                        getopt_init();

                        ret = pApp->main(argc, argv);
#if 0
                        if (ret < 0)
                        {
                                printf("fail to exec %s! (exit %d)\n", argv[0], ret);
                        }
#endif
                        goto L_exec;
                }
        }
        这是部分DispatchMessage函数关键代码,以本文ping为例,如果找到ping这个命令就执行getopt_init();
          re t = pApp->main(argc,argv);对于pApp我们先解释下,这是一个很关键的结构体。每个命令都是以这个结构体的形式存在命令段。
typedef struct
{
        const char *pchName;
        int (*main)(int, char *[]);
        const char *pchHelpMsg;
} GApp;
GApp pApp;这个结构体的第一个元素就是命令名,第二个元素就是命令对应的命令函数的指针,第三个是帮助信息的指针。以本文为例,在命令段找到了ping命令,然后跳进了g-bios/app/net/ping.c的pingMain函数,这样基本实现了一个命令。对于ping.c里的
INSTALL_APPLICATION(ping, PingMain, "need help? ";,INSTALL_APPLICATION这个宏就是把相应命令加入命令段,
#define INSTALL_APPLICATION(name, routine, helpinfo) \
        static __USED__ __GBIOS_APP__ GApp __gbios_app_##name = {#name, routine, helpinfo},
对于这个宏的任何不明白可以email到longxinhui276@126.com.或在论坛发帖询问。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP