g-bios中一条命令执行流程以ping命令为例
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论