我有一段用户空间代码正在解析/ proc / PID / task / TID / stat以获取cpu使用率。我可以使用HZ来获取每秒的jiffies,但是这段代码可以移动到具有不同配置值的另一台机器。有没有办法在运行时从用户空间获取HZ的值?
答案 0 :(得分:6)
除以从sysconf(_SC_CLK_TCK)获得的数字。
但是,我认为无论实际的时钟滴答如何,在Linux下这可能总是100,它总是以100的形式呈现给用户空间。
见man proc(5)。
答案 1 :(得分:2)
澄清MarkR's回答背后的数学:
sysconf(_SC_CLK_TCK)
会得到jiffies per second
。将jiffies
除以sysconf(_SC_CLK_TCK)
获得的数字,即可获得总秒数。
jiffies jiffies seconds
-------------------- = ----------------- = ------- = seconds
sysconf(_SC_CLK_TCK) (jiffies/second) 1
答案 2 :(得分:0)
“ps”命令的源包含文件<linux/param.h>
以获取HZ的值。
他们还会查找编号为17的“ELF音符”来查找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笔记是在编译期间定义的一个部分。
答案 3 :(得分:0)
对于shell脚本等,请使用命令行中的getconf CLK_TCK
。 Use可以使用它将该参数作为环境变量或命令行传递。
main(int argc, char **argv) {
unsigned long clk_tck = atol(
getenv("CLK_TCK") || "0"
) || sysconf(_SC_CLK_TCK) ;
... /* your code */
这使用上面的sysconf,但允许您使用环境变量覆盖它,可以使用上面的命令设置它。