我正试着写一个简单的程序来提醒我,当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;
}发布于 2010-11-20 05:52:01
在重读了您尝试使用sysinfo的目的并阅读了sysinfo的手册页面之后,我知道了它的结果可能会困扰您的是什么。如果这不是你的问题,那么你需要发布更多(比如上面程序的实际输出,以及关于它的错误和为什么你认为是错误的评论)。
旧版本的Linux有一个与当前版本非常相似的不同版本的sysinfo,但与当前版本不兼容。在其结构中添加了一些字段,并对内存字段的含义进行了轻微更改。现在需要将这些字段与mem_unit字段一起解释。这是因为有些机器的内存可能会超过一个长整型所能表示的内存。
这种情况在安装了超过2^32 (4 4gb)内存的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的其他行上进行类似的更改也会使它们更有意义。
https://stackoverflow.com/questions/4229415
复制相似问题