pos_cli 命令是如何运行起来的

news/2025/3/12 19:06:29/文章来源:https://www.cnblogs.com/algoshimo/p/18765779

追踪pos_cli --dump --dir /root/ckpt --pid [your program pid] 是如何运行的

pos_cli是通过mason,由sources包括的这些文件构建而来

#pos/cli/meson.buildproject_name = 'phoenix_os_cli'
project_name_abbreviation = 'pos_cli'
scan_src_path = meson.current_source_dir() + '/../../scripts/utils/glob_src.py'
sources += run_command('python3', files(scan_src_path), './src', check: false).stdout().strip().split('\n')executable(project_name_abbreviation,  sources,  #入口文件cpp_args: c_args,link_args: ld_args,include_directories: inc_dirs,install: false
)

我们来看下sources
sources += run_command('python3', files(scan_src_path), './src', check: false).stdout().strip().split('\n')
sources是运行scan_src_path,也就是glob_src.py(参数是./src)的输出

#scripts/utils/glob_src.pykArgvIndex_module = 1args = sys.argv# add all local source files
sources = glob.glob(f"./{args[kArgvIndex_module]}/**/*.c", recursive=True)     \+ glob.glob(f"./{args[kArgvIndex_module]}/**/*.cpp", recursive=True)   \+ glob.glob(f"./{args[kArgvIndex_module]}/**/*.cc", recursive=True)for i in sources:if "__template__" in i or "__TEMPLATE__" in i:continueprint(i)

args[1]是./src(pos/cli/src),sources是src下的所有c、cpp、cc文件

也就是由上图这些文件最后构建出了pos_cli,入口函数是main函数

//pos/cli/src/main.cppinline void __readin_raw_cli(int argc, char *argv[], pos_cli_options_t &clio) {int opt_val;int option_index = 0;struct option *opt;char short_opt[1024] = {0};struct option long_opt[] = {{"dump",         no_argument,       NULL,   kPOS_CliAction_Dump},         // 🧠 动作选项{"dir",          required_argument, NULL,   kPOS_CliMeta_Dir},            // 📂 元数据选项{"pid",          required_argument, NULL,   kPOS_CliMeta_Pid},            // 🔢 元数据选项{NULL,           0,                 NULL,   0}};while ((opt_val = getopt_long(argc, argv, short_opt, long_opt, &option_index)) != -1) {if (opt_val < kPOS_CliAction_PLACEHOLDER) {clio.action_type = static_cast<pos_cli_action>(opt_val);  // 📝 设置动作类型} else if (opt_val < kPOS_CliMeta_PLACEHOLDER) {POS_CHECK_POINTER(opt);clio.record_raw(static_cast<pos_cli_meta>(opt_val), optarg);  // 🌐 保存元数据参数}}
}int main(int argc, char *argv[]){pos_retval_t retval;pos_cli_options_t clio;__readin_raw_cli(argc, argv, clio); //处理命令行参数clio.local_oob_client = new POSOobClient(/* req_functions */ {{   kPOS_OOB_Msg_CLI_Ckpt_PreDump,      oob_functions::cli_ckpt_predump::clnt       },{   kPOS_OOB_Msg_CLI_Ckpt_Dump,         oob_functions::cli_ckpt_dump::clnt          },{   kPOS_OOB_Msg_CLI_Restore,           oob_functions::cli_restore::clnt            },{   kPOS_OOB_Msg_CLI_Trace_Resource,    oob_functions::cli_trace_resource::clnt     },},/* local_port */ 10086,/* local_ip */ CLIENT_IP);POS_CHECK_POINTER(clio.local_oob_client);retval = __dispatch(clio);switch (retval){case POS_SUCCESS:return 0;case POS_FAILED_NOT_IMPLEMENTED:POS_ERROR("unspecified action, use '-h' to check usage");default:POS_ERROR("CLI executed failed");}
}

命令解析过程:

在 __readin_raw_cli 中

--dump

匹配到 kPOS_CliAction_Dump
设置:clio.action_type = kPOS_CliAction_Dump

--dir /root/ckpt

匹配到 kPOS_CliMeta_Dir
调用:clio.record_raw(kPOS_CliMeta_Dir, "/root/ckpt")

--pid [your program pid]

匹配到 kPOS_CliMeta_Pid
调用:clio.record_raw(kPOS_CliMeta_Pid, "[your program pid]")

