亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

基于C語言實現shell指令的詳解

2020-01-26 16:07:31
字體:
來源:轉載
供稿:網友
源代碼來自于TI開發板
在ARM上實現shell命令解析

第一步:構建命令實現函數和命令表
1,定義結構體 和命令表
復制代碼 代碼如下:

typedef int (*pfnCmdLine)(int argc, char *argv[]);
//*****************************************************************************
//
//! Structure for an entry in the command list table.
//
//*****************************************************************************
typedef struct
{
    //
    //! A pointer to a string containing the name of the command.
    //
    const char *pcCmd;
    //
    //! A function pointer to the implementation of the command.
    //
    pfnCmdLine pfnCmd;
    //
    //! A pointer to a string of brief help text for the command.
    //
    const char *pcHelp;
}
tCmdLineEntry;
//*****************************************************************************
//
//! This is the command table that must be provided by the application.
//
//*****************************************************************************
extern tCmdLineEntry g_sCmdTable[];

2,編寫命令執行函數  實現命令表
復制代碼 代碼如下:

int
Cmd_help(int argc, char *argv[])
{
    tCmdLineEntry *pEntry;
    //
    // Print some header text.
    //
    UARTprintf("/nAvailable commands/n");
    UARTprintf("------------------/n");
    //
    // Point at the beginning of the command table.
    //
    pEntry = &g_sCmdTable[0];
    //
    // Enter a loop to read each entry from the command table.  The
    // end of the table has been reached when the command name is NULL.
    //
    while(pEntry->pcCmd)
    {
        //
        // Print the command name and the brief description.
        //
        UARTprintf("%s%s/n", pEntry->pcCmd, pEntry->pcHelp);
        //
        // Advance to the next entry in the table.
        //
        pEntry++;
    }
    //
    // Return success.
    //
    return(0);
}

復制代碼 代碼如下:

int
Cmd_ls(int argc, char *argv[])
{
    unsigned long ulTotalSize;
    unsigned long ulFileCount;
    unsigned long ulDirCount;
    FRESULT fresult;
    FATFS *pFatFs;
    //
    // Open the current directory for access.
    //
    fresult = f_opendir(&g_sDirObject, g_cCwdBuf);
    //
    // Check for error and return if there is a problem.
    //
    if(fresult != FR_OK)
    {
        return(fresult);
    }
    ulTotalSize = 0;
    ulFileCount = 0;
    ulDirCount = 0;
    //
    // Give an extra blank line before the listing.
    //
    UARTprintf("/n");
    //
    // Enter loop to enumerate through all directory entries.
    //
    for(;;)
    {
        //
        // Read an entry from the directory.
        //
        fresult = f_readdir(&g_sDirObject, &g_sFileInfo);
        //
        // Check for error and return if there is a problem.
        //
        if(fresult != FR_OK)
        {
            return(fresult);
        }
        //
        // If the file name is blank, then this is the end of the
        // listing.
        //
        if(!g_sFileInfo.fname[0])
        {
            break;
        }
        //
        // If the attribue is directory, then increment the directory count.
        //
        if(g_sFileInfo.fattrib & AM_DIR)
        {
            ulDirCount++;
        }
        //
        // Otherwise, it is a file.  Increment the file count, and
        // add in the file size to the total.
        //
        else
        {
            ulFileCount++;
            ulTotalSize += g_sFileInfo.fsize;
        }
        //
        // Print the entry information on a single line with formatting
        // to show the attributes, date, time, size, and name.
        //
        UARTprintf("%c%c%c%c%c %u/%02u/%02u %02u:%02u %9u  %s/n",
                    (g_sFileInfo.fattrib & AM_DIR) ? 'D' : '-',
                    (g_sFileInfo.fattrib & AM_RDO) ? 'R' : '-',
                    (g_sFileInfo.fattrib & AM_HID) ? 'H' : '-',
                    (g_sFileInfo.fattrib & AM_SYS) ? 'S' : '-',
                    (g_sFileInfo.fattrib & AM_ARC) ? 'A' : '-',
                    (g_sFileInfo.fdate >> 9) + 1980,
                    (g_sFileInfo.fdate >> 5) & 15,
                     g_sFileInfo.fdate & 31,
                    (g_sFileInfo.ftime >> 11),
                    (g_sFileInfo.ftime >> 5) & 63,
                     g_sFileInfo.fsize,
                     g_sFileInfo.fname);
 // tcp_write(Rpcb,g_sFileInfo.fname,sizeof(g_sFileInfo.fname),0);
    }   // endfor
    //
    // Print summary lines showing the file, dir, and size totals.
    //
    UARTprintf("/n%4u File(s),%10u bytes total/n%4u Dir(s)",
                ulFileCount, ulTotalSize, ulDirCount);
    //
    // Get the free space.
    //
    fresult = f_getfree("/", &ulTotalSize, &pFatFs);
    //
    // Check for error and return if there is a problem.
    //
    if(fresult != FR_OK)
    {
        return(fresult);
    }
    //
    // Display the amount of free space that was calculated.
    //
    UARTprintf(", %10uK bytes free/n", ulTotalSize * pFatFs->sects_clust / 2);
    //
    // Made it to here, return with no errors.
    //
    return(0);
}

