C - sysinfo()返回错误的值i686

时间:2010-11-19 21:13:31

标签: c linux

我正在尝试编写一个简单的程序,当ram变得充满时提醒我,但是我遇到了sysinfo()的一些问题,示例程序在C中,我从一个带有示例的网站抓住了它代码似乎没问题,为什么会发生这种情况的任何想法?抱歉我的英语不是我的母语......

代码如下:

/* sysinfo.c by detour@metalshell.com
 *
 * Display the uptime, load averages, total ram, free ram,
 * shared ram, buffered ram, total swap, free swap, and
 * number of processes running on a linux machine.
 *
 * http://www.metalshell.com/
 *
 */

#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]);

  // Total and free ram.
  printf("Total Ram: %ldk\tFree: %ldk\n", sys_info.totalram / 1024,
                                        sys_info.freeram / 1024);

  // Shared and buffered ram.
  printf("Shared Ram: %ldk\n", sys_info.sharedram / 1024);
  printf("Buffered Ram: %ldk\n", sys_info.bufferram / 1024);

  // Swap space
  printf("Total Swap: %ldk\tFree: %ldk\n", sys_info.totalswap / 1024,
                                           sys_info.freeswap / 1024);

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

  return 0;
}

1 个答案:

答案 0 :(得分:3)

在重新阅读您尝试使用sysinfo的内容并阅读sysinfo的手册页后,我知道可能会对您的结果感到困扰。如果这不是你的问题那么你需要发布更多(比如上面程序的实际输出和关于它有什么问题的评论以及为什么你认为这是错误的。)

旧版本的Linux有sysinfo的不同版本,与当前版本非常相似,但与之不兼容。它的结构中添加了一些字段,并且内存字段的含义稍有变化。现在需要将这些字段与mem_unit字段一起解释。这是因为某些机器可能拥有的内存大于在一个长整数内表达的内存。

这种情况在32位x86上变得有些普遍,在某些机器上安装了超过2 ^ 32(4gb)的RAM。我怀疑这可能是你的问题,因为你的程序根本没有提到mem_unit

我想如果你尝试:

 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);

然后该行可能会开始产生对您更有意义的输出。处理RAM的其他行的类似改变也应该使它们更有意义。