环境编程代码实例:“加/卸载” Zend Framework 2

文章目录

  • 前言
  • 代码仓库
  • 需求介绍
  • 代码
    • 说明
    • 文件结构
    • 核心片段
  • 拓展
  • 总结
  • 参考资料
  • 作者的话

前言

环境编程代码实例:“加/卸载” Zend Framework 2。


代码仓库

  • yezhening/Environment-and-network-programming-examples: 环境和网络编程实例 (github.com)
  • Environment-and-network-programming-examples: 环境和网络编程实例 (gitee.com)

需求介绍

现状:已存在旧生产项目,系统使用 Zend Framework 2(基于 PHP 的 Web MVC 框架,简称 ZF2)

目标:简化 ZF2 的配置

内容:

  1. 将 ZF2 的供应镜像可执行文件加载到内存,并映射/解映射到虚拟设备的一个分区
  2. 将虚拟设备的文件系统挂/卸载到目录

实现:

  • 环境:FreeBSD(服务器)
  • 语言:C/C++(程序)
  • 核心:执行 Shell 命令(程序使用 UNIX -> FreeBSD 的系统调用)
  • 要求:可靠(尽可能地考虑并处理错误情况)

代码

说明

  • 由于代码篇幅较多,在博客中直接粘贴并呈现会显得冗长,因此未在博客中放置完整代码,只展示核心片段代码。请前往"代码仓库"查看或获取相关代码
  • 注释有详细解析

