C - sysinfo () возвращает неправильные значения i686 - PullRequest
1 голос
/ 20 ноября 2010

Я пытаюсь написать простую программу, чтобы предупредить меня, когда 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 Ответ

3 голосов
/ 20 ноября 2010

После перечитывания того, что вы пытаетесь использовать sysinfo, и прочтения справочной страницы для sysinfo У меня есть идея, что может беспокоить вас о ее результатах.Если это не ваша проблема, вам нужно будет публиковать больше (например, фактический вывод вышеприведенной программы и комментарии о том, что с ней не так и почему вы думаете, что это неправильно).

Старые версии Linux имелидругая версия sysinfo, которая была очень похожа на текущую, но не совместима с ней.Было добавлено несколько полей к его структуре, а также небольшое изменение значения полей памяти.Эти поля теперь необходимо интерпретировать вместе с полем mem_unit.Это связано с тем, что на некоторых машинах может быть больше памяти, чем может быть выражено в одном длинном целом числе.

Этот тип ситуации стал несколько распространенным на 32-битной x86, где более 2 ^ 32 (4 ГБ) оперативной памятибыли установлены на некоторых машинах.Я подозреваю, что это может быть вашей проблемой, поскольку ваша программа вообще не упоминает 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);

Тогда эта строка может начать выводитьэто имеет больше смысла для вас.Аналогичное изменение в других строках, имеющих отношение к оперативной памяти, также должно сделать их более понятными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...