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

农业信息网站 建设学做网站的软件

农业信息网站 建设,学做网站的软件,网站空间的价格,企业网站建设方案如何文章目录 1. 概要2. 进程管理接口详解2.1 进程冻结与恢复的基本概念2.2 进程查找与PID获取2.3 进程冻结与恢复的实现2.3.1 进程冻结2.3.2 进程恢复 2.4 进程终止2.5 进程状态监控与控制 3. dummy_process的设计与实现3.1 创建dummy_process脚本3.2 启动dummy_process3.3 终止du… 文章目录 1. 概要2. 进程管理接口详解2.1 进程冻结与恢复的基本概念2.2 进程查找与PID获取2.3 进程冻结与恢复的实现2.3.1 进程冻结2.3.2 进程恢复 2.4 进程终止2.5 进程状态监控与控制 3. dummy_process的设计与实现3.1 创建dummy_process脚本3.2 启动dummy_process3.3 终止dummy_process 4. GTest单元测试代码详解4.1 测试框架和测试结构4.2 单元测试用例4.2.1 测试冻结功能 FreezeProcessByPidTest4.2.2 测试恢复功能 TryToResumeProcessByPidTest4.2.3 测试终止功能 TerminateProcessTest 5. 运行和验证 1. 概要 在Linux系统中进程的管理涉及到对进程状态的控制特别是进程的冻结暂停和恢复继续执行功能对系统管理和调试非常重要。 本文将展示如何使用Google Testgtest编写针对进程冻结与恢复功能的单元测试。 完整代码见process_helper提前阅读Linux C编程-实现进程的冻结与恢复管理模块 2. 进程管理接口详解 2.1 进程冻结与恢复的基本概念 在Linux环境中进程的管理涉及到对进程执行状态的控制其中包括了进程的冻结暂停和恢复继续执行。这些操作通过发送特定的信号来实现主要使用到 SIGSTOP 和 SIGCONT 信号。 2.2 进程查找与PID获取 为了准确控制目标进程首先需要能够根据进程名称或者其他标识符获取到进程的PID。在Linux系统中可以通过读取 /proc 文件系统来获取所有运行中进程的详细信息包括进程的命令行参数和状态。 /*** brief Function to find the PID of a process by its name* param [in] processName process name* param [out] pid process id* return true - find pid by process name; false - not find pid by process name*/ bool FindPidByProcessName(const std::string processName, pid_t pid);2.3 进程冻结与恢复的实现 2.3.1 进程冻结 进程冻结通过发送 SIGSTOP 信号来实现暂停进程的执行。实现方法包括使用 kill(pid, SIGSTOP) 函数调用并等待进程状态确认操作成功。 /*** brief freeze process by pid** param [in] pid - pid find by process name.* return true - Freeze successfully; false - Freeze failed*/ bool FreezeProcessByPid(pid_t pid);2.3.2 进程恢复 一旦进程被冻结可以通过发送 SIGCONT 信号来恢复其执行。恢复过程中可能需要多次尝试以确保进程成功从暂停状态恢复到执行状态。 /*** brief try to resume a stopped process by pid** param [in] attempts - if resume failed, try another attempts times.* param [in] pid - pid find by process name.* return true - Resume successfully; false - Resume failed*/ bool TryToResumeProcessByPid(pid_t pid, int attempts 3);2.4 进程终止 在某些情况下需要强制终止一个进程以释放系统资源或确保安全性。可以使用 SIGKILL 信号立即终止进程的执行但需要注意可能会造成数据丢失。 /*** brief terminate a process** param [in] processName - process name.* param [in] attempts - if resume failed, try another attempts times.* return 0 - successfully; -1 - not found process; -2 terminate failed* -3 - Handle waitpid error*/ int TerminateProcess(const std::string processName, int attempts 3);2.5 进程状态监控与控制 在实现进程管理功能时还需要监控进程的状态并根据需要进行控制。通过读取 /proc/[pid]/status 文件可以获取进程的详细状态信息如是否处于停止状态。 /*** brief Function to check if the process is not in stopped state** param [in] pid - pid find by process name* return true - stopped; false - not stopped*/ bool IsProcessStopped(pid_t pid);确实dummy_process是我们测试进程管理功能的一个重要组成部分。我们需要详细分析它的设计和实现以便更好地理解整个测试框架。下面我们将详细介绍dummy_process的创建和管理过程并分析其在单元测试中的作用。 3. dummy_process的设计与实现 为了测试进程管理功能我们需要一个可以启动、冻结、恢复和终止的模拟进程。我们将创建一个名为dummy_process的shell脚本该脚本将作为我们的模拟进程。通过这个脚本我们可以在测试中验证进程管理功能的各个方面。 3.1 创建dummy_process脚本 dummy_process脚本是一个简单的无限循环脚本它能够响应特定的信号如SIGTERM。我们使用C程序来创建这个脚本并确保它具有可执行权限。 void CreateDummyProcessScript(const std::string scriptPath) {std::ofstream scriptFile(scriptPath);if (scriptFile.is_open()) {scriptFile #!/bin/bash\n;scriptFile \n;scriptFile # Function to handle signals\n;scriptFile function handle_signal() {\n;scriptFile echo \[dummy_process] Received signal: $1\\n;scriptFile exit 0\n; // Exit gracefully on signalscriptFile }\n;scriptFile \n;scriptFile # Trap signals\n;scriptFile trap handle_signal SIGTERM SIGTERM\n; // Handle SIGTERM signalscriptFile \n;scriptFile # Main loop\n;scriptFile while true; do\n;scriptFile echo \dummy_process is running...\\n;scriptFile sleep 1\n;scriptFile done\n;scriptFile.close();// Add executable permission to the scriptif (chmod(scriptPath.c_str(), S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) -1) {std::cerr Failed to set execute permission on scriptPath std::endl;exit(EXIT_FAILURE);}} else {std::cerr Failed to create scriptPath std::endl;exit(EXIT_FAILURE);} }3.2 启动dummy_process 在每个测试用例运行之前我们需要启动dummy_process。这里我们使用fork()和execlp()函数来创建一个子进程并在子进程中运行dummy_process脚本。 pid_t StartDummyProcess() {pid_t pid fork();if (pid -1) {std::cerr Failed to fork() process. std::endl;return -1;} else if (pid 0) {// Child process: execute dummy_process scriptexeclp(dummyScriptPath.c_str(), dummyScriptPath.c_str(), nullptr);// execlp should not return if successfulstd::cerr Failed to exec dummyScriptPath std::endl;exit(EXIT_FAILURE);} else {// Parent process: return child process PIDreturn pid;} }3.3 终止dummy_process 在每个测试用例运行之后我们需要终止dummy_process以清理环境。这里我们使用kill()函数发送SIGKILL信号并使用waitpid()等待子进程终止。 void TerminateDummyProcess(pid_t pid) {// Send SIGKILL to dummy_processkill(pid, SIGKILL);// Wait for child process to endint status;waitpid(pid, status, 0); }4. GTest单元测试代码详解 4.1 测试框架和测试结构 测试夹具 ProcessHelperTest 管理测试过程中的环境准备和清理工作包括创建、启动和终止dummy_process。 class ProcessHelperTest : public ::testing::Test {protected:pid_t dummyProcessPid;std::string dummyScriptPath ./dummy_process; // Path to dummy_process shell scriptvoid SetUp() override {// 创建 dummy_process shell 脚本并启动CreateDummyProcessScript(dummyScriptPath);dummyProcessPid StartDummyProcess();ASSERT_NE(dummyProcessPid, -1); // 检查 dummy_process 启动成功}void TearDown() override {// 结束 dummy_processTerminateDummyProcess(dummyProcessPid);// 清理 dummy_process shell 脚本std::remove(dummyScriptPath.c_str());} };4.2 单元测试用例 4.2.1 测试冻结功能 FreezeProcessByPidTest TEST_F(ProcessHelperTest, FreezeProcessByPidTest) {pid_t pid;bool find FindPidByProcessName(dummy_process, pid);EXPECT_TRUE(find); // 预期找到进程的PIDbool result FreezeProcessByPid(pid);EXPECT_TRUE(result); // 预期冻结操作成功ASSERT_TRUE(IsProcessRunning(dummy_process)); // 检查进程仍在运行ASSERT_TRUE(IsProcessStopped(dummyProcessPid)); // 检查进程是否被成功冻结 }4.2.2 测试恢复功能 TryToResumeProcessByPidTest TEST_F(ProcessHelperTest, TryToResumeProcessByPidTest) {pid_t pid;bool find FindPidByProcessName(dummy_process, pid);EXPECT_TRUE(find); // 预期找到进程的PIDbool result TryToResumeProcessByPid(pid, 3);EXPECT_TRUE(result); // 预期恢复操作成功ASSERT_TRUE(IsProcessRunning(dummy_process)); // 检查进程仍在运行ASSERT_FALSE(IsProcessStopped(dummyProcessPid)); // 检查进程是否已恢复执行 }4.2.3 测试终止功能 TerminateProcessTest TEST_F(ProcessHelperTest, TerminateProcessTest) {int result TerminateProcess(dummy_process, 3);EXPECT_EQ(result, 0); // 预期终止操作成功ASSERT_FALSE(IsProcessRunning(dummy_process)); // 检查进程是否已终止 }5. 运行和验证 测试程序的主函数调用了 RUN_ALL_TESTS() 来执行所有测试用例。在运行过程中每个测试用例会被独立执行并根据 EXPECT_ 和 ASSERT_ 宏的断言结果判断测试是否通过。 int main(int argc, char** argv) {testing::InitGoogleMock(argc, argv);return RUN_ALL_TESTS(); }单元测试结果: $ ./process_helper_test [] Running 6 tests from 2 test suites. [----------] Global test environment set-up. [----------] 5 tests from ProcessHelperTest [ RUN ] ProcessHelperTest.FreezeProcessByNameTest dummy_process is running... Success to send SIGSTOP to process 12780 Process 12780 status is T is in stopped state. Process 12780 freeze success. processName dummy_process pid 12780 freeze success. Process 12780 status is T is in stopped state. [ OK ] ProcessHelperTest.FreezeProcessByNameTest (9 ms) [ RUN ] ProcessHelperTest.TryToResumeProcessByNameTest dummy_process is running... Process 12782 status is S is not in stopped state. Process 12782 resumed successfully. Process 12782 status is S is not in stopped state. [ OK ] ProcessHelperTest.TryToResumeProcessByNameTest (25 ms) [ RUN ] ProcessHelperTest.FreezeProcessByPidTest dummy_process is running... Success to send SIGSTOP to process 12784 Process 12784 status is T is in stopped state. Process 12784 freeze success. Process 12784 status is T is in stopped state. [ OK ] ProcessHelperTest.FreezeProcessByPidTest (14 ms) [ RUN ] ProcessHelperTest.TryToResumeProcessByPidTest dummy_process is running... Process 12786 status is S is not in stopped state. Process 12786 resumed successfully. Process 12786 status is S is not in stopped state. [ OK ] ProcessHelperTest.TryToResumeProcessByPidTest (16 ms) [ RUN ] ProcessHelperTest.TerminateProcessTest dummy_process is running... Process with PID: 12788 has been terminated. [ OK ] ProcessHelperTest.TerminateProcessTest (6 ms) [----------] 5 tests from ProcessHelperTest (74 ms total)[----------] 1 test from IsProcessStoppedTest [ RUN ] IsProcessStoppedTest.IsStoppedTest [ OK ] IsProcessStoppedTest.IsStoppedTest (0 ms) [----------] 1 test from IsProcessStoppedTest (1 ms total)[----------] Global test environment tear-down [] 6 tests from 2 test suites ran. (77 ms total) [ PASSED ] 6 tests.
http://www.hkea.cn/news/14553465/

相关文章:

  • 制作个网站需要多少钱高校二级网站建设要求
  • 目前会展相关网站的建设情况怎么导入wordpress模板
  • 上线了网站网站建设优化开发公司哪家好
  • 河南省交通基本建设质量检测监督站网站免备案免费空间
  • 东莞网站建设报价王串场街网站建设公司
  • asp.net网站设计怎么做网络推广网站
  • 个人网站做微擎wordpress服务器镜像
  • 贵州省建设职业技术学院网站那个网站可以做软件出售的
  • 学做网站可以赚钱吗荆门网站制作公司
  • 国外好的网站主机屋网站在那注册
  • 桂林seo排名天津网站优化步骤
  • 通过平台建网站摄影设计说明万能模板
  • 申报湖南创新型省份建设专项网站外贸set是什么意思
  • 网站开发怎么使用sharepoint网页设计图片垂直对齐方式为顶端
  • 凡科网站建站教程东莞规划局官方网站
  • 目前国内做情趣最好的网站聊城营销网站建设价格
  • 现在什么网站比较火做推广江苏网站建设简介模板
  • 沈阳建站模板系统包括WordPress文章id连号
  • 荆门网站建设服务网页加速器破解版
  • 优化大师官方网站有哪些可以在线做app的网站
  • 利用云服务器做网站wordpress网页排版插件
  • 东莞网站建设推广公司陕西建设厅网站人才库
  • 怎样申请免费网站域名商业模式顶层设计案例
  • 成立网站要什么手续百度联盟网站有哪些
  • app开发必须要网站吗免备案免费虚拟主机
  • 网站首页分类怎么做的网站建设需要包含什么
  • 做响应式网站有什么插件wordpress钻石插件
  • 网站色彩学网站模板 wordpress
  • 做网站困难吗百度网盘资源搜索引擎
  • 深圳企业公司网站设计上海网站建设服务是什么意思