【问题标题】:C - sysinfo() returning bad values i686C - sysinfo() 返回错误值 i686
【发布时间】:2010-11-19 21:13:31
【问题描述】:

我正在尝试编写一个简单的程序以在 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;
}

【问题讨论】:

  • 那个链接是源代码...
  • 您遇到了什么问题?什么工作不正常?
  • 对我来说似乎工作正常。
  • @user313941:欢迎来到 SO。请使用“编辑”按钮为您的问题添加更多信息/精度。不要将其隐藏在 cmets 中。为了让我们清楚您遇到的问题,您必须更详细地了解您面临的实际问题。你的程序的输出是什么,你期望的输出是什么?

标签: c linux


【解决方案1】:

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

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

这种情况在某些机器上安装了超过 2^32 (4gb) 的 RAM 的 32 位 x86 上变得有些普遍。我怀疑这可能是您的问题,因为您的程序根本没有提到 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 的其他行进行类似更改也应该使它们更有意义。

【讨论】:

  • 对不起,我是 C 中的新编程人员,这是我的第一个问题,我将听取您的建议以备将来发布,这些行打印我机器的实际内存大小,正如您所说我安装了 4GB我的系统运行 ubuntu 32_x86。有了这个任务,一切都很好:)我相信这篇文章对其他人也有用......
  • @kainlite:由于界面发生了变化,基于旧文档或旧示例程序很容易犯此错误。
猜你喜欢
  • 2011-06-26
  • 2012-02-17
  • 2015-12-28
  • 1970-01-01
  • 2012-08-31
  • 2018-09-21
  • 2023-03-08
  • 2018-06-02
  • 1970-01-01
相关资源
最近更新 更多