文章参考https://blog.csdn.net/jerrytomcat/article/details/82050977

摘要:

        笔者没有接触过Linux,也没有用过shell,今天偶然在一个模块程序上看见有这种写法感觉很新颖,也很方便,分享一下

一. 什么是Shell
Shell是一个命令行解释器,它为用户提供了一个面向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。

Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
 

C语言 - 程序交互,参照shell命令

        Shell具体可描述为:外层应用程序是一些命令,是非机器语言,比如ls , useradd等;而内核则识别的是机器语言0和1,让Shell解释器当一个“中介”,由非机器语言通过Shell解释器向机器语言的转化,转化后内核将命令传递给硬件执行。更直白的说,Shell就是我们操控的Linux终端界面,输入命令得到想要的功能。

二、自建交互   

         创建名了结构体:

         typedef const struct _COMMAND {
                      char * command;
                      void (* function)(void);
                      const struct _COMMAND * next;
         }COMMAND_T;

         结构体初始化:

         COMMAND_T cmd_clear = {
                    .command = "clear",
                    .function = func_clear,
                    .next = NULL
        }; 
        COMMAND_T cmd_help = {
                    .command = "help",
                    .function = func_help,
                    .next = &cmd_clear
       }; 
      COMMAND_T cmd_vid = {
                   .command = "vid",
                   .function = func_vid,
                   .next = &cmd_help
      }; 
      COMMAND_T cmd_pid = {
                   .command = "pid",
                   .function = func_pid,
                   .next = &cmd_vid
       };

      主程序轮询:

static int command_interpreter(void){
    COMMAND_T * cp;
        char i = 0;

        if (receive_flag) {
                receive_flag = 0;
                memset(buffer, 0, BUFFER_SIZE);
                memcpy(buffer, receive_buffer, strlen(receive_buffer));
                memset(receive_buffer, 0, BUFFER_SIZE);

               for (i = 0; i < BUFFER_SIZE; i++) buffer[i] = tolower(buffer[i]);

               cp = &cmd_null;

                while (cp != NULL) {
                       if (memcmp(buffer, cp->command, strlen(cp->command)) == 0) {
                           cp->function();
                       goto next;
               }
                cp = cp->next;
        }
        buffer[strlen(buffer) - 1] = '\0';    

        uart.printf("\r\n\ 1 command! \r\n");
next:   uart.printf("\r\n\ 2 command \r\n ");
}

通过butty 软件可以实现对模块端口的访问

C语言 - 程序交互,参照shell命令

 

C语言 - 程序交互,参照shell命令

相关文章: