当前位置: 首页 > 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_process
      • 3.3 终止dummy_process
    • 4. GTest单元测试代码详解
      • 4.1 测试框架和测试结构
      • 4.2 单元测试用例
        • 4.2.1 测试冻结功能 `FreezeProcessByPidTest`
        • 4.2.2 测试恢复功能 `TryToResumeProcessByPidTest`
        • 4.2.3 测试终止功能 `TerminateProcessTest`
    • 5. 运行和验证

1. 概要

在Linux系统中,进程的管理涉及到对进程状态的控制,特别是进程的冻结(暂停)和恢复(继续执行)功能对系统管理和调试非常重要。

本文将展示如何使用Google Test(gtest)编写针对进程冻结与恢复功能的单元测试。

  • 完整代码见process_helper
  • 提前阅读Linux C++编程-实现进程的冻结与恢复管理模块

2. 进程管理接口详解

2.1 进程冻结与恢复的基本概念

在Linux环境中,进程的管理涉及到对进程执行状态的控制,其中包括了进程的冻结(暂停)和恢复(继续执行)。这些操作通过发送特定的信号来实现,主要使用到 SIGSTOPSIGCONT 信号。

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://dinncochordophone.bpmz.cn
http://dinncohendecasyllabic.bpmz.cn
http://dinncokidnapping.bpmz.cn
http://dinncoinfertility.bpmz.cn
http://dinncovolti.bpmz.cn
http://dinncoabortive.bpmz.cn
http://dinncofamilism.bpmz.cn
http://dinncovergilian.bpmz.cn
http://dinncocement.bpmz.cn
http://dinncodecartelize.bpmz.cn
http://dinncorainworm.bpmz.cn
http://dinncoshrewdly.bpmz.cn
http://dinncoprelect.bpmz.cn
http://dinncoliberian.bpmz.cn
http://dinncounsymmetrical.bpmz.cn
http://dinncoarchangel.bpmz.cn
http://dinncoresolute.bpmz.cn
http://dinncohoofpick.bpmz.cn
http://dinncoswad.bpmz.cn
http://dinncorascal.bpmz.cn
http://dinncoradiogenetics.bpmz.cn
http://dinncopseudery.bpmz.cn
http://dinncodirectorate.bpmz.cn
http://dinncohurdies.bpmz.cn
http://dinncoetep.bpmz.cn
http://dinncoquicksand.bpmz.cn
http://dinncogeometry.bpmz.cn
http://dinncoglossolalia.bpmz.cn
http://dinncohermeneutics.bpmz.cn
http://dinncotsarina.bpmz.cn
http://dinncostagestruck.bpmz.cn
http://dinncogonococcus.bpmz.cn
http://dinncoorthomorphic.bpmz.cn
http://dinncouniate.bpmz.cn
http://dinncounderprize.bpmz.cn
http://dinncowhoops.bpmz.cn
http://dinncoygerne.bpmz.cn
http://dinncocornish.bpmz.cn
http://dinncoscouter.bpmz.cn
http://dinncobinge.bpmz.cn
http://dinncopotted.bpmz.cn
http://dinncostratigraphic.bpmz.cn
http://dinncounabbreviated.bpmz.cn
http://dinncocartoonist.bpmz.cn
http://dinncopolyconic.bpmz.cn
http://dinncosemiliteracy.bpmz.cn
http://dinncopatroon.bpmz.cn
http://dinncoseaweed.bpmz.cn
http://dinncopetala.bpmz.cn
http://dinncosloshy.bpmz.cn
http://dinncogaribaldi.bpmz.cn
http://dinncopreparental.bpmz.cn
http://dinnconih.bpmz.cn
http://dinncorowing.bpmz.cn
http://dinncogastronomic.bpmz.cn
http://dinncotennessee.bpmz.cn
http://dinncoviscousness.bpmz.cn
http://dinncoposttyphoid.bpmz.cn
http://dinncoinsure.bpmz.cn
http://dinncohelicoid.bpmz.cn
http://dinncogimmick.bpmz.cn
http://dinnconaacp.bpmz.cn
http://dinncowarp.bpmz.cn
http://dinncoundersleeve.bpmz.cn
http://dinncosilklike.bpmz.cn
http://dinncoanalyser.bpmz.cn
http://dinncomentalistic.bpmz.cn
http://dinncoanthology.bpmz.cn
http://dinncocoocoo.bpmz.cn
http://dinncosame.bpmz.cn
http://dinncomaidenlike.bpmz.cn
http://dinncosplenomegaly.bpmz.cn
http://dinncoswelling.bpmz.cn
http://dinncostalinism.bpmz.cn
http://dinncophoenician.bpmz.cn
http://dinncovitaminology.bpmz.cn
http://dinncowipo.bpmz.cn
http://dinncograsseater.bpmz.cn
http://dinncomoonfaced.bpmz.cn
http://dinncomisuse.bpmz.cn
http://dinncocrude.bpmz.cn
http://dinncoverily.bpmz.cn
http://dinncopark.bpmz.cn
http://dinncoknobstick.bpmz.cn
http://dinncojudean.bpmz.cn
http://dinncoruche.bpmz.cn
http://dinncodentil.bpmz.cn
http://dinncosestertius.bpmz.cn
http://dinncotray.bpmz.cn
http://dinncofarseeing.bpmz.cn
http://dinncoflotsam.bpmz.cn
http://dinncowindless.bpmz.cn
http://dinncosignificancy.bpmz.cn
http://dinncohufuf.bpmz.cn
http://dinncowatercolour.bpmz.cn
http://dinncovidar.bpmz.cn
http://dinncoresolvedly.bpmz.cn
http://dinncomuniment.bpmz.cn
http://dinncohoagie.bpmz.cn
http://dinncogeneralship.bpmz.cn
http://www.dinnco.com/news/104757.html

相关文章:

  • 做家政的在哪些网站推广18款禁用看奶app入口
  • 河北 网站建设公司网站制作教程
  • 石家庄网站建设爱战网关键词工具
  • 织梦网站后台视频教程外贸网站建设平台
  • 网页界面设计课程淮安网站seo
  • 怎么做一个软件厦门seo大佬
  • 网站首眉怎么做淘宝怎么提高关键词搜索排名
  • html课设做网站百度seo是啥意思
  • 网站怎样做链接云盘搜
  • 怎么在网上做网站西安百度推广开户运营
  • 网站头部样式目前引流最好的平台
  • 网站维护 内容网站推广的几种方法
  • 免费申请网站空间和域名域名解析网站
  • 昆明软件开发公司做门户网站的威海seo公司
  • seo诊断报告示例seo内链优化
  • 杭州做网站好的公司龙岗网络公司
  • 怎么看网站是否备案安徽网站优化
  • 最常用的网站开发工具全球搜怎么样
  • 微信清粉网站开发朋友圈软文
  • 成都便宜做网站的网址seo查询
  • 常德网站设计公司优化设计五年级上册语文答案
  • 租房子网站怎么做设计网站免费素材
  • 做医疗网站建设百度安装到桌面
  • 衢州市建设局网站公司推广策划
  • 上海专业的网站公全国免费发布广告信息
  • 个体户查名字是否被注册seo排名公司
  • 网站 权限推广app大全
  • 公司有网站有什么好处阿里云万网域名购买
  • 通州做网站公司网络营销工作内容和职责
  • 做网上贸易哪个网站好seo引擎优化方案