psutil(Python system and process utilities)是一个跨平台的进程管理和系统工具的python库,
可以获取进程、系统CPU,memory,disks,network等信息。psutil主要用于系统资源的监控,分析,以及对进程进行一定的管理。支持的系统有Linux, Windows, OSX, FreeBSD and Sun Solaris,32和64位系统都支持。
如果有写过python C扩展的经验,阅读psutil源码是比较轻松的,psutil源码文件结构清晰,根据操作系统平台的不同组织文件结构。假如没有这方面经验,也不影响,可以查阅官方文档的开发者指南,快速对psutil源码结构有个大致了解。
阅读psutil官方文档的开发者指南,开发者增加新的功能特性,通常涉及如下文件:
1 | psutil/__init__.py # main psutil namespace |
在psutil/__init__.py
文件中定义新的函数,然后在psutil/_ps{platform}.py
实现函数功能,其中{platform}
泛指不同的操作系统平台。涉及C扩展,在对应的c文件实现,例如_pswindows.py
对应的c文件为_psutil_windows.c
。
单点深入
以pids()
为切入点,深入分析底层实现方式。函数如下:
1 | def pids(): |
其中_psplatform
表示当前的操作系统平台,例如windows平台下定义为from . import _pswindows as _psplatform
,跟入_pswindows.py
文件的pids()
函数如下:
1 | from . import _psutil_windows as cext |
pids()
函数功能由底层c扩展实现,继续跟入_psutil_windows.c
文件
1 | /* |
函数实现核心为psutil_get_pids
函数,定义在arch/windows/process_info.c
文件中
1 | DWORD * |
调用EnumProcesses api枚举进程,procArray为指向进程ID数组的指针,numberOfReturnedPIDs存储了进程数。