avvalorati dipendono dal tipo di segnale e ricalcano i valori che abbiamo già
illustrato in sez.~\ref{sec:sig_sigaction}.\footnote{si tenga presente però
che per un bug i kernel fino al 2.6.25 non avvalorano correttamente i campi
- \var{ssi\_ptr} e \var{ssi_int} per segnali inviati con \func{sigqueue}.}
+ \var{ssi\_ptr} e \var{ssi\_int} per segnali inviati con \func{sigqueue}.}
Lo stesso paradigma di notifica tramite file descriptor usato per i segnali è
stato adottato anche per i timer; in questo caso, rispetto a quanto visto in
sez.~\ref{sec:sig_timer_adv}, la scadenza di un timer potrà essere letta da un
-file descriptor, senza dover ricorrere ad altri meccanismi come un segnale o
-un \textit{thread} di notifica. Di nuovo questo ha il vantaggio di poter
+file descriptor, senza dover ricorrere ad altri meccanismi di notifica come un
+segnale o un \textit{thread}. Di nuovo questo ha il vantaggio di poter
utilizzare le funzioni dell'\textit{I/O multiplexing} per attendere allo
stesso tempo la disponibilità di dati o la ricezione di un segnale
qualunque.\footnote{in realtà per questo sarebbe già sufficiente
\func{signalfd} per ricevere i segnali associati ai timer, ma la nuova
interfaccia semplifica notevolmente la gestione.}
-Le funzioni di questa interfaccia riprendono da vicino
+Le funzioni di questa interfaccia riprendono da vicino quelle introdotte da
+POSIX.1-2001 illustrate sez.~\ref{sec:sig_timer_adv}. La prima funzione, che
+consente di creare un \textit{timer} è \funcd{timerfd\_create}, il cui
+prototipo è:
+\begin{prototype}{sys/timerfd.h}
+ {int timerfd\_create(int clockid, int flags)}
+
+ Crea un timer associato ad un file descriptor per la notifica.
+
+ \bodydesc{La funzione restituisce un numero di file descriptor in caso di
+ successo o $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno
+ dei valori:
+ \begin{errlist}
+ \item[\errcode{EINVAL}] l'argomento \param{clockid} non è
+ \const{CLOCK\_MONOTONIC} o \const{CLOCK\_REALTIME}, o
+ l'argomento \param{flag} non è valido o diverso da zero per kernel
+ precedenti il 2.6.27.
+ \item[\errcode{ENOMEM}] non c'è memoria sufficiente per creare un nuovo file
+ descriptor di \func{signalfd}.
+ \item[\errcode{ENODEV}] il kernel non può montare internamente il
+ dispositivo per la gestione anonima degli inode associati al file
+ descriptor.
+ \end{errlist}
+ ed inoltre \errval{EMFILE} e \errval{ENFILE}.
+}
+\end{prototype}
+La funzione prende come primo argomento il tipo di orologio a cui il timer
+deve fare riferimento, ed i soli valori validi sono \const{CLOCK\_REALTIME},
+per indicare
% TODO trattare qui eventfd, timerfd introdotte con il 2.6.22
tutto indipendente dalla frequenza scelta per il timer di sistema che governa
lo \textit{scheduler};\footnote{normalmente si possono ottenere precisioni
fino al microsecondo, andando molto oltre in caso di hardware dedicato.} per
-questo lo standard POSIX ha previsto una serie di nuove funzioni relative a
-quelli che vengono chiamati ``\textsl{orologi} \textit{real-time}'', in grado
-di supportare risoluzioni fino al nanosecondo. Inoltre le CPU più moderne sono
-dotate a loro volta di contatori ad alta definizione che consentono una grande
-accuratezza nella misura del tempo da esse dedicato all'esecuzione di un
-processo.
+questo lo standard POSIX.1-2001 ha previsto una serie di nuove funzioni
+relative a quelli che vengono chiamati ``\textsl{orologi}
+\textit{real-time}'', in grado di supportare risoluzioni fino al
+nanosecondo. Inoltre le CPU più moderne sono dotate a loro volta di contatori
+ad alta definizione che consentono una grande accuratezza nella misura del
+tempo da esse dedicato all'esecuzione di un processo.
Per usare queste funzionalità ed ottenere risoluzioni temporali più accurate,
occorre però un opportuno supporto da parte del kernel, ed i cosiddetti
die("Cannot create well known fifo");
}
if ((fifofd = open(fifoname, O_RDWR|O_NONBLOCK)) < 0) // open fifo
- die("Cannot open read only well known fifo");
+ die("Cannot open well known fifo");
epev.data.fd = fifofd; // add fd to epoll
epev.events = EPOLLIN;
if (epoll_ctl(epfd, EPOLL_CTL_ADD, fifofd, &epev))
}
buffer[nread] = 0;
if (fputs(buffer, stdout) == EOF)
- die("Errore in scrittura su terminale");
+ die("Error on terminal write");
}
} else { // anything else is an error
printf("epoll activity on unknown %i file descriptor\n",