Linux 将jiffies转换为秒

Linux 将jiffies转换为秒,linux,linux-kernel,Linux,Linux Kernel,我有一段用户空间代码,正在解析/proc/PID/task/TID/stat以获取cpu使用率。我可以使用HZ获得每秒的jiffies,但此代码可能会移动到另一台具有不同配置值的机器。有没有办法在运行时从用户空间获取HZ的值?将其除以从sysconf(\u SC\u CLK\u TCK)获取的数字 然而,我认为在Linux下,不管实际的时钟节拍是多少,这个值可能总是100,它总是以100的形式呈现给用户空间 参见man proc(5)。源“ps”命令包括文件,以获取HZ值 他们还寻找编号为17的

我有一段用户空间代码,正在解析/proc/PID/task/TID/stat以获取cpu使用率。我可以使用HZ获得每秒的jiffies,但此代码可能会移动到另一台具有不同配置值的机器。有没有办法在运行时从用户空间获取HZ的值?

将其除以从sysconf(\u SC\u CLK\u TCK)获取的数字

然而,我认为在Linux下,不管实际的时钟节拍是多少,这个值可能总是100,它总是以100的形式呈现给用户空间

参见man proc(5)。

源“ps”命令包括文件
,以获取HZ值

他们还寻找编号为17的“ELF注释”,以查找HZ的值(sysinfo.c):


我不得不承认,这对我来说很奇怪,因为ELF notes是在编译过程中定义的一个部分。

为了澄清答案背后的数学原理:

sysconf(\u SC\u CLK\u TCK)
将每秒为您提供
jiffies
。将
jiffies
除以从
sysconf(\u SC\u CLK\u TCK)
获得的数字,以获得总秒数

      jiffies                      jiffies              seconds
--------------------    =     -----------------    =    -------    =    seconds
sysconf(_SC_CLK_TCK)          (jiffies/second)             1

对于shell脚本等,从命令行使用
getconf CLK\u TCK
。Use可以使用它作为环境变量或在命令行上传递该参数

main(int argc, char **argv) { 
    unsigned long clk_tck = atol(
        getenv("CLK_TCK") || "0"
    ) || sysconf(_SC_CLK_TCK) ;
    ... /* your code */

这使用了如上所述的sysconf,但允许您使用一个环境变量覆盖它,该变量可以通过上述命令进行设置。

Duplicate:这不是一个副本,因为我不能使用HZ define。我确实读到100总是呈现给用户空间。。。但不确定/proc是否算作用户空间:)我不确定我是否理解:这是否意味着HZ实际上不是提问者想要的数字?HZ是我想要的数字。。。但它是一个编译中的常量。只要我在我为之编译的同一台机器上运行。。。一切都很好。但是如果我移动到另一台机器而不重新编译,那么它可能有错误的值。
main(int argc, char **argv) { 
    unsigned long clk_tck = atol(
        getenv("CLK_TCK") || "0"
    ) || sysconf(_SC_CLK_TCK) ;
    ... /* your code */