本代码在Tornado2.0的Simu下调试通过,原理上与CPU架构无关,应该都适用。
如果引用的话,请告诉我,或者评论一句[页面最下方],不要一声不吭


/* usrAppInit.c - stub application initialization routine */

/* Copyright 1984-1998 Wind River Systems, Inc. */

/*
modification history
--------------------
2004-9-29  ,Rex  deal with buffer alloc
2004-9-29  ,Rex  deal with task's err output
2004-9-25  ,Rex  shell_output_to_memory()
01a,02jun98,ms   written
*/

/*
DESCRIPTION
rex  shell_output_to_memory
*/

/*********************rex******************************/
/*libs*/
#include <taskLib.h>
#include <vxWorks.h>
#include <stdio.h>
#include <string.h>

#include "dosFsLib.h"
#include "ramDrv.h"
#include "usrLib.h"

/*Macros*/
#define DIAG_RAM_DISK_SIZE  (0x100000)  /* 1M */
#define DIAG_RAM_DISK_NAME  "/diag/"
#define DIAG_TEMP_PIPE_FILE DIAG_RAM_DISK_NAME"temp.pip"

/*struct&type*/
typedef struct Rex_taskSummary
{
    int tid;
}Rex_TASKSUMMARY;

/*Declarations*/
STATUS Diagnose_Init();
char* shell_output_to_memory(FUNCPTR , void* , char *, unsigned int );

char* cmd_exe_taskSummary(char *);
void Rex_taskSummary(Rex_TASKSUMMARY *);

/******************************************************************************
*
* usrAppInit - initialize the users application
*/

void usrAppInit (void)
    {
#ifdef USER_APPL_INIT
 USER_APPL_INIT;  /* for backwards compatibility */
#endif

    /* add application specific code here */
    Diagnose_Init();
    }
 

/* new implement employing shell_output_to_memory() routine */
void Rex_taskSummary(Rex_TASKSUMMARY *Rex_ts)
{
    i(Rex_ts->tid);
}

char* cmd_exe_taskSummary(char * taskNameString)
{
    Rex_TASKSUMMARY Rex_TS;
   
    if(NULL == taskNameString)
        Rex_TS.tid = 0;
    else
        Rex_TS.tid = (int)taskNameString;
   
    return shell_output_to_memory((FUNCPTR)Rex_taskSummary, &Rex_TS, NULL, 0);
}

char* cmd_exe_taskInfo(char * taskNameString)
{
    return NULL;
}

/*
 i | ti | tt | memShow | spyReport | etc.
*/
/*Exe Entry*/
void ExeRex(int cmdIndex, char* taskNameString)
{
    char* stString = NULL;
   
    switch(cmdIndex)
    {
        case 1: /* i */
            if((stString = cmd_exe_taskSummary(taskNameString)))
            {
                printf("%s", stString);
                free(stString);
            }
            else
            {
                printf("i Error\n");
            }
         break;
        case 2: /* ti */
            if((stString = cmd_exe_taskInfo(taskNameString)))
            {
                printf("%s", stString);
                free(stString);
            }
            else
            {
                printf("ti Error\n");
            }
         break;
        case 3: /* tt */
         break;        
        case 4: /* memShow */
         break;
        case 5: /* spyReport */
         break;
        case 0:
        default: 
            printf("help!\n");
         break;
    }
}

