/**
*****************************************************************************
* Copyright (C), 2023-2024
*
* @file process_manage.h
* @brief control processes
*
*
* @author sbinhuang
* @date 2023-07-02
* @version v1.0.0 20230702
*----------------------------------------------------------------------------
* @note 历史版本 修改人员 修改日期 修改内容
* @note v1.0 sbinhuang 2023-07-02 1.创建
*
*****************************************************************************
*/#ifndefSELF_UTILITY_PROCESS_MANAGE_H_#defineSELF_UTILITY_PROCESS_MANAGE_H_#include<sys/types.h>#include<unistd.h>#include<stdint.h>#include<vector>namespace SelfUtility {classProcessManage{public:// default one child processProcessManage();// Set number of processesboolProcessConstraint(unsignedint number);// creates a new process by duplicating the calling process// On success, the PID of the child process is returned in the parent, and// 0 is returned in the child
pid_t Fork();// wait all process finishboolWaitAllProcess();// get current process idstatic pid_t CurrentProcessId();// get virtual memory peak(kb)staticuint64_tVmPeak();// get current virtual memory size(kb)staticuint64_tCurrentVm();// get resident memory size(kb)staticuint64_tCurrentRSS();private:
std::vector<pid_t> _process_list;};// ProcessManage}// SelfUtility#endif// SELF_UTILITY_PROCESS_MANAGE_H_
(2) process_manage.cpp
/**
*****************************************************************************
* Copyright (C), 2023-2024
*
* @file process_manage.cpp
* @brief control processes
*
*
* @author sbinhuang
* @date 2023-07-02
* @version v1.0.0 20230702
*----------------------------------------------------------------------------
* @note 历史版本 修改人员 修改日期 修改内容
* @note v1.0 sbinhuang 2023-07-02 1.创建
*
*****************************************************************************
*/#include"process_manage.h"#include<sys/types.h>#include<unistd.h>#include<sys/wait.h>#include<fstream>#include<vector>#include<string>#include"messages.h"using SelfUtility::ProcessManage;// default one child processProcessManage::ProcessManage(){
_process_list.resize(1,0);}// Set number of processesboolProcessManage::ProcessConstraint(unsignedint number){if(number ==0)returnfalse;
_process_list.resize(number,0);returntrue;}// creates a new process by duplicating the calling process// On success, the PID of the child process is returned in the parent, and// 0 is returned in the child
pid_t ProcessManage::Fork(){
std::size_t idx =0;
std::size_t process_list_size = _process_list.size();// get variable processwhile(1){
idx =0;for(; idx < process_list_size;++idx){
pid_t pid = _process_list[idx];if(pid ==0)break;// unusedint status =0;
pid_t ret =waitpid(pid,&status, WNOHANG);if(0== ret)continue;// specify process is runbreak;// specify process is finish}if(idx < process_list_size)break;// availiablesleep(1);// wait}// creat child process
pid_t pid =fork();while(pid ==-1){// fork failed, wait 1 second and try against
pid =fork();sleep(1);}if(pid ==0)return pid;// child process// parent process
_process_list[idx]= pid;return pid;}// wait all process finishboolProcessManage::WaitAllProcess(){
std::size_t idx =0;
std::size_t process_list_size = _process_list.size();for(; idx < process_list_size;++idx){
pid_t pid = _process_list[idx];if(0== pid)continue;// unusedint status =0;waitpid(pid,&status,0);}returntrue;}// get current process id
pid_t ProcessManage::CurrentProcessId(){returngetpid();}// get virtual memory peak(kb)uint64_tProcessManage::VmPeak(){
pid_t pid =getpid();
std::string file_name("/proc/");
file_name.append(std::to_string(pid));
file_name.append("/status");
std::ifstream in_file(file_name, std::ios::in);if(!in_file.is_open()){LOG_ERROR("File open failed!(%s)\n", file_name.c_str());exit(-1);}// VmPeak: 20620 kB// VmSize: 20620 kB// VmRSS: 3948 kBuint64_t memory_size =0;
std::string line;while(getline(in_file, line)){if(line.size()==0)continue;
std::size_t pos = line.find("VmPeak:");if(pos == std::string::npos)continue;
std::string substr(line.substr(pos +7));
pos = substr.find_first_not_of(" \t\r");if(pos == std::string::npos){LOG_ERROR("File format error!(%s: %s)\n", file_name.c_str(),
line.c_str());exit(-1);}
substr.erase(0, pos);
pos = substr.find("kB");if(pos == std::string::npos){LOG_ERROR("File format error!(%s: %s)\n", file_name.c_str(),
line.c_str());exit(-1);}
substr.erase(pos);
pos = substr.find_last_not_of(" \t\r");
substr.erase(pos);
memory_size = std::atoll(substr.c_str());}if(in_file.is_open()) in_file.close();return memory_size;}// get current virtual memory size(kb)uint64_tProcessManage::CurrentVm(){
pid_t pid =getpid();
std::string file_name("/proc/");
file_name.append(std::to_string(pid));
file_name.append("/status");
std::ifstream in_file(file_name, std::ios::in);if(!in_file.is_open()){LOG_ERROR("File open failed!(%s)\n", file_name.c_str());exit(-1);}// VmPeak: 20620 kB// VmSize: 20620 kB// VmRSS: 3948 kBuint64_t memory_size =0;
std::string line;while(getline(in_file, line)){if(line.size()==0)continue;
std::size_t pos = line.find("VmSize:");if(pos == std::string::npos)continue;
std::string substr(line.substr(pos +7));
pos = substr.find_first_not_of(" \t\r");if(pos == std::string::npos){LOG_ERROR("File format error!(%s: %s)\n", file_name.c_str(),
line.c_str());exit(-1);}
substr.erase(0, pos);
pos = substr.find("kB");if(pos == std::string::npos){LOG_ERROR("File format error!(%s: %s)\n", file_name.c_str(),
line.c_str());exit(-1);}
substr.erase(pos);
pos = substr.find_last_not_of(" \t\r");
substr.erase(pos);
memory_size = std::atoll(substr.c_str());}if(in_file.is_open()) in_file.close();return memory_size;}// get resident memory size(kb)uint64_tCurrentRSS(){
pid_t pid =getpid();
std::string file_name("/proc/");
file_name.append(std::to_string(pid));
file_name.append("/status");
std::ifstream in_file(file_name, std::ios::in);if(!in_file.is_open()){LOG_ERROR("File open failed!(%s)\n", file_name.c_str());exit(-1);}// VmPeak: 20620 kB// VmSize: 20620 kB// VmRSS: 3948 kBuint64_t memory_size =0;
std::string line;while(getline(in_file, line)){if(line.size()==0)continue;
std::size_t pos = line.find("VmRSS:");if(pos == std::string::npos)continue;
std::string substr(line.substr(pos +7));
pos = substr.find_first_not_of(" \t\r");if(pos == std::string::npos){LOG_ERROR("File format error!(%s: %s)\n", file_name.c_str(),
line.c_str());exit(-1);}
substr.erase(0, pos);
pos = substr.find("kB");if(pos == std::string::npos){LOG_ERROR("File format error!(%s: %s)\n", file_name.c_str(),
line.c_str());exit(-1);}
substr.erase(pos);
pos = substr.find_last_not_of(" \t\r");
substr.erase(pos);
memory_size = std::atoll(substr.c_str());}if(in_file.is_open()) in_file.close();return memory_size;}