g-bios中一条命令执行流程以ping命令为例

发布于 2022-09-18 03:33:27 字数 3645 浏览 10 评论 0

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.或在论坛发帖询问。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文