STATUS Diagnose_Init()
{
    BLK_DEV     *pBlkDev;
    char        *pDiagRamDiskBase = NULL;
   
    ramDrv();
    pDiagRamDiskBase = malloc(DIAG_RAM_DISK_SIZE);
    if(NULL == pDiagRamDiskBase)
        return ERROR;
    bzero(pDiagRamDiskBase,DIAG_RAM_DISK_SIZE);

    pBlkDev = ramDevCreate( pDiagRamDiskBase,              /* start address */
                            512,                                /* sector size */
                            64,                                 /* sectors per track */
                            (int)(DIAG_RAM_DISK_SIZE/512),       /* total sectors 64 MBytes */
                            0);                                 /* offset */
    if(NULL == pBlkDev)
    {
        free(pDiagRamDiskBase);
        return ERROR;
    }

    if(NULL == dosFsMkfs (DIAG_RAM_DISK_NAME, pBlkDev))
    {
        free(pDiagRamDiskBase);
        return ERROR;

    }

    return OK;
}
/*****************************************************************************
  函数名        : shell_output_to_memory
  功能描述      : 将VxWorks的shell打印输出到指定内存中,可用于CLI下的诊断命令显示以及故障自动捕获等功能
  调用函数列表  :   ioTaskStdGet()
                    ioTaskStdSet()
                    open()
                    close()
                    fopen()
                    fseek()
                    ftell()
                    fclose()
                    bzero()
                    remove()
  被函数调用    : CLI用户函数
  输入参数      : FUNCPTR shellRoutine,   在shell下打印输出的函数实体,它调用printf输出的内容将“打印”到指定内存里去
                  void* arg,              shellRoutine的参数,一般来说是一个结构指针,以包含更多信息,具体信息由shellRoutine解析
                  char *dest,             为NULL,则说明用户不知道输出的信息数据大小,需要本接口代为申请;不为NULL,即为指定地址
                  unsigned int destSize   当dest为NULL时无意义;当dest不为NULL时,为dest指向的内存的大小
  输出参数      : 无
  返回          : 指向具体输出信息的指针; NULL为失败
  特殊内存      : 需要事先创建RamDisk,参见Diagnose_Init()
  其他          :
==============================================================================
  修改记录:
  修改日期         版本         修改人      修改原因及内容
==============================================================================
  2004-9-25        1.0          REX            创建
******************************************************************************/
char* shell_output_to_memory(FUNCPTR shellRoutine, void* arg, char *dest, unsigned int destSize)
{
    int tempFileFd = ERROR;
    int OrigOutPutFd = ERROR;
    int OrigErrPutFd = ERROR; /*2004-9-29*/
    FILE *tempFile = NULL;
    long  fileSize = 0;
    char *contentBuf = NULL;

    /*1、参数检查*/
    if(NULL == shellRoutine)
    {
        return NULL;   
    }
    if(NULL == dest) /*用户未指定内存,则将destSize置为最大,以便之后统一取最小值*/
        destSize = ~0x0;
       
    /*2、重定向输出到临时文件*/
    OrigOutPutFd = ioTaskStdGet(0,1); /*保存原来的输出句柄*/
    OrigErrPutFd = ioTaskStdGet(0,2); /*保存原来的ERR句柄 2004-9-29*/

if(ERROR == (tempFileFd = open(DIAG_TEMP_PIPE_FILE,O_CREAT | O_RDWR,0)))
    {
        printf("error open a temp file for diag\n");
        return NULL;
    }
    ioTaskStdSet(0,1,tempFileFd);
    ioTaskStdSet(0,2,tempFileFd); /*2004-9-29*/
    shellRoutine(arg); /*调用用户输出例程*/
    ioTaskStdSet(0,1,OrigOutPutFd);
    ioTaskStdSet(0,2,OrigErrPutFd); /*2004-9-29*/
    close(tempFileFd);
   
    /*3、打开临时文件,获取数据大小,并指定内存*/
    if(NULL == (tempFile = fopen(DIAG_TEMP_PIPE_FILE,"r")))
    {
        printf("error open the temp file for diag\n");
        remove(DIAG_TEMP_PIPE_FILE);
        return NULL;
    }
    fseek(tempFile, 0, SEEK_END);
    if(-1L == (fileSize = ftell(tempFile)))
    {
        printf("error pos the temp file for diag\n");
        fclose(tempFile);
        remove(DIAG_TEMP_PIPE_FILE);
        return NULL;
    }
    printf("fileSize1 = %ld\n",fileSize);
    fileSize = (fileSize >= destSize) ? destSize : fileSize; /*取两者的最小值,避免越界*/
    printf("fileSize2 = %ld\n",fileSize);
   
    if(NULL == dest) /*用户未指定内存,我们为之申请*/
    {    /*fileSize为零不处理,直接返回 2004-9-29*/
        if((0 == fileSize) || (NULL == (contentBuf = malloc(fileSize + 1))))
        {/*多申请一个字节作为字符串的结束符位置 2004-9-29*/
            printf("error alloc mem for diag\n");
            fclose(tempFile);
            remove(DIAG_TEMP_PIPE_FILE);
            return NULL;
        }
    }
    else /*使用用户指定的内存存放*/
    {
        contentBuf = dest;
    }/*内存的释放由用户完成*/
   
    /*4、读取文件内容到内存*/
    bzero(contentBuf, fileSize + 1); /*多清零一个字节作为字符串的结束符位置 2004-9-29*/
    fseek(tempFile, 0, SEEK_SET);
    fread(contentBuf, fileSize, 1, tempFile);
    /*printf("%s\n",contentBuf);*/
   
    /*5、清理*/
    fclose(tempFile);
    remove(DIAG_TEMP_PIPE_FILE);   
   
    return contentBuf;
}


