201103

来源:互联网 发布:剑三正太捏脸数据导入 编辑:程序博客网 时间:2024/06/05 10:12

1     题目概述:底层软件日志系统设计

1.1     试题考核目的和使用说明

考核目的:本试题主要考核基本的底层软件日志系统设计技能,主要的目的是使考生理解在日常代码编写过程中如何编写有效的日志系统,使我们的日志系统可以满足我们问题定位的各种应用需求,以便在以后的底层软件开发工作中应用这些思想甚至直接借鉴移植相关的代码。

本试题支持Visual Studio 2005调测环境进行调测,并提供了已经建好的工程,具体使用方法参见“1.4试题提供的可直接使用的VC工程”。

1.2 试题使用与答卷提交

使用说明试题中已经明确说明了每个特性的验收标准(试题中提供了部分基本的自动化测试用例和代码),考生需要根据验收标准自行考虑完备的测试思路,考虑各种出错的可能情况。

调试环境:本试题采用Visual Studio 2005集成调测环境,并提供了已经建好的工程,具体使用方法参见“1.4试题提供的可直接使用的VC工程”。

答卷提交:请使用试题包中的LogSys.cpp和LogSys.h编写调试源代码(所有新增源代码均应在这两个文件中,不能增加或者删减源文件),完成后把LogSys.cpp和LogSys.h两个文件用WinRar打包成一个文件后提交,命名格式为“考试级别数字+姓名拼音的首字母+8位工号”的格式,如:

张三的工号为00187658,考0级,则打包文件的名称为:0z00187658.rar

王五的工号为00176588,考1级,则打包文件的名称为:1w00176588.rar

1.3     试题说明

试题简介:该试题要求设计一套底层软件日志系统,该日志系统要求同时支持两种级别(waringerror)的日志输出,每种级别的日志都支持前后台的动态切换。用户在使用该日志系统的时候,向该日志系统进行注册,注册完成后,用户就可以使用统一的日志输出接口对需要控制的模块进行两种级别的日式输出控制。同时提供接口供用户实时将某模块的任意级别的日志输出进行前后台动态切换控制。在进行前台输出的时候,该试题提供前台日志输出桩函数供考生使用;在进行后台输出的时候,要求考生先将待输出的信息传递给后台输出任务,由后台输出任务调用该试题提供的后台日志上传桩函数进行最终输出。

要求考生实现的具体功能包括

(1)       日志系统初始化函数:该函数完成底层软件日志系统的初始化工作,完成必要的资源初始化,包括后台输出任务创建等;

/*****************************************************************

函数原型:unsigned int LOG_InitLogSystem(void)

函数功能:日志系统初始化

输入说明:无

输出说明:无

返回值:表示初始化成功,非零表示初始化失败;

*****************************************************************/

unsigned int LOG_InitLogSystem(void)

【验收标准】

Ø  要求支持重复初始化,如果已经初始化,直接返回;

Ø  要求正常创建日志上传任务;

(2)   日志模块注册函数:该函数将某个模块注册到此日志系统中,以便该模块能使用此日志系统,后续该模块的日志输出都依靠该系统完成,要求各模块同时支持两种级别的日志输出,注册时默认状态:日志级别为ERROR时,前后台都输出,日志级别为WARNING时,前台输出,后台不输出。最多支持8个模块的注册。该函数用户输入模块名字符串,返回给用户模块号。

/********************************************************

函数原型: unsigned int LOG_RegModuleToLogSystem(char *pcModuleName)

函数功能:日志模块动态注册接口,需要进行输出的模块调用该接口向日志系统进行注册,并获取自身的模块ID

输入说明:char *pcModuleName模块名称,长度不超过50字节,不包括'\0'

输出说明:无

返回值:模块使用的输出ID;最多支持8个模块,如果达到最大个数返回失败-1,如果之前注册过,则直接返回原来的模块ID,返回合法值范围(0~7)

******************************************************/

unsigned int LOG_RegModuleToLogSystem(char *pcModuleName)

【验收标准】

Ø  此为对上层软件提供的接口;

Ø  日志系统未初始化则返回失败;

Ø  最多支持8个模块同时注册,如果达到最大个数返回失败-1,如果之前注册过,则直

接返回原来的模块ID,如果没有注册,则进行注册;注意如果当前注册已经满8个,后续再注册之前注册过的模块,要求返回原来的模块ID

Ø  每个注册模块默认状态:打印级别为ERROR时,前后台都输出,打印级别为WARNING

时,前台输出,后台不输出;

(3)       日志输出总函数:该函数输入模块号、字符串,日志级别(ERROR/WARNING),日志输出方式取决于当前该模块该日志级别配置的输出模式(关闭、前台、后台、前后台都支持)

