首页 > 解决方案 > 如何以符合 POSIX 的方式在给定 C 中的 PID 的情况下获取进程的开始时间(“STIME”)?

问题描述

psPOSIX 兼容系统上的命令可以输出进程的开始时间,称为“STIME”。我可以在 C 中进行相应的 POSIX 系统调用来通过 PID 计算进程的开始时间吗?

标签: cunixprocessposix

解决方案


唯一可移植的、符合 POSIX 的方法似乎是解析ps -o etime ...命令的输出以获取自进程启动以来以天、小时、分钟和秒为单位的持续时间- 似乎没有办法强制STIMEps -f ...允许精确确定时间。ps例如,GNU/Linux会将STIME列截断为一种MMMDD格式,没有可移植的方式来扩展。

根据POSIXps文档

...

-o选项允许在用户控制下指定输出格式。

应用程序应确保格式规范是作为单个参数或分隔的名称列表。每个变量都有一个默认标题。可以通过附加标题的新文本来覆盖默认标题。参数中的其余字符应用作标题文本。指定的字段应按命令行中指定的顺序写入,并应在输出中按列排列。系统应选择字段宽度至少与标题文本一样宽(默认值或覆盖值)。如果标题文本为空,例如-o user=,则字段宽度应至少与默认标题文本一样宽。如果所有标题文本字段都为空,则不应写入标题行。

在 POSIX 语言环境中可以识别以下名称:

...

时间

在 POSIX 语言环境中,自进程启动以来经过的时间,格式为:

[[dd-]hh:]mm:ss

其中dd应表示天hh数、小时mm数、分钟ss数和秒数。该dd 字段应为十进制整数。、hh和字段应为左侧用零填充mmss两位十进制整数。

...

例如,如果您知道进程 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命令如何计算持续时间。


推荐阅读