简体   繁体   中英

C - sysinfo() returning bad values i686

I'm trying to write a simple program to alert me when ram is getting fulled, but I've some problems with sysinfo(), the sample program is in C, I've grabbed it from a site with examples the code seems to be okay, any ideas of why this can be happening ? sorry about my english it's not my native language...

code is below:

/* 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;
}

After rereading what you are trying to use sysinfo for and reading the manual page for sysinfo I have an idea what might be bothering you about its results. If this is not your problem then you will need to post more (like actual output of the above program and comments about what is wrong with it and why you think that is wrong).

Old versions of Linux had a different version of sysinfo that was very similar to the current version, but not compatible with it. There were a few fields added to its structure as well as a slight change to the meaning of the memory fields. These fields now need to be interpreted along with the mem_unit field. This is because it is possible for some machines to have more memory than can be expressed within one long integer.

This type of situation became somewhat common on 32 bit x86 where more than 2^32 (4gb) of RAM were installed in some machines. I suspect that this may be your problem since your program does not mention mem_unit at all.

I think that if you try:

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

Then that line may start to produce output that makes more sense for you. A similar change on the other lines that deal with RAM should also make them make more sense.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM