欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

muduo:获取进程相关信息

发布时间:2025/6/15 编程问答 49 豆豆
生活随笔 收集整理的这篇文章主要介绍了 muduo:获取进程相关信息 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

        muduo里面有专门获取进程信息的类,记录一下。

// Use of this source code is governed by a BSD-style license // that can be found in the License file. // // Author: Shuo Chen (chenshuo at chenshuo dot com)#include "muduo/base/ProcessInfo.h" #include "muduo/base/CurrentThread.h" #include "muduo/base/FileUtil.h"#include <algorithm>#include <assert.h> #include <dirent.h> #include <pwd.h> #include <stdio.h> // snprintf #include <stdlib.h> #include <unistd.h> #include <sys/resource.h> #include <sys/times.h>namespace muduo { namespace detail { __thread int t_numOpenedFiles = 0; int fdDirFilter(const struct dirent* d) {if (::isdigit(d->d_name[0])){++t_numOpenedFiles;}return 0; }__thread std::vector<pid_t>* t_pids = NULL; int taskDirFilter(const struct dirent* d) {if (::isdigit(d->d_name[0])){t_pids->push_back(atoi(d->d_name));}return 0; }int scanDir(const char *dirpath, int (*filter)(const struct dirent *)) {struct dirent** namelist = NULL;int result = ::scandir(dirpath, &namelist, filter, alphasort);assert(namelist == NULL);return result; }Timestamp g_startTime = Timestamp::now();// 获取进程启动时间 // assume those won't change during the life time of a process. int g_clockTicks = static_cast<int>(::sysconf(_SC_CLK_TCK));// 获取时钟频率 int g_pageSize = static_cast<int>(::sysconf(_SC_PAGE_SIZE));// 获取内存页大小 } // namespace detail } // namespace muduousing namespace muduo; using namespace muduo::detail;pid_t ProcessInfo::pid() {return ::getpid(); //进程ID }string ProcessInfo::pidString() {char buf[32];snprintf(buf, sizeof buf, "%d", pid());return buf; }uid_t ProcessInfo::uid() {return ::getuid(); //调用程序的真实用户ID }string ProcessInfo::username() {struct passwd pwd;struct passwd* result = NULL;char buf[8192];const char* name = "unknownuser";getpwuid_r(uid(), &pwd, buf, sizeof buf, &result);if (result){name = pwd.pw_name;}return name; }uid_t ProcessInfo::euid() {return ::geteuid();//有效用户ID }Timestamp ProcessInfo::startTime() {return g_startTime; }int ProcessInfo::clockTicksPerSecond()// 一秒的时钟数 {return g_clockTicks; }int ProcessInfo::pageSize() {return g_pageSize; }bool ProcessInfo::isDebugBuild() { #ifdef NDEBUGreturn false; #elsereturn true; #endif }string ProcessInfo::hostname() {// HOST_NAME_MAX 64// _POSIX_HOST_NAME_MAX 255char buf[256];if (::gethostname(buf, sizeof buf) == 0)//gethostname返回本地主机的标准主机名{buf[sizeof(buf)-1] = '\0';return buf;}else{return "unknownhost";} }string ProcessInfo::procname() {return procname(procStat()).as_string(); }StringPiece ProcessInfo::procname(const string& stat) {StringPiece name;size_t lp = stat.find('(');size_t rp = stat.rfind(')');if (lp != string::npos && rp != string::npos && lp < rp){name.set(stat.data()+lp+1, static_cast<int>(rp-lp-1));}return name; }string ProcessInfo::procStatus()// 通过/proc/进程id/status 文件 ,获取进程相关信息 {string result;FileUtil::readFile("/proc/self/status", 65536, &result);return result; }string ProcessInfo::procStat()// 通过/proc/进程id/stat 文件 ,获取进程相关信息 {string result;FileUtil::readFile("/proc/self/stat", 65536, &result);return result; }string ProcessInfo::threadStat()// 通过/proc/进程id/stat 文件 ,获取进程的线程相关信息 {char buf[64];snprintf(buf, sizeof buf, "/proc/self/task/%d/stat", CurrentThread::tid());string result;FileUtil::readFile(buf, 65536, &result);return result; }string ProcessInfo::exePath()// 执行路径,从根目录开始的绝对路径。 通过命令readlink打开文件/proc/进程id/exe,可以进行查看 {string result;char buf[1024];ssize_t n = ::readlink("/proc/self/exe", buf, sizeof buf);if (n > 0){result.assign(buf, n);}return result; }int ProcessInfo::openedFiles()//返回打开的文件描述符 {t_numOpenedFiles = 0;scanDir("/proc/self/fd", fdDirFilter);//self标识当前进程,正常是进程号return t_numOpenedFiles; }int ProcessInfo::maxOpenFiles()// 获取进程可以打开的最大文件描述符的数量 {struct rlimit rl;if (::getrlimit(RLIMIT_NOFILE, &rl)){return openedFiles();}else{return static_cast<int>(rl.rlim_cur);} }ProcessInfo::CpuTime ProcessInfo::cpuTime()// 获取CPU时间 {ProcessInfo::CpuTime t;struct tms tms;if (::times(&tms) >= 0){const double hz = static_cast<double>(clockTicksPerSecond());t.userSeconds = static_cast<double>(tms.tms_utime) / hz;t.systemSeconds = static_cast<double>(tms.tms_stime) / hz;}return t; }int ProcessInfo::numThreads()// 线程数目,通过命令`cat /proc/进程id/status | grep 'Threads' 可以获得线程数目` {int result = 0;string status = procStatus();size_t pos = status.find("Threads:");if (pos != string::npos){result = ::atoi(status.c_str() + pos + 8);}return result; }std::vector<pid_t> ProcessInfo::threads()// 线程id,通过命令'ls /proc/进程id/task 可以获得进程中的线程号' {std::vector<pid_t> result;t_pids = &result;scanDir("/proc/self/task", taskDirFilter);t_pids = NULL;std::sort(result.begin(), result.end());return result; }

一些关于linux内核的知识。

总结

以上是生活随笔为你收集整理的muduo:获取进程相关信息的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。