2010-11-19 4 views
1

램이 채워질 때 경고하는 간단한 프로그램을 작성하려고하는데 sysinfo()에 대한 몇 가지 문제가 있는데 샘플 프로그램은 C이고, 코드가 괜찮을 것 같은 예제를 가진 사이트에서 그것을 잡았는데 왜 이것이 일어날 수 있는지에 대한 아이디어가 있습니까? 이잘못된 값을 반환하는 C - sysinfo() i686

코드는 다음과 같습니다 ... 제 모국어 아니라 내 영어에 대한 유감 :

/* sysinfo.c by [email protected] 
* 
* 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; 
} 
+0

http://www.metalshell.com/source_code/114/Sysinfo.html 해당 링크의 – kainlite

+0

은 소스 코드입니다 ... – kainlite

+5

어떤 문제가 있습니까? 무엇이 제대로 작동하지 않습니까? –

답변

3

당신이 sysinfo를 사용 하려는지 다시 읽기 및 sysinfo에 대한 매뉴얼 페이지를 읽은 후 나는 무엇을 수도 아이디어가 그 결과에 대해 당신을 괴롭히는 것. 이것이 귀하의 문제가 아니라면 더 많은 것을 게시해야합니다 (위의 프로그램의 실제 결과물과 그와 관련하여 잘못된 점과 그것이 잘못되었다고 생각하는 이유에 대한 의견).

이전 버전의 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을 다루는 다른 라인에서도 비슷한 변화가 이루어져야한다.

+0

죄송합니다. 저는 C로 새로운 프로그래밍을하고 있습니다. 첫 번째 질문입니다. 향후 게시를 위해 귀하의 충고를 받아 들일 것입니다. 라인에 내 컴퓨터의 실제 메모리 크기가 인쇄됩니다. 4GB가 설치되어 있고 시스템에서 우분투가 실행 중입니다. 32_x86 . 그 임무는 잘 작동합니다 :) 나는이 게시물이 다른 사람에게도 유용 할 것이라고 확신합니다. – kainlite

+0

@kainlite : 이전 문서 나 오래된 예제 프로그램을 기반으로이 실수를하는 것은 매우 쉬울 것입니다. 인터페이스가 변경되었습니다. – nategoose

관련 문제