struct sysinfo 结构在提取系统总内存时在超过4G时显示错误的解决
/* 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);
return0;
}
printf("Total Ram: %lluk\tFree: %lluk\n",
sys_info.totalram *(unsignedlonglong)sys_info.mem_unit /1024,
sys_info.freeram *(unsignedlonglong)sys_info.mem_unit/1024);
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 *(unsignedlonglong)sys_info.mem_unit /1024,
sys_info.freeram *(unsignedlonglong)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.
posted on 2012-05-26 18:01 Richard.FreeBSD 阅读(590) 评论(0) 收藏 举报
浙公网安备 33010602011771号