c++ - 检索流程创建时间的API(Linux)

标签 c++ linux process timestamp redhat

我正在寻找一个过程可以用来弄清楚自己创建的时间戳的API。 “创建时间戳”是指流程“诞生”的时间点,即诞生时间戳。
我的情况的具体情况:

  • 我需要的程序是一个C++库。和
  • 是使用gcc 7.3.1编译的;和
  • 可以在Linux和Red Hat Enterprise Linux Server 6.8版(圣地亚哥)上运行。
  • 我需要达到至少毫秒的精度。
  • 我无法访问/控制程序启动时发生的事情(因为我正在使用由各种应用程序占用的库)

  • 我已经搜索了一段时间,但找不到能解决我问题的东西。下面列出了两个最有希望的候选人:
    starttime中查找/proc/PID/stat看来/proc/PID/stat文件提供了一个名为starttime的字段(条目22)。引用文档:https://man7.org/linux/man-pages/man5/proc.5.html
    这样,我仍然需要:
  • 查找机器启动时间;
  • starttime从jiffies转换为微秒;
  • 进行数学运算以将其“添加”到启动时间。

  • 这并非不可能,但我希望有一条通向我所需信息的简便方法。到目前为止,我还不知道如何获得系统启动时间(至少具有微秒的精度)。我知道start time of a process on linux-但是此计算使用的btime仅具有第二个精度,因此不够精确,无法满足要求:|stat函数
    根据https://man7.org/linux/man-pages/man2/stat.2.htmlstat函数可以为我提供各种与文件相关的时间戳,尤其是:
    struct timespec st_atim;  /* Time of last access */
    struct timespec st_mtim;  /* Time of last modification */
    struct timespec st_ctim;  /* Time of last status change */
    
    但是,如https://man7.org/linux/man-pages/man7/inode.7.html中所述,似乎所有这些时间戳实际上都不能保证与出生时间戳相等,因为所有这些时间戳都可以通过某些操作(读/写等)进行更新。
    看来我想要的是File creation (birth) timestamp (btime)。 linux手册页的内容如下:
    File creation (birth) timestamp (btime)
          (not returned in the stat structure); statx.stx_btime
    
          The file's creation timestamp.  This is set on file creation
          and not changed subsequently.
    
          The btime timestamp was not historically present on UNIX
          systems and is not currently supported by most Linux
          filesystems.
    
    所以...我不确定获得流程创建时间的最佳方法是什么。感谢您阅读本文,您真棒!

    最佳答案

    POSIX stat并未定义此字段,但是您可以从 statx 中获取它。
    它是在2019年初添加的,因此您需要相当新的内核和glibc版本才能利用它。

    关于c++ - 检索流程创建时间的API(Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63603266/

    相关文章:

    c++ - 具有一个默认值局部参数的函数

    c++ - 为什么异常捕获是基于顺序的而不是基于最接近的继承?

    c# - 串联使用 Visual Basic 和 C++/C#

    c++ - 可以处理随机访问和 key 搜索的数据结构是什么?

    linux - BASH/Linux - 从变量中查找下一个日期

    c - 大型 Unix C 应用程序中 fork 进程的持续时间和范围

    linux - 使用find从两个目录中删除同名文件

    linux - 如何将间隔添加到存储在变量中的日期/时间

    java - 如何在一个 Java 进程中创建和写入文件并从另一个进程中读取文件而不会遇到读/写问题(Java/EE)

    c# - 如何处置不想等待退出的进程