当前位置: 首页 > news >正文

做公司网站注意什么企业网站建设包含哪些内容

做公司网站注意什么,企业网站建设包含哪些内容,h5 高端网站建设,微商城网站建设系列篇从内核视角用一句话概括shell的底层实现为#xff1a;两个任务#xff0c;三个阶段。其本质是独立进程#xff0c;因而划到进程管理模块。每次创建shell进程都会再创建两个任务。 客户端任务(ShellEntry)#xff1a; 负责接受来自终端(控制台)敲入的一个个字符…系列篇从内核视角用一句话概括shell的底层实现为两个任务三个阶段。其本质是独立进程因而划到进程管理模块。每次创建shell进程都会再创建两个任务。 客户端任务(ShellEntry) 负责接受来自终端(控制台)敲入的一个个字符字符按VT规范组装成一句句的命令。服务端任务(ShellTask) 对命令进行解析并执行,将结果输出到控制台。 而按命令生命周期可分三个阶段.编辑 鸿蒙在这个部分实现了一个简单的编辑器功能,处理控制台输入的每个字符,主要包括了对控制字符 例如 ESC,\t,\b,\n,\r,四个方向键0x41 ~ 0x44 的处理。解析 对编辑后的字符串进行解析解析出命令项和参数项找到对应的命令项执行函数。执行 命令可通过静态和动态两种方式注册到内核解析出具体命令后在注册表中找到对应函数回调。将结果输出到控制台。 编辑部分由客户端任务完成后两个部分由服务端任务完成命令全局注册由内核完成。 本篇主要说 服务端任务 和 解析/执行过程.客户端任务 和 编辑过程 已在 (Shell编辑篇) 中说明,请自行翻看. 总体过程 第一步 将支持的shell命令注册进全局链表,支持静态和动态两种方式,内容包括命令项,参数信息和回调函数.第二步 由独立任务解析出用户输入的命令行,拆分出命令项和参数内容第三步 通过命令项在全局链表中遍历找到已注册的回调函数,并执行. 结构体 鸿蒙对命令的注册用了三个结构体,个人感觉前两个可以合成一个,降低代码阅读难度. STATIC CmdModInfo g_cmdInfo;//shell 命令模块信息,上面挂了所有的命令项(ls,cd ,cp )typedef struct {//命令项CmdType cmdType; //命令类型//CMD_TYPE_EX不支持标准命令参数输入会把用户填写的命令关键字屏蔽掉例如输入ls /ramfs传入给注册函数的参数只有/ramfs而ls命令关键字并不会被传入。//CMD_TYPE_STD支持的标准命令参数输入所有输入的字符都会通过命令解析后被传入。const CHAR *cmdKey; //命令关键字例如:ls 函数在Shell中访问的名称。UINT32 paraNum; //调用的执行函数的入参最大个数暂不支持。CmdCallBackFunc cmdHook;//命令执行函数地址即命令实际执行函数。 } CmdItem; typedef struct { //命令节点LOS_DL_LIST list; //双向链表CmdItem *cmd; //命令项 } CmdItemNode;/* global info for shell module */ typedef struct {//shell 模块的全局信息CmdItemNode cmdList; //命令项节点UINT32 listNum;//节点数量UINT32 initMagicFlag;//初始魔法标签 0xABABABABLosMux muxLock; //操作链表互斥锁CmdVerifyTransID transIdHook;//暂不知何意 } CmdModInfo;解读 CmdItem为注册的内容载体结构体,cmdHook为回调函数,是命令的真正执行体.通过双向链表CmdItemNode.list将所有命令穿起来CmdModInfo记录命令数量和操作的互斥锁,shell的魔法数字为 0xABABABAB 第一步 | Shell 注册 静态宏方式注册,链接时处理 静态注册命令方式一般用在系统常用命令注册,鸿蒙已支持以下命令. arp cat cd chgrp chmod chown cp cpup date dhclient dmesg dns format free help hwi ifconfig ipdebug kill log ls lsfd memcheck mkdir mount netstat oom partinfo partition ping ping6 pwd reset rm rmdir sem statfs su swtmr sync systeminfo task telnet test tftp touch umount uname watch writeproc 例如注册 ls命令SHELLCMD_ENTRY(ls_shellcmd, CMD_TYPE_EX, ls, XARGS, (CMD_CBK_FUNC)osShellCmdLs)需在链接选项中添加链接该新增命令项参数,具体在liteos_tables_ldflags.mk文件的LITEOS_TABLES_LDFLAGS项下添加-uls_shellcmd。至于SHELLCMD_ENTRY是如何实现的在链接阶段的注册,请自行翻看 (内联汇编篇) ,有详细说明实现细节. 动态命令方式,运行时处理 动态注册命令方式一般用在用户命令注册,具体实现代码如下: osCmdReg(CMD_TYPE_EX, ls, XARGS, (CMD_CBK_FUNC)osShellCmdLs){// ....//5.正式创建命令,挂入链表return OsCmdItemCreate(cmdType, cmdKey, paraNum, cmdProc);//不存在就注册命令}//创建一个命令项,例如 chmodSTATIC UINT32 OsCmdItemCreate(CmdType cmdType, const CHAR *cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc){CmdItem *cmdItem NULL;CmdItemNode *cmdItemNode NULL;//1.构造命令节点过程cmdItem (CmdItem *)LOS_MemAlloc(m_aucSysMem0, sizeof(CmdItem));if (cmdItem NULL) {return OS_ERRNO_SHELL_CMDREG_MEMALLOC_ERROR;}(VOID)memset_s(cmdItem, sizeof(CmdItem), \0, sizeof(CmdItem));cmdItemNode (CmdItemNode *)LOS_MemAlloc(m_aucSysMem0, sizeof(CmdItemNode));if (cmdItemNode NULL) {(VOID)LOS_MemFree(m_aucSysMem0, cmdItem);return OS_ERRNO_SHELL_CMDREG_MEMALLOC_ERROR;}(VOID)memset_s(cmdItemNode, sizeof(CmdItemNode), \0, sizeof(CmdItemNode));cmdItemNode-cmd cmdItem; //命令项 cmdItemNode-cmd-cmdHook cmdProc;//回调函数 osShellCmdLscmdItemNode-cmd-paraNum paraNum;//777,/homecmdItemNode-cmd-cmdType cmdType;//关键字类型cmdItemNode-cmd-cmdKey cmdKey; //chmod//2.完成构造后挂入全局链表(VOID)LOS_MuxLock(g_cmdInfo.muxLock, LOS_WAIT_FOREVER);OsCmdAscendingInsert(cmdItemNode);//按升序方式插入g_cmdInfo.listNum;//命令总数增加(VOID)LOS_MuxUnlock(g_cmdInfo.muxLock);return LOS_OK;}第二步 解析 | ShellTask //shell 服务端任务初始化,这个任务负责解析和执行命令 LITE_OS_SEC_TEXT_MINOR UINT32 ShellTaskInit(ShellCB *shellCB) {CHAR *name NULL;TSK_INIT_PARAM_S initParam {0};//输入Shell命令的两种方式if (shellCB-consoleID CONSOLE_SERIAL) { //通过串口工具name SERIAL_SHELL_TASK_NAME;} else if (shellCB-consoleID CONSOLE_TELNET) {//通过远程工具name TELNET_SHELL_TASK_NAME;} else {return LOS_NOK;}initParam.pfnTaskEntry (TSK_ENTRY_FUNC)ShellTask;//任务入口函数,主要是解析shell命令initParam.usTaskPrio 9; /* 9:shell task priority */initParam.auwArgs[0] (UINTPTR)shellCB;initParam.uwStackSize 0x3000;initParam.pcName name;initParam.uwResved LOS_TASK_STATUS_DETACHED;(VOID)LOS_EventInit(shellCB-shellEvent);//初始化事件,以事件方式通知任务解析命令return LOS_TaskCreate(shellCB-shellTaskHandle, initParam);//创建任务 } LITE_OS_SEC_TEXT_MINOR UINT32 ShellTask(UINTPTR param1,UINTPTR param2,UINTPTR param3,UINTPTR param4) {UINT32 ret;ShellCB *shellCB (ShellCB *)param1;(VOID)param2;(VOID)param3;(VOID)param4;while (1) {PRINTK(\nOHOS # );//读取shell 输入事件 例如: cat weharmony.net 命令ret LOS_EventRead(shellCB-shellEvent,0xFFF, LOS_WAITMODE_OR | LOS_WAITMODE_CLR, LOS_WAIT_FOREVER);if (ret SHELL_CMD_PARSE_EVENT) {//获得解析命令事件ShellCmdProcess(shellCB);//处理命令 } else if (ret CONSOLE_SHELL_KEY_EVENT) {//退出shell事件break;}}OsShellKeyDeInit((CmdKeyLink *)shellCB-cmdKeyLink);//OsShellKeyDeInit((CmdKeyLink *)shellCB-cmdHistoryKeyLink);(VOID)LOS_EventDestroy(shellCB-shellEvent);//注销事件(VOID)LOS_MemFree((VOID *)m_aucSysMem0, shellCB);//释放shell控制块return 0; }解读 任务优先级和 客户端任务 一样同为 9 指定内核栈大小为0x3000 12K ,因任务负责命令的解析和执行,所以需要更大的内核空间. 任务的入口函数ShellTask,一个死循环在以LOS_WAIT_FOREVER方式死等事件发生. SHELL_CMD_PARSE_EVENT 通知开始解析事件,该事件由 客户端任务ShellEntry检测到回车键时发出. STATIC VOID ShellNotify(ShellCB *shellCB){(VOID)LOS_EventWrite(shellCB-shellEvent, SHELL_CMD_PARSE_EVENT);}* CONSOLE_SHELL_KEY_EVENT 收到 exit命令时将发出该事件,退出shell回收资源 层层跟进ShellCmdProcess,解析出命令项和参数内容,最终跑到OsCmdExec中遍历 已注册的命令表,找出命令对应的函数完成回调. LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdExec(CmdParsed *cmdParsed, CHAR *cmdStr){UINT32 ret;CmdCallBackFunc cmdHook NULL;CmdItemNode *curCmdItem NULL;UINT32 i;const CHAR *cmdKey NULL;if ((cmdParsed NULL) || (cmdStr NULL) || (strlen(cmdStr) 0)) {return (UINT32)OS_ERROR;}ret OsCmdParse(cmdStr, cmdParsed);//解析出命令关键字,参数if (ret ! LOS_OK) {goto OUT;}//遍历命令注册全局链表LOS_DL_LIST_FOR_EACH_ENTRY(curCmdItem, (g_cmdInfo.cmdList.list), CmdItemNode, list) {cmdKey curCmdItem-cmd-cmdKey;if ((cmdParsed-cmdType curCmdItem-cmd-cmdType) (strlen(cmdKey) strlen(cmdParsed-cmdKeyword)) (strncmp(cmdKey, (CHAR *)(cmdParsed-cmdKeyword), strlen(cmdKey)) 0)) {//找到命令的回调函数 例如: ls - osShellCmdLscmdHook curCmdItem-cmd-cmdHook;break;}}ret OS_ERROR;if (cmdHook ! NULL) {//执行命令,即回调函数ret (cmdHook)(cmdParsed-paramCnt, (const CHAR **)cmdParsed-paramArray);}OUT:for (i 0; i cmdParsed-paramCnt; i) {//无效的命令要释放掉保存参数的内存if (cmdParsed-paramArray[i] ! NULL) {(VOID)LOS_MemFree(m_aucSysMem0, cmdParsed-paramArray[i]);cmdParsed-paramArray[i] NULL;}}return (UINT32)ret;}第三步 | 执行 想知道有哪些系统shell命令,可以搜索关键词SHELLCMD_ENTRY拿到所有通过静态方式注册的命令. 其中有网络的,进程的,任务的,内存的 等等,此处列出几个常用的shell命令的实现. ls 命令 SHELLCMD_ENTRY(ls_shellcmd, CMD_TYPE_EX, ls, XARGS, (CmdCallBackFunc)osShellCmdLs);/******************************************************* 命令功能 ls命令用来显示当前目录的内容。命令格式 ls [path]path为空时显示当前目录的内容。 path为无效文件名时显示失败提示 ls error: No such directory。 path为有效目录路径时会显示对应目录下的内容。使用指南 ls命令显示当前目录的内容。 ls可以显示文件的大小。 proc下ls无法统计文件大小显示为0。*******************************************************/ int osShellCmdLs(int argc, const char **argv) {char *fullpath NULL;const char *filename NULL;int ret;char *shell_working_directory OsShellGetWorkingDirtectory();//获取当前工作目录if (shell_working_directory NULL){return -1;}ERROR_OUT_IF(argc 1, PRINTK(ls or ls [DIRECTORY]\n), return -1);if (argc 0)//木有参数时 - #ls {ls(shell_working_directory);//执行ls 当前工作目录return 0;}filename argv[0];//有参数时 - #ls ../harmony or #ls /no such file or directoryret vfs_normalize_path(shell_working_directory, filename, fullpath);//获取全路径,注意这里带出来fullpath而fullpath已经在内核空间ERROR_OUT_IF(ret 0, set_err(-ret, ls error), return -1);ls(fullpath);//执行 ls 全路径free(fullpath);//释放全路径为啥要释放因为fullpath已经由内核空间分配return 0; }task 命令 SHELLCMD_ENTRY(task_shellcmd, CMD_TYPE_EX, task, 1, (CmdCallBackFunc)OsShellCmdDumpTask);LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdDumpTask(INT32 argc, const CHAR **argv) {UINT32 flag 0; #ifdef LOSCFG_KERNEL_VMflag | OS_PROCESS_MEM_INFO; #endifif (argc 2) { /* 2: The task shell name restricts the parameters */goto TASK_HELP;}if (argc 1) {if (strcmp(-a, argv[0]) 0) {flag | OS_PROCESS_INFO_ALL;} else if (strcmp(-i, argv[0]) 0) {if (!OsShellShowTickRespo()) {return LOS_OK;}goto TASK_HELP;} else if (strcmp(-t, argv[0]) 0) {if (!OsShellShowSchedParam()) {return LOS_OK;}goto TASK_HELP;} else {goto TASK_HELP;}}return OsShellCmdTskInfoGet(OS_ALL_TASK_MASK, NULL, flag);TASK_HELP:PRINTK(Unknown option: %s\n, argv[0]);PRINTK(usage: task or task -a\n);return LOS_NOK; }cat 命令 SHELLCMD_ENTRY(cat_shellcmd, CMD_TYPE_EX, cat, XARGS, (CmdCallBackFunc)osShellCmdCat);/***************************************************************** cat用于显示文本文件的内容。cat [pathname] cat weharmony.txt *****************************************************************/ int osShellCmdCat(int argc, const char **argv) {char *fullpath NULL;int ret;unsigned int ca_task;struct Vnode *vnode NULL;TSK_INIT_PARAM_S init_param;char *shell_working_directory OsShellGetWorkingDirtectory();//显示当前目录 pwdif (shell_working_directory NULL){return -1;}ERROR_OUT_IF(argc ! 1, PRINTK(cat [FILE]\n), return -1);ret vfs_normalize_path(shell_working_directory, argv[0], fullpath);//由相对路径获取绝对路径ERROR_OUT_IF(ret 0, set_err(-ret, cat error), return -1);VnodeHold();ret VnodeLookup(fullpath, vnode, O_RDONLY);if (ret ! LOS_OK){set_errno(-ret);perror(cat error);VnodeDrop();free(fullpath);return -1;}if (vnode-type ! VNODE_TYPE_REG){set_errno(EINVAL);perror(cat error);VnodeDrop();free(fullpath);return -1;}VnodeDrop();(void)memset_s(init_param, sizeof(init_param), 0, sizeof(TSK_INIT_PARAM_S));init_param.pfnTaskEntry (TSK_ENTRY_FUNC)osShellCmdDoCatShow;init_param.usTaskPrio CAT_TASK_PRIORITY; //优先级10init_param.auwArgs[0] (UINTPTR)fullpath; //入口参数init_param.uwStackSize CAT_TASK_STACK_SIZE;//内核栈大小init_param.pcName shellcmd_cat; //任务名称init_param.uwResved LOS_TASK_STATUS_DETACHED | OS_TASK_FLAG_SPECIFIES_PROCESS;init_param.processID 2; /* 2: kProcess */ //内核任务ret (int)LOS_TaskCreate(ca_task, init_param);//创建任务显示cat内容if (ret ! LOS_OK){free(fullpath);}return ret; }你能看明白这些命令的底层实现吗? 如果看明白了,可能会不由得发出 原来如此 的感叹! 鸿蒙全栈开发全新学习指南 也为了积极培养鸿蒙生态人才让大家都能学习到鸿蒙开发最新的技术针对一些在职人员、0基础小白、应届生/计算机专业、鸿蒙爱好者等人群整理了一套纯血版鸿蒙HarmonyOS Next全栈开发技术的学习路线【包含了大厂APP实战项目开发】。 本路线共分为四个阶段 第一阶段鸿蒙初中级开发必备技能 第二阶段鸿蒙南北双向高工技能基础gitee.com/MNxiaona/733GH 第三阶段应用开发中高级就业技术 第四阶段全网首发-工业级南向设备开发就业技术gitee.com/MNxiaona/733GH 《鸿蒙 (Harmony OS)开发学习手册》共计892页 如何快速入门 1.基本概念 2.构建第一个ArkTS应用 3.…… 开发基础知识:gitee.com/MNxiaona/733GH 1.应用基础知识 2.配置文件 3.应用数据管理 4.应用安全管理 5.应用隐私保护 6.三方应用调用管控机制 7.资源分类与访问 8.学习ArkTS语言 9.…… 基于ArkTS 开发 1.Ability开发 2.UI开发 3.公共事件与通知 4.窗口管理 5.媒体 6.安全 7.网络与链接 8.电话服务 9.数据管理 10.后台任务(Background Task)管理 11.设备管理 12.设备使用信息统计 13.DFX 14.国际化开发 15.折叠屏系列 16.…… 鸿蒙开发面试真题含参考答案:gitee.com/MNxiaona/733GH 鸿蒙入门教学视频 美团APP实战开发教学gitee.com/MNxiaona/733GH 写在最后 如果你觉得这篇内容对你还蛮有帮助我想邀请你帮我三个小忙点赞转发有你们的 『点赞和评论』才是我创造的动力。关注小编同时可以期待后续文章ing不定期分享原创知识。想要获取更多完整鸿蒙最新学习资源请移步前往小编gitee.com/MNxiaona/733GH
http://www.dnsts.com.cn/news/262766.html

