[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