復制代碼 代碼如下:

tCmdLineEntry g_sCmdTable[] =
{
    { "help",   Cmd_help,      " : Display list of commands" },
    { "h",      Cmd_help,   "    : alias for help" },
    { "?",      Cmd_help,   "    : alias for help" },
    { "ls",     Cmd_ls,      "   : Display list of files" },
    { "chdir",  Cmd_cd,         ": Change directory" },
    { "cd",     Cmd_cd,      "   : alias for chdir" },
    { "pwd",    Cmd_pwd,      "  : Show current working directory" },
    { "cat",    Cmd_cat,      "  : Show contents of a text file" },
 { "rm",     CMD_Delete,   "  : Delete a file or a folder"    },
    { 0, 0, 0 }
};

第二步:編寫命令解析 執行函數
復制代碼 代碼如下:

//*****************************************************************************
//
// cmdline.c - Functions to help with processing command lines.
//
// Copyright (c) 2007-2010 Texas Instruments Incorporated.  All rights reserved.
// Software License Agreement
//
// Texas Instruments (TI) is supplying this software for use solely and
// exclusively on TI's microcontroller products. The software is owned by
// TI and/or its suppliers, and is protected under applicable copyright
// laws. You may not combine this software with "viral" open-source
// software in order to form a larger program.
//
// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
// DAMAGES, FOR ANY REASON WHATSOEVER.
//
// This is part of revision 6594 of the Stellaris Firmware Development Package.
//
//*****************************************************************************
//*****************************************************************************
//
//! /addtogroup cmdline_api
//! @{
//
//*****************************************************************************
#include <string.h>
#include "cmdline.h"
//*****************************************************************************
//
// Defines the maximum number of arguments that can be parsed.
//
//*****************************************************************************
#ifndef CMDLINE_MAX_ARGS
#define CMDLINE_MAX_ARGS        8
#endif
//*****************************************************************************
//
//! Process a command line string into arguments and execute the command.
//!
//! /param pcCmdLine points to a string that contains a command line that was
//! obtained by an application by some means.
//!
//! This function will take the supplied command line string and break it up
//! into individual arguments.  The first argument is treated as a command and
//! is searched for in the command table.  If the command is found, then the
//! command function is called and all of the command line arguments are passed
//! in the normal argc, argv form.
//!
//! The command table is contained in an array named <tt>g_sCmdTable</tt> which
//! must be provided by the application.
//!
//! /return Returns /b CMDLINE_BAD_CMD if the command is not found,
//! /b CMDLINE_TOO_MANY_ARGS if there are more arguments than can be parsed.
//! Otherwise it returns the code that was returned by the command function.
//
//*****************************************************************************
int
CmdLineProcess(char *pcCmdLine)
{
    static char *argv[CMDLINE_MAX_ARGS + 1];
    char *pcChar;
    int argc;
    int bFindArg = 1;
    tCmdLineEntry *pCmdEntry;
    //
    // Initialize the argument counter, and point to the beginning of the
    // command line string.
    //
    argc = 0;
    pcChar = pcCmdLine;
    //
    // Advance through the command line until a zero character is found.
    //
    while(*pcChar)
    {
        //
        // If there is a space, then replace it with a zero, and set the flag
        // to search for the next argument.
        //
        if(*pcChar == ' ')
        {
            *pcChar = 0;
            bFindArg = 1;
        }
        //
        // Otherwise it is not a space, so it must be a character that is part
        // of an argument.
        //
        else
        {
            //
            // If bFindArg is set, then that means we are looking for the start
            // of the next argument.
            //
            if(bFindArg)
            {
                //
                // As long as the maximum number of arguments has not been
                // reached, then save the pointer to the start of this new arg
                // in the argv array, and increment the count of args, argc.
                //
                if(argc < CMDLINE_MAX_ARGS)
                {
                    argv[argc] = pcChar;
                    argc++;
                    bFindArg = 0;
                }
                //
                // The maximum number of arguments has been reached so return
                // the error.
                //
                else
                {
                    return(CMDLINE_TOO_MANY_ARGS);
                }
            }
        }
        //
        // Advance to the next character in the command line.
        //
        pcChar++;
    }
    //
    // If one or more arguments was found, then process the command.
    //
    if(argc)
    {
        //
        // Start at the beginning of the command table, to look for a matching
        // command.
        //
        pCmdEntry = &g_sCmdTable[0];
        //
        // Search through the command table until a null command string is
        // found, which marks the end of the table.
        //
        while(pCmdEntry->pcCmd)
        {
            //
            // If this command entry command string matches argv[0], then call
            // the function for this command, passing the command line
            // arguments.
            //
            if(!strcmp(argv[0], pCmdEntry->pcCmd))
            {
                return(pCmdEntry->pfnCmd(argc, argv));
            }
            //
            // Not found, so advance to the next entry.
            //
            pCmdEntry++;
        }
    }
    //
    // Fall through to here means that no matching command was found, so return
    // an error.
    //
    return(CMDLINE_BAD_CMD);
}