相关文章:

  • 广西建设厅网站地址施工企业如何获取竞争优势
  • idea做网站登录绵阳网站维护托管
  • 宿州网站建设工作室上海物联网app开发公司
  • 烟台电子商务网站网站收费吗
  • 新手如何搭建自己的网站简述获得友情链接的途径
  • 文化馆网站建设意义怎么做58同城网站教程
  • 宿迁网站建设sq918网站申请收录
  • 开一个网站建设公司好网站设计基础语言不包括这些内容
  • 做网站服务器多钱广州越秀区租房子多少钱一个月
  • 上海 高端 网站建设中国最近战争新闻
  • 贵阳网站建设设计公司哪家好网站建设 北京
  • 售后服务方案 网站建设wordpress分类推荐
  • 做平台网站要增值业务吗网络推广培训哪个学校好
  • 苏州网站开发公司有哪些wordpress溢价主题
  • 庆阳网站制作wordpress聚合文章
  • 网站免费备案视频网站 如何做seo
  • 成都 企业 网站制作做中医药网站有前景吗
  • 个人网站特点放置在网站根目录下
  • 广西南宁网站建设哪家好二度云自助建站系统
  • 盗版电影网站建设成本天津西青区
  • 唯美网站建设企业宣传片拍摄的公司
  • 做网站制作一般多少钱外贸网站建设哪家公司好
  • 使用word做网站科研实验室网站建设
  • 爱网站黄重庆网站建设哪个平台好
  • 专门做视频的网站有哪些购物网站建设课程设计
  • 信用中国 网站 支持建设企业微网站建站
  • 有什么自学网站建设的网站北京网站编程培训
  • 百度网站首页收录人人网
  • 红色页面网站专门做二手房车的网站
  • 什么企业适合做网站专业ppt代做