写了一个将VxWorks的shell打印输出到指定内存中的接口,可广泛用于CLI下的调试函数显示以及故障自动捕获等功能,稍作修改可以适合其它嵌入式OS...相关推荐

  1. 从0开始写出一个最简单的shell(基于x210)

    文章目录 前言 一.什么是shell? 1.shell是什么鬼 2.程序或操作系统的用户接口 3.两种shell:GUI和cmdline 4.shell的运行原理:由消息接收.解析.执行构成的死循环 ...

  2. 用 python 写了一个日记本

    写一个随机任务抽取器 一.前言 二.逻辑构思 2.1 目标实现 2.2 搭建开发环境 2.3 Pyinstaller 打包 三.效果展示 3.1 初始化和添加日记 3.2 查看日记 3.3 删除日记 ...

  3. 网页制作(七)---照着google注册页面边学边写的一个网页

    花了五六个小时边学边写了一个注册页面,仿照google邮箱注册的样子,刚开始,看了下google注册页面的原码,当时就不够淡定了,总计有六千多行代码,当时就有点晕了.在心里告诉自己:如果这次放弃,以后 ...

  4. linux 函数自动补全,Shell脚本中实现自动补全功能

    对于Linuxer来说,自动补全是再熟悉不过的一个功能了.当你在命令行敲下部分的命令时,肯定会本能地按下Tab键补全完整的命令,当然除了命令补全之外,还有文件名补全. Bash-completion ...

  5. 用shell写了一个自动编译代码的脚本

    点击打开链接 为了充分利用晚上的时间进行编译,用shell写了一个自动编译代码的脚本,这样保证第二天的调试工作不会受大版本编译的影响,同时也能监测服务器端的代码是否出错.我习惯是在每天下班离开之前运行 ...

  6. 用shell脚本写的一个简单的俄罗斯方块

    用shell脚本写的一个简单的俄罗斯方块 代码 代码 测试 下载链接 代码 代码 #!/bin/bash #version 1.2,若非正常退出,请使用附带的killel.sh脚本杀死进程 #定义用于 ...

  7. php给apk包签名,Android_查看apk签名信息方法,用shell写了一个查看apk签名的 - phpStudy...

    查看apk签名信息方法 用shell写了一个查看apk签名的脚本.代码很少也很简单 #!/bin/bash mkdir .temp_for_certificate cd .temp_for_certi ...

  8. 什么样的人适合学习嵌入式开发

    未来的几年,随着信息化,智能化,网络化的发展,嵌入式系统技术也将获得广阔的发展空间. 手机.电子字典.可视电话.数字相机(DC).数字摄像机(DV).U-Disk.机顶盒(Set Top Box).高 ...

  9. 【技术分享】linux各种一句话反弹shell总结——攻击者指定服务端,受害者主机(无公网IP)主动连接攻击者的服务端程序(CC server),开启一个shell交互,就叫反弹shell。...

    反弹shell背景: 想要搞清楚这个问题,首先要搞清楚什么是反弹,为什么要反弹. 假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常 ...

最新文章

  1. 简单的XML和JSON数据的处理
  2. 【ORACLE 高可用】作业 :配置ORACLE GoldenGate 2
  3. 软件构造学习笔记-第六周
  4. EL : Free Package of October
  5. C语言中全局变量存放在哪个位置?
  6. Html中锚点的使用【转】
  7. android app定时自动重启,android 应用程序自动重启
  8. 谭浩强c语言第五版 第二章习题解答
  9. 科技巨头极速进场 车路协同技术为何被热捧?
  10. Python 条件语句(If else)
  11. SharePoint 2013 安装中间出错了怎么办? 每一次安装都是一段曲折的路【1603(0x643) 】...
  12. 用自己电脑做网站服务器
  13. 关于大内存(大于4G)支持的问题
  14. react结合rust编写wasm图像处理
  15. 不撞南墙不回头-深度优先搜索算法
  16. 2020-11-01(电脑耳机声音外放)
  17. Padavan固件免流,能连接成功暂时没测成功免流没有
  18. WordPress 使用 CDN 后获取访客真实 IP
  19. javaAPI文档中文版(JDK11在线版)无需下载、直接打开
  20. 1分钟部署单机版kubernetes 1.13.4

热门文章

  1. 一文说清AI智能平台
  2. 培育强人工智能的「ImageNet」:上海交大卢策吾组提出铰接物体知识库 AKB-48
  3. 钟南山院士应邀向欧洲同仁全方位解析新冠肺炎(配中文文字版)
  4. 谷歌新智能体Dreamer将亮相NeurIPS 2019,数据效率比前身PlaNet快8个小时
  5. 腾讯发布95页重磅报告:全面预测中国互联网未来5年趋势
  6. 中国将对人工智能、云计算等行业独角兽IPO即报即审
  7. 淘宝特价版给拼多多送芒果,网友:这是什么操作?
  8. 从0 到1 又如何?他逆袭成边缘云计算的贡献者
  9. 原来 Excel 只需三步就可以给证件照换底色!
  10. 字节跳动凌晨发半个月奖金,网友:我酸了,又是别人家的公司!