我有一段用户空间代码,该代码正在解析/ proc / PID / task / TID / stat以获取cpu的使用情况。 我可以使用HZ来获取每秒的跳动,但是此代码可以移动到另一台具有不同配置值的机器上。 有什么方法可以在运行时从用户空间获取HZ的值吗?
重复:stackoverflow.com/questions/2731463/
这不是重复项,因为我不能使用HZ定义。
您将其除以从sysconf(_SC_CLK_TCK)获得的数字。
但是,我认为在Linux下,无论实际的时钟滴答数如何,该值始终为100,在用户空间中始终以100表示??。
参见man proc(5)。
我确实读过总是向用户空间显示100 ...但是不确定/ proc是否算作用户空间:)
我不确定我是否理解:这是否意味着HZ实际上不是发问者想要的号码?
HZ是我想要的数字...但是它是一个常量编译的。 只要我在我编译过的同一台计算机上运行,一切都很好。 但是,如果我在不重新编译的情况下移至另一台计算机,则它可能具有错误的值。
为了阐明MarkR答案背后的数学原理:
sysconf(_SC_CLK_TCK)将使您成为jiffies per second。将jiffies除以您从sysconf(_SC_CLK_TCK)获得的数字即可得到总秒数。
jiffies jiffies seconds
-------------------- = ----------------- = ------- = seconds
sysconf(_SC_CLK_TCK) (jiffies/second) 1
对于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,但是允许您使用环境变量覆盖它,可以使用上面的命令来设置。
" ps"命令的源包含文件,以获取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注释是编译期间定义的部分。