c - sysinfo 系统调用在 Linux 上返回错误的负载平均值

标签 c linux sysinfo

我有一个 C 程序可以打印一些系统统计信息。

#include <sys/sysinfo.h>
#include <stdio.h>

int main() {
  int days, hours, mins;
  struct sysinfo sys_info;

  if(sysinfo(&sys_info) != 0)
    perror("sysinfo");

  // Uptime
  days = sys_info.uptime / 86400;
  hours = (sys_info.uptime / 3600) - (days * 24);
  mins = (sys_info.uptime / 60) - (days * 1440) - (hours * 60);

  printf("Uptime: %ddays, %dhours, %dminutes, %ldseconds\n",
                      days, hours, mins, sys_info.uptime % 60);

  // Load Averages for 1,5 and 15 minutes
  printf("Load Avgs: 1min(%ld) 5min(%ld) 15min(%ld)\n",
          sys_info.loads[0], sys_info.loads[1], sys_info.loads[2]);

  printf("Total Ram: %lluk\tFree: %lluk\n",
                sys_info.totalram *(unsigned long long)sys_info.mem_unit / 1024,
                sys_info.freeram *(unsigned long long)sys_info.mem_unit/ 1024);


  // Number of processes currently running.
  printf("Number of processes: %d\n", sys_info.procs);

  return 0;
}

我的问题是负载平均值与/proc/loadavg 不同

./a.out 
Uptime: 1days, 4hours, 1minutes, 16seconds
Load Avgs: 1min(13248) 5min(14880) 15min(11840)
Total Ram: 2052956k Free: 188104k
Number of processes: 265

为什么?我正在打印 13248,但“top”或“cat/proc/loadavg”给出了 0.24。有什么问题?

最佳答案

调用不会返回“错误”值。请注意,类型是整数,因此不能返回 uptime 打印的 float 。

参见 this thread用于研究如何解释返回值,以及如何转换为更熟悉的 float 。

我的猜测(在阅读链接之前)是它只是按比例放大了 65,535 (216),这似乎也是他们发现的。因此,除以 65536.0,或者为了更清晰(如评论中所指出的),使用 SI_LOAD_SHIFT 常量并除以 (float)(1 << SI_LOAD_SHIFT)。 .

关于c - sysinfo 系统调用在 Linux 上返回错误的负载平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4993158/

相关文章:

linux - 为什么 GCC(和其他工具)不遵循 GNU 命令选项约定准则?

无法理解 sysinfo 返回的负载

c - 当我处理信号_handler和主函数中的变量时,如何屏蔽信号

c - Linux,套接字,非阻塞连接

c - 使用 stat(2) - 获取 inode 编号和硬链接(hard link)计数

linux - 并行 SVN 更新过程

c - 如何使用 visual studio windows 7 确定 x64 机器上安装的内存

c - Linux C : sysinfo get bad memory values

c - 使用管道在进程之间发送字符串

c - linux 中的闹钟和 sleep