文件结构

  • 文件夹:load_ZF2
  • 源文件:main.cpp
  • 可执行文件:main
  • 说明文件:readme.txt
  • 配置文件:setupvendor.conf
  • ZF2 的供应镜像文件:ZF2VendorImage.bin(因为是生产项目,未将该文件开源在代码仓库

核心片段

结构体和全局变量

struct SystemFile // 系统文件
{string file_name;   // 文件名称string virtual_dev; // 挂载设备号string mount_dir;   // 挂载目录
};// const string g_config_file_path("./setupvendor.conf"); // 配置文件路径
const string g_config_file_path("/usr/local/etc/setupvendor.conf"); // 配置文件路径
const string g_file_num_key("file_num");                            // 配置文件中系统文件数量的键
string g_file_num_value("");                                        // 配置文件中系统文件数量的值
int g_file_num_value2 = 0;                                          // 配置文件中系统文件数量的值2const string g_file_name_key("file_name");     // 配置文件中系统文件名称的键
const string g_virtual_dev_key("virtual_dev"); // 配置文件中虚拟设备号的键
const string g_mount_dir_key("mount_dir");     // 配置文件中挂载目录的键
vector<struct SystemFile> g_system_file_vec{}; // 系统文件向量

函数

// 在配置文件的一行字符串【键 = 值换行符】中,依据键获取值
void get_key_value(const string &line, const string &key, string &value)// 获取系统文件数量
void get_system_file_num()// 获取系统文件配置
void get_system_file_config()// 执行命令
// 输入:命令,参数数组,参数数量
// 注意execv需要char*const*参数
void exec_cmd(const char *cmd, char *const arg[], const int arg_size)// 挂载文件系统
void mount_file_system()// 卸载文件系统
void umount_file_system()int main(int argc, char *argv[])

执行命令函数

// 执行命令
// 输入:命令,参数数组,参数数量
// 注意execv需要char*const*参数
void exec_cmd(const char *cmd, char *const arg[], const int arg_size)
{for (int i = 0; i < arg_size; ++i){cout << arg[i] << " ";}cout << endl;pid_t pid = fork(); // 进程号if (pid == -1){perror("exec_cmd() fork() error");exit(EXIT_FAILURE);}else if (pid == 0){execv(cmd, arg);}// pid != 0int ret = -1;                   // 系统调用返回结果int status = 0;                 // 进程结束状态ret = waitpid(pid, &status, 0); // 等待子进程,结束状态,阻塞等待if ((ret == -1) || ((WIFEXITED(status)) && (WEXITSTATUS(status) != 0))){perror("exec_cmd() Execute command error");exit(EXIT_FAILURE);}return;
}

主函数

int main(int argc, char *argv[])
{// 依据参数判断挂载或卸载文件系统if (argc >= 3){cerr << "main() Argument number error" << endl;exit(EXIT_FAILURE);}if ((argc == 2) && (((strncmp(argv[1], "umount", 6)) != 0))){cerr << "main() Invalid argument error" << endl;exit(EXIT_FAILURE);}get_system_file_num();    // 获取系统文件数量get_system_file_config(); // 获取系统文件配置if ((argc == 2) && (((strncmp(argv[1], "umount", 6)) == 0))) // 有2个参数且第二个是umount,则卸载文件系统{umount_file_system();return 0;}mount_file_system(); // 默认1个参数挂载文件系统return 0;
}

拓展

  • 该份实例实际上是在 UNIX/FreeBSD/Linux 环境使用 C/C++ 程序执行 Shell 命令的特例版本
  • 看懂代码后,稍加修改,该份实例可以成为通用版本

总结

环境编程代码实例:“加/卸载” Zend Framework 2。


参考资料

  • 《UNIX环境高级编程(第3版)》作者:W.Richard Stevens,Stephen A.Rago

作者的话

  • 感谢参考资料的作者/博主
  • 作者:夜悊
  • 版权所有,转载请注明出处,谢谢~
  • 如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
  • 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
  • 文章在认识上有错误的地方, 敬请批评指正
  • 望读者们都能有所收获

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

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

相关文章

【开题报告】基于SpringBoot的校园周边攻略平台的设计与实现

1.选题背景 随着大学生活的日益丰富多彩&#xff0c;校园周边的商业和文化活动也越来越丰富。然而&#xff0c;对于新生或者外地来的同学来说&#xff0c;熟悉和了解校园周边的各种信息是一件比较困难的事情。因此&#xff0c;本项目旨在开发一个校园周边攻略平台&#xff0c;…

git drop掉的commit如何找回

在 Git 中&#xff0c;如果你执行了 git reset 或 git commit --amend 等操作&#xff0c;可能会导致某些 commit 被 "drop"&#xff0c;也就是不再直接可见。这些 commit 通常会被 Git 的垃圾收集机制&#xff08;garbage collection&#xff09;删除&#xff0c;但…

C++智能指针[下](shared_ptr/weak_ptr/循环引用/删除器)

文章目录 4.智能指针[shared_ptr]4.1设计理念成员属性 4.2主要接口拷贝构造 4.3引用计数线程安全问题测试线程安全通过对计数引用的加锁保护使得类线程安全类实例化的对象使用时需要手动加锁保护 "锁"的引进线程引用传参问题 4.4整体代码 5.循环引用问题5.1问题的引入…

【adb】adb相关命令行及adb传输文件权限问题 remote couldn‘t create file: Read-only file system

adb传输文件权限问题 今天用adb push的时候&#xff0c;报错说并非root权限 remote couldnt create file: Read-only file system 以下是adb相关命令一、非root权限解决方案 1️⃣运行以下命令行 adb root adb remount2️⃣如果还报错&#xff0c;则运行以下命令行 adb disab…

项目管理中,如何建立里程碑式管理?

项目进度控制是项目管理中的重要环节&#xff0c;也是最具挑战性的工作之一。在项目管理中&#xff0c;项目进度失控受到多种因素的影响&#xff0c;导致项目失控。 为了解决这个问题&#xff0c;我们可以借鉴在旅途中学到的经验&#xff0c;通过设立里程碑来了解项目进度&am…

MSQL系列(九) Mysql实战-Join算法底层原理

Mysql实战-Join算法底层原理 前面我们讲解了BTree的索引结构&#xff0c;及Mysql的存储引擎MyISAM和InnoDB,今天我们来详细讲解下Mysql的查询连接Join的算法原理 文章目录 Mysql实战-Join算法底层原理1.Simple Nested-Loop Join 简单嵌套循环2.Block Nested-Loop Join 块嵌套…

CDN技术(1)

1. CDN简介 CDN 是构建在数据网络上的一种分布式的内容分发网。 CDN 的作用是采用流媒体服务器集群技术&#xff0c;克服单机系统输出带宽及并发能力不足的缺点&#xff0c;可极大提升系统支持的并发流数目&#xff0c;减少或避免单点失效带来的不良影响。 2. CDN作用 CDN 利…

list列表前端分页功能已经提交list时容易犯错的问题回顾

最近在开发中&#xff0c;有返回list需要前端分页的&#xff0c;而且后续还需提交整个list&#xff0c;虽说前端分页并不难&#xff0c;但还有会有一些问题&#xff1a; 从图片代码就可以很清晰的看到前端分页&#xff0c;如何点击页数翻页的&#xff0c;很简单&#xff0c;但…

javascript判断对象中是否存在某个字段

1. in 如果指定的属性在指定的对象或其原型链中&#xff0c;则 in 运算符返回 true。 const car { make: Honda, model: Accord, year: 1998 };console.log(make in car); // truedelete car.make; if (make in car false) {car.make Suzuki; }console.log(car.make); //…

2024通信保研-电磁场电磁波复习

标量场的梯度的旋度恒等于0&#xff0c;旋度的散度等于0。 旋度&#xff1a; rot ⁡ F ( e x ∂ ∂ x e y ∂ ∂ y e z ∂ ∂ z ) ( e x F x e y F y e z F z ) e x ( ∂ F z ∂ y − ∂ F y ∂ z ) e y ( ∂ F x ∂ z − ∂ F z ∂ x ) e x ( ∂ F y ∂ x − ∂ F x …

MS COCO数据集的评价标准以及不同指标的选择推荐(AP、mAP、MS COCO、AR、@、0.5、0.75、1、目标检测、评价指标)

目标检测模型性能衡量指标、MS COCO 数据集的评价标准以及不同指标的选择推荐 0. 引言 0.1 COCO 数据集评价指标 目标检测模型通过 pycocotools 在验证集上会得到 COCO 的评价列表&#xff0c;具体参数的含义是什么呢&#xff1f; 0.2 目标检测领域常用的公开数据集 PASCAL …

网络基础知识

1.什么是链接? 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2.OSI 参考模型的层次是什么? 有 7 个 OSI 层&#xff1a;物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0c;传输层&#xff0c;会话层&#xff0c;表示层和…

04 文件管理

文件管理 文件和目录的创建 删除文件和目录 文件查找命令 文件的拷贝和移动 打包和压缩

关于癌细胞MR的几种类型,T1,T2,DCE,DWI,ADC

在癌细胞检测中&#xff0c;不同类型的磁共振成像&#xff08;MRI&#xff09;可以提供不同的信息&#xff0c;有助于医生更全面地评估肿瘤的特性和生长情况。 T1加权图像&#xff08;T1-Weighted Imaging&#xff09;: 目的&#xff1a;T1加权图像通过优化对组织的对比度&…

Macos文件图像比较工具:Kaleidoscope for Mac

Kaleidoscope是一款文件图像比较工具&#xff0c;它可以方便地比较两个文本或者图片文件的差异。这个工具可以在Mac系统上使用&#xff0c;并且支持多种文件格式&#xff0c;包括文本文件、图片文件、PDF文件等等。 Kaleidoscope有一个直观的用户界面&#xff0c;可以让用户轻…

【蓝牙协议】简介:蓝牙芯片、蓝牙协议架构

文章目录 蓝牙芯片架构另一个视角由下到上看&#xff1a;Controller-->Host由上到下看&#xff1a;Host-->Controller 蓝牙协议架构视角HW层——蓝牙芯片层Transport——数据传输层HOST——协议层 总结 参考&#xff1a;https://zhuanlan.zhihu.com/p/585248998 参考&…

记录nvm use node.js版本失败,出现报错: exit status 1: ��û���㹻��Ȩ��ִ�д˲�����

使用管理员权限运行cmd&#xff0c;再使用nvm use node.js版本号 参考&#xff1a; nvm use (node版本号)时报错&#xff1a; exit status 1: &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;㹻&#xfffd;&#xfffd;Ȩ&#xfffd;&#xfffd;ִ&#xf…

OpenCV官方教程中文版 —— 图像金字塔

OpenCV官方教程中文版 —— 图像金字塔 前言一、原理二、使用金字塔进行图像融合 前言 • 学习图像金字塔 • 使用图像创建一个新水果&#xff1a;“橘子苹果” • 将要学习的函数有&#xff1a;cv2.pyrUp()&#xff0c;cv2.pyrDown()。 一、原理 一般情况下&#xff0c;我…

全连接层是什么,有什么作用?

大家好啊&#xff0c;我是董董灿。 如果你是搞AI算法的同学&#xff0c;相信你在很多地方都见过全连接层。 无论是处理图片的卷积神经网络&#xff08;CNN&#xff09;&#xff0c;还是处理文本的自然语言处理&#xff08;NLP&#xff09;网络&#xff0c;在网络的结尾做分类…

竞赛选题 深度学习动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…