[email protected]
Transcript
[email protected]
IL TEMPO [email protected] DOVE STUDIARE • Gapil • • http://users.lilik.it/~mirko/gapil/gapilse26.html#gapilsu125.html Linux • http://www.linuxsa.org.au/tips/time.html In Italia: GMT +1 (CET) GMT +2 (CEST, ora solare) IL FUSO ORARIO UTC (Tempo Universale Coordinato) anche chiamato GMT (Greenwich Mean Time) NEL COMPUTER • Due posti in cui viene memorizzato il tempo • • BIOS (“hardware clock”) Sistema operativo • • che usa hardware clock al boot Sui sistemi linux • • • • in /etc/localtime viene memorizzato il fuso orario corrente selezionabile da /usr/share/zoneinfo/ Il comando date ci permette di leggere /settare il clock di sistema il comando /usr/sbin/hwclock ci permette di leggere/settare il clock hardware DUE MISURE PER IL TEMPO • Calendar Time • Numero di secondi dal 1/1/1970 (Epoch time) • Tempo utilizzato dal kernel ad es. per le modifiche dei file • Memorizzato nel tipo “time_t” (tempo assoluto) • Process Time • Tempo di processore • Misurato in “clock ticks” • Un tempo misurava gli interrupt per secondo • oggi POSIX richiede che sia pari alla costante CLOCKS_PER_SEC = 1000000 • Memorizzato nel tipo “clock_t” (tempo relativo) • Usato ad es. per valutare le performance di un programma DOMANDA • Calendar time: • “Tempo utilizzato dal kernel…” • “secondi dall’epoch time (1/1/1970)” • su molte macchine (unix, 32 bit) sizeof(time_t) = 4 • tipicamente un intero con segno CANDY CRUSH Il wait period, su dispositivi la cui data era modificata artificialmente a prima del 18 gennaio 2038 faceva crashare l’app TEMPI DI PROCESSO Per ciascun processo il kernel mantiene: • clock time: tempo reale passato dall’avvio del processo • user time: tempo passato ad eseguere le istruzioni del processo (user space) • system time: tempo passato ad eseguire le syscall per conto del processo • user time + system time = CPU time • è quello che ritorna il comando time nome_eseguibile • ritornato anche dalla funzione “clock() ESEMPIO: MISURIAMO IL TEMPO DI ESECUZIONE DI UN PROCESSO TEMPI DI CALENDARIO • Esiste una analoga funzione stime per settare l’orologio di sistema • La funzione time_t time(time_t *t) ha una scarsa precisione (secondo) • Per questo, queste funzioni sono sostituite da gettimeofday e settimeofday GETTIMEOFDAY ritorna 0 in caso di successo, -1 in caso di errore #include <sys/time.h> #include <time.h> int gettimeofday(struct timeval *tv, struct timezone *tz) struct timeval { long tv_sec; long tv_usec; /* seconds */ /* microseconds */ }; • il parametro timezone è obsoleto (settarlo sempre a NULL) • esiste la funzione analoga settimeofday LE DATE • Dato un calendar time, come stampare ore, minuti e secondi? • Funzioni di libreria per il “broken down time” struct tm { int tm_sec; /* seconds */ int tm_min; /* minutes */ int tm_hour; /* hours */ int tm_mday; /* day of the month */ int tm_mon; /* month */ int tm_year; /* year */ int tm_wday; /* day of the week */ int tm_yday; /* day in the year */ int tm_isdst; /* daylight saving time */ long int tm_gmtoff; /* Seconds east of UTC. */ const char *tm_zone; /* Timezone abbreviation. */ }; FUNZIONI #include <time.h> char *asctime(const struct tm *tm) Produce una stringa con data e ora partendo da un valore espresso in broken-down time. char *ctime(const time_t *timep) Produce una stringa con data e ora partendo da un valore espresso in in formato time_t. struct tm *gmtime(const time_t *timep) Converte il calendar time dato in formato time_t in un broken-down time espresso in UTC. struct tm *localtime(const time_t *timep) Converte il calendar time dato in formato time_t in un broken-down time espresso nell'ora locale. time_t mktime(struct tm *tm) Converte il broken-down time in formato time_t. SCRIVERE IL TEMPO #include <time.h> size_t strftime(char *s, size_t max, const char *format, const struct tm *tm) Stampa il tempo tm nella stringa s secondo il formato format. LE FUNZIONI DI SLEEP #include <unistd.h> unsigned int sleep(unsigned int seconds) Pone il processo in stato di sleep per un certo numero di secondi int nanosleep(const struct timespec *req, struct timespec *rem) Pone il processo in stato di sleep per il tempo specificato da req. In caso di interruzione restituisce il tempo restante in rem. struct timespec { time_t tv_sec; long tv_nsec; }; /* seconds */ /* nanoseconds */ ESEMPIO #include <stdio.h> #include <unistd.h> int main() { printf("wait\n"); sleep(3); printf("time elapsed\n"); return 0; } Cosa otteniamo se misuriamo il process time? ESERCIZIO 1. Stampare il tempo corrente ogni secondo 1. utilizzare la funzione sleep 2. stampare secondi e us correnti 2. Modificare il programma per non andare out of sync 1. supponiamo di dover fare un orologio che deve scrivere il tempo per anni TIMEOUT Problema: • Voglio eseguire una certa funzione tra X secondi senza mettere il mio processo in stato di sleep • Ad esempio stampare “Hurry up!” se l’utente ci mette più di 10 secondi a fare una mossa a tris Soluzione • Utilizzare un timer • Su linux, far generare al sistema operativo un segnale allo scadere di un certo lasso di tempo • Il segnale in questione è SIGALERT TIMEOUT: PROCEDURE 1. Definire una funzione da chiamare allo scadere del timeout 1. handler del segnale SIGALARM 2. prototipo: void nome_funzione(int sig); 2. Impostare il timer 1. Funzione alarm 2. prototipo: unsigned int alarm(unsigned int seconds) 3. “returns the number of seconds remaining until any previously scheduled alarm was due to be delivered” 3. Scrivere il nostro main TIMEOUT
Documenti analoghi
Data e Ora di sistema in C
E’ ora il momento di fare la conoscenza della funzione
localtime(): questa, ricevendo come input l’indirizzo di un
time_t (opportunamente inizializzato ad un numero di secondi),
restituisce un punt...