【问题标题】:Linux get process start time of given PIDLinux获取给定PID的进程开始时间
【发布时间】:2018-06-11 06:09:52
【问题描述】:

我需要在用户空间中使用 C 代码获取进程的开始时间。
该进程将以 root 身份运行,所以我可以打开 /proc/PID/stat。
我看到了实现,例如:

start time of a process on linux

http://brokestream.com/procstat.c

但是它们是无效的,为什么它们是无效的?如果进程第二个参数包含空格,例如:

[ilan@CentOS7286-64 tester]$ cat /proc/1077/stat
1077 (rs:main Q:Reg) S 1 1054 1054 0 -1 1077944384 21791 0 10 0 528 464 0 0 20 0 3 0 1056 321650688 1481 18446744073709551615 1 1 0 0 0 0 2146172671 16781830 1133601 18446744073709551615 0 0 -1 1 0 0 1 0 0 0 0 0 0 0 0 0 0

这些解决方案将不起作用。

除了解析 /proc/PID/stat 结果之外,是否有更好的方法来检索进程开始时间?我可以做以下逻辑:

  1. 读长,第一个参数是pid
  2. 读取字符,确保我仅在点击关闭“)”时完成读取。 - 第二个参数是 tcomm(可执行文件的文件名)
  3. 读取字符 - 第三个参数进程状态。

solaris 中,您只需将结果读取到 psinfo_t 结构即可。

【问题讨论】:

  • 也许你想要这样的东西:stackoverflow.com/questions/5828753/…
  • 嗨,再次阅读问题:) 我将该解决方案视为无效答案。
  • 您的程序不正确。您使用getline() 来阅读整行。第一个 int 是一个 pid。第二个字段在该行中的第一个 ( 之后开始,并在该行中的最后一个 ) 之前结束。您可以使用例如strchr(line, '(')strrchr(line, ')') 查找括号。 /proc/PID/stat 中的字段列在man 5 proc

标签: c linux process


【解决方案1】:

您可以简单地使用stat(2) 内核调用。

proc文件系统没有设置创建时间。但是您可以使用修改时间,因为只有在将文件添加到目录或从目录中删除文件时,目录的修改时间才会更改。而且由于proc文件系统中目录的内容只发生变化,如果你更换运行内核的内核模块,你可以很确定,修改时间也是创建时间。

例子:

$ stat -c %y /proc/1
2018-06-01 11:46:57.512000000 +0200
$ uptime -s
2018-06-01 11:46:57

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-11
    • 2011-04-28
    • 1970-01-01
    • 2011-08-15
    • 2021-05-20
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    相关资源
    最近更新 更多