2009-10-08 9 views
25

Chciałbym uzyskać czas sprawności systemu z poziomu aplikacji C działającej w systemie opartym na systemie Linux. Nie chcę wywoływać uptime (1) i analizować wyników, chciałbym nazwać bazowym API C, podejrzewam, że istnieje. Ktoś wie, czy jest takie połączenie, czy uptime (1) po prostu przetwarza rekordy uzyskane od wtmp?Jakie API mam wywołać, aby uzyskać czas sprawności systemu?

+0

jest to możliwe, aby uzyskać czas pracy w nano sekund ??? Czy próbowałeś ? – Jeyaram

Odpowiedz

30

System zadzwonić szukasz jest sysinfo().

Jest zdefiniowana w sys/sysinfo.h

Jego podpis jest: int sysinfo (struct sysinfo * info)

Ponieważ jądro 2.4, struktura wyglądała następująco:

struct sysinfo { 
    long uptime;    /* Seconds since boot */ 
    unsigned long loads[3]; /* 1, 5, and 15 minute load averages */ 
    unsigned long totalram; /* Total usable main memory size */ 
    unsigned long freeram; /* Available memory size */ 
    unsigned long sharedram; /* Amount of shared memory */ 
    unsigned long bufferram; /* Memory used by buffers */ 
    unsigned long totalswap; /* Total swap space size */ 
    unsigned long freeswap; /* swap space still available */ 
    unsigned short procs; /* Number of current processes */ 
    unsigned long totalhigh; /* Total high memory size */ 
    unsigned long freehigh; /* Available high memory size */ 
    unsigned int mem_unit; /* Memory unit size in bytes */ 
    char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding for libc5 */ 
}; 

Miłej zabawy!

+0

Zaimplementowałem czytanie/proc/uptime, jak sugerowałem powyżej, ale wywołanie API w porównaniu z odczytaniem "pliku" jest dokładnie tym, czego chciałem. Dziękuję Ci! –

+0

Czy można uzyskać informacje o poziomie nano sekund (dla czasu pracy)? – Jeyaram

12

Przeczytaj plik /proc/uptime i jako pierwszy czas pracy w sekundach przyjmuj pierwszą liczbę dziesiętną.

Od man 5 proc:

/proc/uptime 
      This file contains two numbers: the uptime of the system (sec‐ 
      onds), and the amount of time spent in idle process (seconds). 
+2

... a jeśli "strace" komendę 'uptime (1)', zobaczysz, że to właśnie robi. – caf

+0

caf: na maszynach linuksowych, maszyny BSD na ogół używają "aktualnego czasu - syctl kern.boottime" – Tarrant

+0

@caf, 'uptime (1)' robi o wiele więcej niż tylko to, więc może być nieco trudne do znalezienia :) – bdonlan

11

To byłoby coś takiego.

Zobacz "man sysinfo", aby uzyskać więcej informacji.

+6

You missing: #include Frederik

3

Istnieje również clock_gettime (prawdopodobnie potrzebuje -lrt). Zachowanie, które widziałem (nie zamierzam twierdzić, że jest to gwarantowane), ale podane jako CLOCK_MONOTONIC jako clk_id jest to, że zwraca czas działania systemu w danym parametrze struct timespec *.

#include <stdio.h> 
#include <time.h> 

int main(int argc, char* argv[]) { 
    struct timespec t; 
    clock_gettime(CLOCK_MONOTONIC, &t); 
    printf("tv_sec=%llu tv_nsec=%llu\n", 
    (unsigned long long)t.tv_sec, 
    (unsigned long long)t.tv_nsec); 
    return 0; 
} 
+0

Nie, nie ma; monotoniczny zegar ma dowolną epokę. Ta strona podręcznika, którą łączysz, mówi właśnie to. –

+0

@BoundaryImposition Pytanie jest oznaczone linuxem, a w Linuksie zachowanie było (i [nadal jest] (http://elixir.free-electrons.com/linux/latest/ident/CLOCK_MONOTONIC) jak opisałem). POSIX mówi, że epoka jest dowolna, implementacja Linuksa koreluje z czasem działania. Zobacz [kernel/time/posix-timers.c] (http://elixir.free-electrons.com/linux/latest/source/kernel/time/posix-timers.c) i [fs/proc/uptime.c ] (http://elixir.free-electrons.com/linux/latest/source/fs/proc/uptime.c). I [tutaj jest odpowiedni wątek LKML] (https://lkml.org/lkml/2014/1/2/39). – opello

+0

Połączyłeś się z plikami implementacyjnymi. To może się zmienić w dowolnym momencie. Pytanie dotyczy interfejsu API, a interfejs API mówi, że epoka jest dowolna. Arbitralne nie oznacza, że ​​nie ma epoki, oznacza to po prostu, że nie można polegać na wyborze. Wątek LKML, do którego mnie przyłączyłeś, faktycznie to określa. –

0
#include <sys/sysinfo.h> 
#include <sys/types.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <grp.h> 

int main() { 
    struct sysinfo sys_info; 
    struct group* grp; 

    gid_t gid; 
    char** users; 

    int days, hours, mins, x = 1; 

    system("clear"); 
    printf("\033[4;40m   Systems information     \033[0;m \n"); 
    if(sysinfo(&sys_info) != 0) 
    perror("sysinfo"); 

    days = sys_info.uptime/86400; 
    hours = (sys_info.uptime/3600) - (days * 24); 
    mins = (sys_info.uptime/60) - (days * 1440) - (hours * 60); 

    printf("\033[1;33m Uptime: \033[0;36m %ddays, %dhours, %dminutes, %ldseconds \033[0;m \n", 
         days, hours, mins, sys_info.uptime % 60); 

    printf("\033[1;33m Load Avgs: \033[0;m 1min(%ld) 5min(%ld) 15min(%ld) \n", 
      sys_info.loads[0], sys_info.loads[1], sys_info.loads[2]); 

    printf("\033[1;33m Total Ram: \033[0;m %ldk \t Free: %ldk \n", sys_info.totalram/1024, sys_info.freeram/1024); 
    printf(" \033[1;33m Shared Ram: \033[0;m %ldk ", sys_info.sharedram/1024); 
    printf(" Buffered Ram: %ldk \n", sys_info.bufferram/1024); 
    printf("\033[1;33m Total Swap: \033[0;m %ldk \t Free swap: %ldk \n", sys_info.totalswap/1024, sys_info.freeswap/1024); 
    printf("\033[1;33m Total High Memory: \033[0;m %ldk Free high memory: %ldk \033[0;m \n", sys_info.totalhigh/1024, sys_info.freehigh/1024); 
    printf(" \n"); 
    printf("\033[1;44m Total Number of processes: %d \033[0;m \n", sys_info.procs); 
    gid = getgid(); 
    printf(" Group ID: \033[031m %d", gid); 
    if((grp = getgrgid(gid)) == NULL) return 1; 
    printf("\033[0;m Group %s ", grp->gr_name); 
    printf("\n Users in your group "); 
    for(users = grp->gr_mem; *users != NULL; users++,++x); printf("%d", ++x);  
    if(strcmp(grp->gr_passwd,"x") == 0) printf(" Password is protected by shadow file. \n"); 
    else printf("Password: %s ", grp->gr_passwd); 

    return 0; 
} 
+1

Dobra odpowiedź powinna obejmować nie tylko kod, ale także wyjaśnienie, jak to działa i dlaczego odpowiada na pytanie. Jest to szczególnie ważne, ponieważ istnieje już akceptowana odpowiedź na to pytanie. – Blackwood

Powiązane problemy