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:获取进程相关信息相关推荐

  1. linux c 通过 pid 获取 进程相关信息 cmdline

    linux系统命令ps和top都是通过读取/proc/$PID 目录下的信息获取进程的相关信息, 它遍历/proc目录下的首字符为数字的目录,获取系统进程的信息. 我们经常会把pid写到/var/ru ...

  2. 【C函数】sysinfo获取系统相关信息

    Linux中,sysinfo是用来获取系统相关信息的结构体,返回系统的统计信息. 头文件: #include <sys/sysinfo.h> 函数声明: int sysinfo (stru ...

  3. youtube根据vedioId获取视频相关信息

    根据vedioId获取视频相关信息 https://www.googleapis.com/youtube/v3/videos?key=xxx&id=I6uBoYJxf4k&part=s ...

  4. 7.3 Uipath UiPath之获取邮件相关信息

    UiPath之获取邮件相关信息 UiPath之获取邮件相关信息 第一步:先看看GetOutLookMailMessage这个应该怎么设定 第二步:新建一个Execl Application Scope ...

  5. 金蝶EAS登录获取用户相关信息失败、EAS默认用户名、密码

    1.sql2005,新装的EAS7.0服务器,新建一个帐套,都弄好了以后,客户端登陆的时候提示错误:获取用户相关信息失败!  日志里说该游标未声明 解决方法:在SQL SERVER执行alter ta ...

  6. adb 查看屏幕大小_adb shell wm 命令获取屏幕相关信息

    adb shell wm命令获取屏幕相关信息 Tags: adb_shell wm命令在4.x才有的,不同的版本下部分参数不同 wm [subcommand] [options] 获取屏幕大小:wm ...

  7. Qt开发中获取系统相关信息的方法,值得收藏参考

    本文转自https://zhuanlan.zhihu.com/p/111005951,这篇写的很详细,但是macos相关的只有一部分太少了,基本都是Windows的,我个人后续也会把相关的系统调用方式 ...

  8. php获取服务器相关信息

    2019独角兽企业重金招聘Python工程师标准>>> php可以通过相关函数获取服务器和php环境的相关信息 ,如下代码: <html><head>< ...

  9. 获取进程的信息 linux,如何获取进程信息

    如何获取进程信息 发布时间:2008-12-10 14:28:50来源:红联作者:kid420 在/proc中有各进程的信息,进入任意一个用cat maps可以看到象下面一样的信息 00ac5000- ...

最新文章

  1. 在 libevent 中使用 MariaDB(MySQL)
  2. 3d打印 路径规划_3D打印螺旋桨技术的应用和挑战
  3. C/C++笔试面试题目(2021最新版)
  4. python计算密集型任务_Python多进程和多线程测试比高低,只为证明谁是最快的“仔”
  5. php file 扩展,php5.4.31安装php_fileinfo扩展和php_intl扩展
  6. 利用Python工具进行打包功能
  7. 如何在矩池云GPU云中安装MATLAB R2016b软件
  8. vue项目中使用lib-flexible解决移动端适配
  9. 类Unix下网络工具备忘
  10. 趣学python教孩子学编程pdf免费下载_《趣学Python——教孩子学编程》——导读-阿里云开发者社区...
  11. 基于pytorch-openpose框架的的人体姿态检测
  12. Salesforce入门教程(中文)-019 VF创建输入表单
  13. Word2007 生成目录英文变成大写的解决办法
  14. 利用requests模块爬取小说
  15. java 动态修改配置文件_Java 项目中一种简单的动态修改配置即时生效的方式 WatchService...
  16. 纳税信用等级怎么划分 激励惩戒措施有哪些
  17. 火影T5A笔记本系统损坏了无法进入桌面怎么办?
  18. 基于STM32F767通过STM32CubeMX实现ModbusTCP从站(后续)
  19. JDK版本8u191与8u192的区别
  20. 网络设备维保状态查询

热门文章

  1. Js计算时间差(天、小时、分钟、秒)
  2. 如何把VS Code的Language Server Protocol整合到Eclipse中来
  3. shrio初体验(2)Realm
  4. Apache Shiro和Spring Security的详细对比
  5. mysql,int(5)、int(10)啥区别联系
  6. C#中对于float,double,decimal的误解
  7. 线程的切入和切出(切入: 一个线程被系统选中占用处理器开始或继续运行)
  8. 单词:readme emulate prompt cross-reference copyright align
  9. 所有的经历都是财富 --致我的2016
  10. 想要自学深度学习?不用GPU,浏览器就够了