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));

应用

  1. 编译程序。
gcc *.c -o btools
  1. 为程序设置软连接,链接名要与功能和预定义命令字符串匹配。
ln -s btools himc
ln -s btools himm
  1. 设置环境变量路径,这是因为确定命令的方法是strcmp相同字符串来获得功能,如果不把可执行程序放到环境变量路径,就需要指定路径运行,如:./himm/home/xxx/himm,这将会导致查询不匹配。
export PATH=$PATH:`pwd`
  1. 通过软连接执行工具集中的功能。
himc
himm
posted @ 2020-09-15 18:51  派大海星  阅读(173)  评论(0编辑  收藏  举报