Sul mio sistema ottiene il tempo di attività da /proc/uptime
:
$ strace -eopen uptime
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/libproc-3.2.8.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/proc/version", O_RDONLY) = 3
open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3
open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 3
open("/proc/uptime", O_RDONLY) = 3
open("/var/run/utmp", O_RDONLY|O_CLOEXEC) = 4
open("/proc/loadavg", O_RDONLY) = 4
10:52:38 up 3 days, 23:38, 4 users, load average: 0.00, 0.02, 0.05
Dalla pagina man proc:
/proc/uptime This file contains two numbers: the uptime of the system (seconds), and the amount of time spent in idle process (seconds).
Il filesystem proc contiene una serie di pseudo file. Quelli non sono file reali, sembrano solo file, ma contengono valori forniti direttamente dal kernel. Ogni volta che leggi un file, come /proc/uptime
, il suo contenuto viene rigenerato al volo. Il filesystem proc è un'interfaccia per il kernel.
Nel codice sorgente del kernel linux del file fs/proc/uptime.c
alla riga 49, vedi una chiamata di funzione:
proc_create("uptime", 0, NULL, &uptime_proc_fops);
Questo crea una voce del filesystem proc chiamata uptime
(il procfs è solitamente montato sotto /proc
), e vi associa una funzione, che definisce operazioni di file valide su quello pseudo file e le funzioni ad esse associate. In caso di uptime è solo read()
e open()
operazioni. Tuttavia, se rintracci le funzioni, finirai qui, dove viene calcolato il tempo di attività.
Internamente è presente un timer-interrupt che aggiorna periodicamente l'uptime dei sistemi (oltre ad altri valori). L'intervallo, in cui il timer-interrupt ticchetta, è definito dalla macro-preprocessore HZ
, il cui valore esatto è definito nel file di configurazione del kernel e applicato al momento della compilazione.
Il tempo di inattività e il numero di cicli della CPU, combinati con la frequenza HZ
(cicli al secondo) può essere calcolato in un numero (di secondi) dall'ultimo avvio.
Per rispondere alla tua domanda:Da quando inizia a contare il "tempo di attività"?
Poiché il tempo di attività è un valore interno del kernel, che aumenta a ogni ciclo, inizia a contare quando il kernel è stato inizializzato. Cioè, quando il primo ciclo è terminato. Anche prima che qualsiasi cosa venga montata, subito dopo che il bootloader ha dato il controllo all'immagine del kernel.
Per quanto ne so, uptime
usa /proc/uptime
per calcolare il tempo di attività del sistema. Puoi vederlo più chiaramente nel codice sorgente uptime.c
FILE *fp;
fp = fopen ("/proc/uptime", "r");
if (fp != NULL)
{
char buf[BUFSIZ];
char *b = fgets (buf, BUFSIZ, fp);
if (b == buf)
{
char *end_ptr;
double upsecs = c_strtod (buf, &end_ptr);
if (buf != end_ptr)
uptime = (0 <= upsecs && upsecs < TYPE_MAXIMUM (time_t)
? upsecs : -1);
}
fclose (fp);
}
Su un sistema UNIX standard (basato sui sorgenti originali *), uptime
legge /var/adm/utmpx
e controlla l'ultima volta che è stato immesso il riavvio.
In altre parole:recupera la data che ottieni anche con who -b
e quindi calcola il tempo trascorso da allora.
*) uptime
è un collegamento al w
programma ed è stato introdotto da BSD intorno al 1980.