通过_dispatch分发工作,根据 clio.action_type 分发执行

inline pos_retval_t __dispatch(pos_cli_options_t &clio){switch (clio.action_type){case kPOS_CliAction_Dump:return handle_dump(clio);default:return POS_FAILED_NOT_IMPLEMENTED;}
}

此时我们会执行handle_dump,也就是我们的phos的checkpoint具体是如何实现。这个留到下一篇文章讲

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/897369.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tavus 发布对话轮次控制模型:能理解对话节奏和意图;百度推出 AI 情感陪伴应用月匣,整合 MiniMax 等模型丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

clickhouse 25.2.1 集群部署

依赖条件 sysctl.conf echo "kernel.threads-max = 262144" >> /etc/sysctl.conf && sysctl -p Huge Pages(按需修改) 编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX 参数中添加: GRUB_CMDLINE_LINUX="... transparent_hugepage=never"…

可视化图解算法:链表指定区间反转

对于链表的相关操作,我们总结了一套【可视化+图解】方法,依据此方法来解决链表相关问题,链表操作变得易于理解,写出来的代码可读性高也不容易出错。1. 题目 描述 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 …

ov5640原理讲解

Camera开发-OV5640(MIPI)-CSDN博客

[I.2] 个人作业:软件案例分析

[I.2] 个人作业:软件案例分析项目 内容这个作业属于哪个工程 https://edu.cnblogs.com/campus/buaa/BUAA_SE_2025_LR这个作业的要求在哪里 https://edu.cnblogs.com/campus/buaa/BUAA_SE_2025_LR/homework/13367我在这个课程的目标是 学习团队软件开发方式, 丰富开发经验这个作…

应对SQLyog trial到期方式:删脚本!

(1)进入注册表中的HKEY_CURRENT_USER\SOFTWARE路径 (2)找到{d58cb4b1-47f3-45cb-a209-f298d0c3f756}文件夹 删除掉!! (3)到期了删一回

React18 React中的REF的使用

想要获取元素操作DOM,React中该怎么做呢?~ 首先肯定是要在DidMount周期函数中调用啦需要真实dom为前提嘛 1. 和VUE一样,可以使用this.$refs.xxx,结合元素中放置ref属性 【其实不推荐这样~】2.可以使用document.querySelector(xx)获取 3.把ref属性值设置为一个函数的形式获取…

3ds Max 2025下载与安装教程

Autodesk 3ds Max 是专业的三维建模、渲染和动画软件,可助您创建广阔的世界和优质的设计。使用强大的建模工具为环境和景观注入活力。 使用直观的纹理和明暗处理工具创建精细的设计和道具。 迭代和生成具有全方位艺术控制的专业级渲染‌3Dmax 2025的安装要求:‌操作系统‌:3…

Java多线程(一)---- 创建与使用

JUC Java多线程是一个非常复杂的知识点,今天这篇我们就来说说Java多线程的多种实现方式吧。 Thread 构造 Thread类可以说是非常基础的一个类了,通过继承Thread类,我们可以成功的创建一个“线程类”。 public class threadDemo {public static class threadDemo extends Thre…

Office 2024软件下载与安装教程

安装系统要求: 以下操作系统支持 Office LTSC 2024:Windows 11* Windows 10 Windows 10 LTSC 2021 Windows 10 LTSC 2019 Windows Server 2022设备至少需要一个 1.1 GHz、双核处理器、4 GB RAM、4 GB 可用磁盘空间,以及分辨率为 1280 x 768 的显示器才能运行 Office LTSC 20…

Visio 2024软件下载与安装教程

Microsoft Visio 2024专业版是一款专业的专业矢量绘图软件。Visio 2024不但新增了许多功能,而且还优化了众多性能,比如用户界面优化、更多图形元素库、允许用户邀请其他人一起编辑和查看图表、过程自动化等等,其一系列的改动旨在给予用户们最直观、最便利的操作体验! 操作系…

PhpStorm 2024 软件下载与入门级安装教程

高效智能的 PHP IDE 支持主流框架 PhpStorm完美支持Symfony、Drupal、WordPress、Zend Framework、Laravel、Magento、 Joomla!、CakePHP、Yii ...等各种主流框架。 全能的PHP工具 内建编辑器实际“了解”您的代码并且深刻理解其结构,支持所有PHP语言功能, 在开发现代技术和维…