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:获取进程相关信息相关推荐
- linux c 通过 pid 获取 进程相关信息 cmdline
linux系统命令ps和top都是通过读取/proc/$PID 目录下的信息获取进程的相关信息, 它遍历/proc目录下的首字符为数字的目录,获取系统进程的信息. 我们经常会把pid写到/var/ru ...
- 【C函数】sysinfo获取系统相关信息
Linux中,sysinfo是用来获取系统相关信息的结构体,返回系统的统计信息. 头文件: #include <sys/sysinfo.h> 函数声明: int sysinfo (stru ...
- youtube根据vedioId获取视频相关信息
根据vedioId获取视频相关信息 https://www.googleapis.com/youtube/v3/videos?key=xxx&id=I6uBoYJxf4k&part=s ...
- 7.3 Uipath UiPath之获取邮件相关信息
UiPath之获取邮件相关信息 UiPath之获取邮件相关信息 第一步:先看看GetOutLookMailMessage这个应该怎么设定 第二步:新建一个Execl Application Scope ...
- 金蝶EAS登录获取用户相关信息失败、EAS默认用户名、密码
1.sql2005,新装的EAS7.0服务器,新建一个帐套,都弄好了以后,客户端登陆的时候提示错误:获取用户相关信息失败! 日志里说该游标未声明 解决方法:在SQL SERVER执行alter ta ...
- adb 查看屏幕大小_adb shell wm 命令获取屏幕相关信息
adb shell wm命令获取屏幕相关信息 Tags: adb_shell wm命令在4.x才有的,不同的版本下部分参数不同 wm [subcommand] [options] 获取屏幕大小:wm ...
- Qt开发中获取系统相关信息的方法,值得收藏参考
本文转自https://zhuanlan.zhihu.com/p/111005951,这篇写的很详细,但是macos相关的只有一部分太少了,基本都是Windows的,我个人后续也会把相关的系统调用方式 ...
- php获取服务器相关信息
2019独角兽企业重金招聘Python工程师标准>>> php可以通过相关函数获取服务器和php环境的相关信息 ,如下代码: <html><head>< ...
- 获取进程的信息 linux,如何获取进程信息
如何获取进程信息 发布时间:2008-12-10 14:28:50来源:红联作者:kid420 在/proc中有各进程的信息,进入任意一个用cat maps可以看到象下面一样的信息 00ac5000- ...
最新文章
- 在 libevent 中使用 MariaDB(MySQL)
- 3d打印 路径规划_3D打印螺旋桨技术的应用和挑战
- C/C++笔试面试题目(2021最新版)
- python计算密集型任务_Python多进程和多线程测试比高低,只为证明谁是最快的“仔”
- php file 扩展,php5.4.31安装php_fileinfo扩展和php_intl扩展
- 利用Python工具进行打包功能
- 如何在矩池云GPU云中安装MATLAB R2016b软件
- vue项目中使用lib-flexible解决移动端适配
- 类Unix下网络工具备忘
- 趣学python教孩子学编程pdf免费下载_《趣学Python——教孩子学编程》——导读-阿里云开发者社区...
- 基于pytorch-openpose框架的的人体姿态检测
- Salesforce入门教程(中文)-019 VF创建输入表单
- Word2007 生成目录英文变成大写的解决办法
- 利用requests模块爬取小说
- java 动态修改配置文件_Java 项目中一种简单的动态修改配置即时生效的方式 WatchService...
- 纳税信用等级怎么划分 激励惩戒措施有哪些
- 火影T5A笔记本系统损坏了无法进入桌面怎么办?
- 基于STM32F767通过STM32CubeMX实现ModbusTCP从站(后续)
- JDK版本8u191与8u192的区别
- 网络设备维保状态查询
热门文章
- Js计算时间差(天、小时、分钟、秒)
- 如何把VS Code的Language Server Protocol整合到Eclipse中来
- shrio初体验(2)Realm
- Apache Shiro和Spring Security的详细对比
- mysql,int(5)、int(10)啥区别联系
- C#中对于float,double,decimal的误解
- 线程的切入和切出(切入: 一个线程被系统选中占用处理器开始或继续运行)
- 单词:readme emulate prompt cross-reference copyright align
- 所有的经历都是财富 --致我的2016
- 想要自学深度学习?不用GPU,浏览器就够了