/********************************************************

函数原型:unsigned int LOG_Output( int iModuleId, int iOutLevel, char *pString)

函数功能:各模块使用该统一接口进行日志输出

输入说明:int iModuleId: 模块ID

          int iOutLevel: 日志级别0WARNING 1ERROR

          char *pString:输入的字符串(最长不超过200个字符,不包括'\0'

输出说明:无

返回值:0表示成功,非零表示失败;

********************************************************/

unsigned int LOG_Output( int iModuleId, int iOutLevel, char *pString)

【验收标准】

Ø  此为对上层软件提供的接口;

Ø  日志系统未初始化则返回失败;

Ø  某模块使用该日志系统进行日志输出时,最终输出效果如下表:

输出日志级别

对应日志级别当前输出配置

最终输出效果

ERROR

前台

ERROR级别日志前台输出

ERROR

后台

ERROR级别日志后台输出

ERROR

前后台

ERROR级别日志前后台都输出

ERROR

输出关闭

ERROR级别日志前后台都不输出

WARNING

前台

WARNING级别日志前台输出

WARNING

后台

WARNING级别日志后台输出

WARNING

前后台

WARNING级别日志前后台都输出

WARNING

输出关闭

WARNING级别日志前后台都不输出

              

(4)       模块日志输出方式切换函数:该函数要求根据用户的输入,实时的更改任意模块某个级别日志输出模式;

   /********************************************************

函数原型:unsigned int LOG_SetModuleOutputSwitch(int iModuleId, int iOutLevelint iSwitch)

函数功能:用于设置某个模块某个级别的日志输出模式

输入说明:int iModuleId: 待修改的模块ID

          int iOutLevel: 待修改的日志级别 0WARNING 1ERROR

          int iSwitch: 对应日志级别输出开关设置:0:输出关闭 1:前台  2:后台

3:前后都输出,其他值非法

输出说明:无

返回值: 0表示成功,非零表示失败;*****************************************************************/

unsigned int LOG_SetModuleOutputSwitch (int iModuleId, int iOutLevel,int iSwitch)

【验收标准】

Ø  此为对上层软件提供的接口;

Ø  日志系统未初始化则返回失败;

Ø  按照输入值设置该模块的对应日志级别的输出开关;

 

 

5)后台日志输出实现函数:该函数是后台输出(除上传功能外)的具体实现,在函数中做必要的过滤处理,然后将待输出的字符串通过某种方式传递给在初始化时创建的日志上传任务,由此任务调用提供的后台日志上传接口桩函数做最终的日志上传

   /********************************************************

函数原型:unsigned int LOG_BackgroudOutput(char *pstring)

函数功能:该函数是后台输出(除上传功能外)的具体实现,各模块统一使用此接

          口进行后台输出,在函数中做必要的过滤处理,然后将待输出的字符串

          通过某种方式传递给在初始化时创建的日志上传任务,由此任务调用提供

的后台日志上传接口桩函数做最终的日志上传

输入说明:char*pstring   打印输入字符串(最长200字节,不包括'\0'

输出说明:无

返回值:0表示成功,非零表示失败;*****************************************************************/

unsigned int LOG_BackgroudOutput (char *pstring)

【验收标准】

Ø  此为对上层软件提供的接口;

Ø  日志系统未初始化,返回失败;

Ø  要求将当前要记录的日志和最近记录的20条日志进行比较,如果有相同,则需要将

此条日志过滤掉,不进行输出记录;

Ø  通过消息队列或信号量等合适的方式将待输出字符串传递给后台日志上传任务,由此

任务做最终的日志上传;

 

(5)       后台日志上传任务处理函数:该函数是日志上传任务的入口函数,实现后台日志的上传;

/*****************************************************************

函数原型:void LOG_LogSysToBackgroud(void)

函数功能:该函数是日志上传任务tLogToBackgroudTask的入口函数,实现后台

          日志的上传

输入说明:无

输出说明:无

返回值:无 *****************************************************************/

void LOG_LogSysToBackgroud (void)

【验收标准】

Ø  要求能正常将当前所有的后台记录的日志调用标准上传函数  

LOG_BackgroudRecord进行上传;

Ø  任务功能正常,不影响系统性能或影响较小。

1.4     试题配套API文件说明

试题提供的配套API文件为LogSysApi.cppLogSysApi.h注:考生直接编译链接即可,不允许修改其中的任何代码),该源文件提供了试题编码所需要的所有API函数和桩函数供调用,主要的目的是在脱离操作系统和硬件的情况下可以在PC机上进行试题的编写和调试,该文件中的API函数介绍如下:

/**********************************************************************

函数名: unsigned int LOG_ForegroudOutput(char *pstring)

功能描述: 日志系统前台输出桩函数

输入参数: char*pstring   打印输入字符串(最长200字节,不包括'\0')

输出参数: 无

函数返回: 0表示成功,非零表示失败

**********************************************************************/

unsigned int LOG_ForegroudOutput(char *pstring);

 

/**********************************************************************

函数名: unsigned int LOG_BackgroudRecord(char *pstring)

功能描述: 日志系统后台日志上传桩函数,用于后台任务收到日志后进行上传操作

输入参数: char*pstring   输入字符串(最长200字节,不包括'\0')

输出参数: 无

函数返回: 0表示成功,非零表示失败

**********************************************************************/

unsigned int LOG_BackgroudRecord(char *pstring);

 

/**********************************************************************

函数名: unsigned int LOG_CreateAndStartTask( void* pTaskEntry )

功能描述: 创建并启动一个任务

输入参数: pTaskEntry 任务入口函数

输出参数: 无

函数返回: 0表示获取成功,非零表示获取失败

**********************************************************************/

unsigned int LOG_CreateAndStartTask( void* pTaskEntry );

 

/**********************************************************************

函数名: void LOG_WaitEventSemaphore(int iWaitTime)

功能描述: 等待事件信号量。获取到后会清除信号量,必须再主动释放才可以

被获取,信号量不需要用户创建,可以直接使用。

输入参数: int iWaitTime: -1:表示死等,直到事件信号量到达

其他值:表示等待时间

输出参数: 无

函数返回: 无

**********************************************************************/

void LOG_WaitEventSemaphore (int iWaitTime)

 

/**********************************************************************

函数名: void LOG_FreeEventSemaphore ( void )

功能描述: 释放事件信号量。

输入参数: 无

输出参数: 无

函数返回: 无

**********************************************************************/

void LOG_FreeEventSemaphore ( void );

 

/**********************************************************************

函数名: void LOG_SendMsg(char* pucMsg)

功能描述: 发送消息桩函数,消息队列不需要用户创建,可以直接使用

输入参数: char* pucMsg:待发送消息,必须以'\0'结束

输出参数: 无

函数返回: 无

**********************************************************************/

void LOG_SendMsg(char* pucMsg);

 

/**********************************************************************

函数名: char* LOG_GetMsg(int iWaitTime)

功能描述: 接收消息桩函数

输入参数: int iWaitTime: -1:表示死等,直到有消息到达其他值:表示等待时间

输出参数: 无

函数返回: char* 返回消息指针,以'\0'结束,返回0表示无任何消息收到

**********************************************************************/

char* LOG_GetMsg(int iWaitTime);

 

/**********************************************************************

函数名: void LOG_TaskDelay (int iTickTime)

功能描述: 主动释放CPU指定时间Tick数,Tick单位为20ms

输入参数: int iTickTime: 需要释放CPU时间Tick数,取值必须大于0;

输出参数: 无

函数返回: 无

**********************************************************************/

void LOG_TaskDelay (int iTickTime);

 

1.5     试题提供的可直接使用的VC工程

1.5.1       VC试题工程及其使用方法

双击“\LogProj \LogProj.sln”程序可以直接打开工程环境,源代码框架(“\LogProj\source”)已经提前加到工程中了。

1)考生所有的正式代码务必在LogSys.cppLogSys.h文件提供,提交试卷时只需要打包提交这两个文件即可;

2LogSysApi.cppLogSysAp.h为提供给考生的可用API函数和相关定义,考生可以参考其内部实现,不允许考生修改其中的任何内容;

3LogSysAutoTest.cppLogSysAutoTest.h为自动化测试用例(只提供基本的自动化测试用例,并非全部,参加考试的同事需要根据试题要求设计和使用更详细的测试用例),供考生完成试题后验证实现是否正确,请不要在这两个文件增加正式代码,自动化阅卷时只使用考生提交的LogSys.cppLogSys.h文件进行阅卷。

1.5.2       VC试题工程调试方法

1、编写好代码后,右键点击LogProj,点击Rebuild进行编译

2、编译完成后点击Start DebuggingF5)进行调试

 

调试运行会出现如下命令窗口:

在界面中输入需要执行的用例号数字,对应的用例就会自动执行,执行完后按任意键退出此执行用例,如下图示例所示:

3、要测试其他项,需要重新运行(按F5键),会重新显示上述的命令窗口,参加考试的同事可重新输入对应的数字进行其他测试项的测试,只需要重复步骤2即可