Linux 工具集程序
概述
在linux
下可以为程序创建多个不同名的软链接,利用这个机制把多种功能封装到一个程序里,就构成了工具集合,例如开发板中的busybox
。
# ls -la /bin
lrwxrwxrwx 1 1000 1000 cp -> busybox
lrwxrwxrwx 1 1000 1000 ls -> busybox
lrwxrwxrwx 1 1000 1000 rm -> busybox
恰好最近使用到海思的himm
命令,通过ls
查看,它和其它指令最终链接到了btools
程序上,刚好符合工具集的表现形式,下面就以btools
为例,分析和记录一下这个工具集究竟是怎么被实现的。
实现
定义功能,所有功能函数定义应为相同类型,且主要目的是传递运行程序时的参数。
typedef int (*cmd_func)(int, char const **);
int himc(int c, char const **v) { return 0; }
int himm(int c, char const **v) { return 0; }
定义结构类型,最简单可以仅包含启动命令字符串,以及这个命令功能的操作函数指针。
typedef struct CMDSHELL_STRU
{
char *cmdstr;
cmd_func pFunc;
char *helpstr;
} CMD_SHELL_T;
定义实例,通常工具集包含很多功能,为了明确工具集的功能个数或结束位置,应该把集合的最后一个位置预留清空。
static CMD_SHELL_T pCmds[] = {
{"himc", himc, "memory clear"},
{"himm", himm, "memory modify"},
{NULL, NULL, 0},
};
确定命令,这里是整个工具集的调度核心,思想就是遍历预设命令字符串与启动命令比较,相同就能得到功能执行。
CMD_SHELL_T *get(int argc, char const *argv[])
{
int i;
while (pCmds[i].cmdstr)
{
if (strcmp(pCmds[i].cmdstr, argv[0]) == 0)
{
return (&pCmds[i]);
}
i++;
}
return NULL;
}
执行命令,获得工具集成员对象后通过功能指针执行函数。
CMD_SHELL_T *pCmd = get(argc, argv);
if (pCmd)
return ((int)pCmd->pFunc(argc, argv));
应用
- 编译程序。
gcc *.c -o btools
- 为程序设置软连接,链接名要与功能和预定义命令字符串匹配。
ln -s btools himc
ln -s btools himm
- 设置环境变量路径,这是因为确定命令的方法是
strcmp
相同字符串来获得功能,如果不把可执行程序放到环境变量路径,就需要指定路径运行,如:./himm
或/home/xxx/himm
,这将会导致查询不匹配。
export PATH=$PATH:`pwd`
- 通过软连接执行工具集中的功能。
himc
himm