第三步:收到命令 調用解析函數
接收可用串口 網口等
假如收到的嗎,命令為  ls -l
*cmd="ls -l";
CmdLineProcess(cmd);
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一级片久久久久久久| 国产精品久久久久久亚洲影视| 国产精品va在线| 亚洲人成毛片在线播放| 国产精品91在线观看| 不卡av电影在线观看| 色一情一乱一区二区| 九九热最新视频//这里只有精品| 亚洲欧美日韩天堂一区二区| 亚洲人成网在线播放| 成人精品视频99在线观看免费| 精品美女久久久久久免费| 久久免费精品日本久久中文字幕| 91在线网站视频| 国产主播欧美精品| 国产香蕉精品视频一区二区三区| 欧美亚洲在线视频| 一二美女精品欧洲| 欧美野外猛男的大粗鳮| 2018中文字幕一区二区三区| 国产精品视频免费在线观看| 国精产品一区一区三区有限在线| 亚洲成人网久久久| 中文字幕日本精品| 欧美精品久久久久久久久久| 欧美激情在线视频二区| 成人av在线亚洲| 国产成人在线精品| x99av成人免费| www.欧美精品| 日韩大片免费观看视频播放| 55夜色66夜色国产精品视频| 国产亚洲欧洲在线| 亚洲人高潮女人毛茸茸| 久久人人爽亚洲精品天堂| 国产中文字幕91| 国产拍精品一二三| 久久久久久网址| 久久99精品国产99久久6尤物| 国产精自产拍久久久久久| 亚洲综合中文字幕68页| 中文字幕亚洲激情| 国产精品www| 26uuu日韩精品一区二区| 欧美激情在线观看视频| 久久久999成人| 国产精品久久久久99| 国产精品嫩草影院一区二区| 在线精品高清中文字幕| 久久99久久99精品中文字幕| 日韩视频免费在线| 黑人精品xxx一区一二区| 久久久久久久国产| 欧美床上激情在线观看| 97免费中文视频在线观看| 国产精品久久久久久久久久| 久久久精品国产网站| 91精品视频大全| 国产精品永久免费视频| 热99精品只有里视频精品| 亚洲成人av在线| 欧美久久久精品| 国外视频精品毛片| 日韩欧美精品在线观看| www.欧美三级电影.com| 91精品免费视频| 国内精品中文字幕| 欧美影院成年免费版| 国产在线视频欧美| 国产91九色视频| 国产欧美精品久久久| 国产欧美在线播放| 日韩中文字幕精品视频| 最近中文字幕mv在线一区二区三区四区| 国产亚洲欧美日韩美女| 国产精品久久久久久久久久免费| 国内揄拍国内精品| 国内久久久精品| 91色视频在线导航| 91精品久久久久久久久不口人| 午夜伦理精品一区| 国产精品女主播| 久久精品国产电影| 中文字幕精品在线视频| 日韩精品视频免费专区在线播放| 国产精品久久久久久久久久久不卡| 成人综合国产精品| 成人福利视频在线观看| 亚洲国产成人精品久久久国产成人一区| 亚洲天堂男人天堂女人天堂| 久久中文字幕在线视频| 中文字幕视频一区二区在线有码| 中文字幕在线日韩| 欧洲s码亚洲m码精品一区| 国产精品影院在线观看| 色婷婷**av毛片一区| 亚洲欧洲日产国产网站| 欧美成人激情视频免费观看| 色阁综合伊人av| 欧美激情xxxx性bbbb| 日韩精品在线电影| 国内精品小视频在线观看| 精品国产自在精品国产浪潮| 亚洲欧美制服另类日韩| 国产精品女人网站| 日本精品久久中文字幕佐佐木| 欧美亚洲另类视频| 亚洲图片欧洲图片av| 色噜噜亚洲精品中文字幕| 97**国产露脸精品国产| 亚洲欧美一区二区激情| 日本成人精品在线| 欧美日韩在线另类| 91精品久久久久| 狠狠久久五月精品中文字幕| 国产人妖伪娘一区91| 久久亚洲精品中文字幕冲田杏梨| 欧洲日本亚洲国产区| 中文字幕欧美日韩精品| 亚洲人成电影网站色www| 欧美日韩成人在线观看| 欧美黑人视频一区| 日韩精品亚洲精品| 久久久久久国产| 黄色精品一区二区| 亚洲视频在线免费观看| 久久激情视频久久| 色爱精品视频一区| 欧美亚洲视频在线看网址| 欧洲精品在线视频| 日韩欧美一区二区三区| 欧美性猛交xxxx乱大交极品| 国产美女久久精品| 国产精品极品美女在线观看免费| 国产精品xxx视频| 一本色道久久88综合日韩精品| 欧美激情视频一区| 国产一区二区三区在线播放免费观看| 国产精品视频久久久久| 国产三级精品网站| 久久99亚洲精品| 美日韩精品免费观看视频| 久久精品美女视频网站| 亚洲aⅴ日韩av电影在线观看| 亚洲第一视频在线观看| 久久人人97超碰精品888| 欧美日韩国产精品| 海角国产乱辈乱精品视频| 精品国产区一区二区三区在线观看| 成人网页在线免费观看| 国产高清视频一区三区| 亚洲色图偷窥自拍| 国产成人精品电影久久久| 中文字幕日韩精品在线观看| 国产欧美一区二区白浆黑人| 久久久久久久国产精品视频| 日韩国产欧美精品一区二区三区| 欧美一级淫片丝袜脚交| 亚洲网站在线观看| 日本国产精品视频| 亚洲精品视频免费| 日韩高清电影免费观看完整| 亚洲国产精品推荐| 欧美在线视频一二三|