将jiffies转换为秒

我有一个用户空间的代码parsing/ proc / PID /任务/ TID /统计来获得CPU使用情况。 我可以使用HZ来获得每秒的jiffies,但是这个代码可以移动到另一台具有不同configuration值的机器上。 有什么办法可以在运行时从用户空间获取HZ的值吗?

Solutions Collecting From Web of "将jiffies转换为秒"

您将它除以从sysconf(_SC_CLK_TCK)中获得的数字。

不过,我认为在Linux下,无论实际的时钟是多少,它总是100,它总是以100的形式呈现给用户空间。

见man proc(5)。

澄清MarkR的答案背后的数学:

sysconf(_SC_CLK_TCK)会让你jiffies per second sysconf(_SC_CLK_TCK) 。 用你从sysconf(_SC_CLK_TCK)得到的数字除以jiffies得到总秒数。

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

“ps”命令的来源包括文件<linux/param.h>来获取HZ的值。

他们还寻找一个编号为17的“ELF note”来查找HZ(sysinfo.c)的值:

  //extern char** environ; /* for ELF executables, notes are pushed before environment and args */ static unsigned long find_elf_note(unsigned long findme){ unsigned long *ep = (unsigned long *)environ; while(*ep++); while(*ep){ if(ep[0]==findme) return ep[1]; ep+=2; } return NOTE_NOT_FOUND; } [...] hz = find_elf_note(17); 

我不得不承认它看起来很奇怪,因为ELF注释是在编译过程中定义的一个部分。

对于shell脚本等, getconf CLK_TCK使用getconf CLK_TCK 。 使用可以使用它作为环境变量或命令行传递参数。

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

这使用上面的sysconf,但是可以使用上面的命令设置一个环境变量来覆盖它。