c - 如何以符合 POSIX 的方式在给定 C 中的 PID 的情况下获取进程的开始时间(“STIME”)?
问题描述
ps
POSIX 兼容系统上的命令可以输出进程的开始时间,称为“STIME”。我可以在 C 中进行相应的 POSIX 系统调用来通过 PID 计算进程的开始时间吗?
解决方案
唯一可移植的、符合 POSIX 的方法似乎是解析ps -o etime ...
命令的输出以获取自进程启动以来以天、小时、分钟和秒为单位的持续时间- 似乎没有办法强制STIME
列ps -f ...
允许精确确定时间。ps
例如,GNU/Linux会将STIME
列截断为一种MMMDD
格式,没有可移植的方式来扩展。
根据POSIXps
文档:
...
该
-o
选项允许在用户控制下指定输出格式。应用程序应确保格式规范是作为单个参数或分隔的名称列表。每个变量都有一个默认标题。可以通过附加标题的新文本来覆盖默认标题。参数中的其余字符应用作标题文本。指定的字段应按命令行中指定的顺序写入,并应在输出中按列排列。系统应选择字段宽度至少与标题文本一样宽(默认值或覆盖值)。如果标题文本为空,例如
-o user=
,则字段宽度应至少与默认标题文本一样宽。如果所有标题文本字段都为空,则不应写入标题行。在 POSIX 语言环境中可以识别以下名称:
...
时间
在 POSIX 语言环境中,自进程启动以来经过的时间,格式为:
[[dd-]hh:]mm:ss
其中
dd
应表示天hh
数、小时mm
数、分钟ss
数和秒数。该dd
字段应为十进制整数。、hh
和字段应为左侧用零填充mm
的ss
两位十进制整数。...
例如,如果您知道进程 ID:
sprintf( buffer, "ps -o etime= -p %lld", ( long long ) pid );
FILE *pp = popen( buffer, "r" );
如果要获取所有进程:
FILE *pp = popen( "ps -eo pid= -o etime=", "r" );
注意=
每个格式说明符后的使用。=
可以与格式说明符一起使用来表示列标题。将所有列标题留空会导致不发出标题行,从而简化解析。
您必须解析每一行,并将持续时间与当前时间进行比较,以获得该过程的大致开始时间。您获得的时间可能会因系统更新的任何时间而出现偏差,并且不会精确到超过一秒左右,因为ps
它本身的命令将需要时间来运行,并且您无法真正选择正确的“当前时间”来比较ps
输出中的每个单独的行,因为您无法判断ps
命令如何计算持续时间。
推荐阅读
- python - 如何在 altair plo 中使线条更平滑?
- python - 如何使用 __metaclass__ = ABCMeta 继承和强制执行在超类中定义的抽象方法
- html - 我是否可以使用 CSS 让鼠标悬停时点亮图像?
- python - Numpy在哪里替换if else,Python中超过3个参数
- r - Rcpp 包的发布版本
- python - Python:在 lambda 中使用 lambda 返回 lambda 对象
- ios - ASCellNode 设置高度
- swiftui - 使用 SwiftUI 生命周期时,如何从 ComplicationController 访问我的模型(或 App 结构中的其他状态)?
- r - 为什么我的 ggplot2 图例在这个 R 程序中重叠?
- docusignapi - Docusign - 控制下载、打印和通知