X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=fileadv.tex;h=6f87c7bb4132654252dd3581314b1a7484c4b2db;hb=bfe5696e67dce3298287793e22a0acc39f952f77;hp=156de8e2b94492f49205904f7d9eae6f2e8a0aad;hpb=09a3b3a75ff3b6cb6760b9034b093b6d49923b00;p=gapil.git diff --git a/fileadv.tex b/fileadv.tex index 156de8e..6f87c7b 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -2100,21 +2100,49 @@ restituisce dati simili. Come per \struct{siginfo\_t} i campi che vengono 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 @@ -3447,7 +3475,7 @@ eseguire la mappatura in memoria di un file, \end{functions} La funzione richiede di mappare in memoria la sezione del file \param{fd} a -partire da \param{offset} per \param{lenght} byte, preferibilmente +partire da \param{offset} per \param{length} byte, preferibilmente all'indirizzo \param{start}. Il valore di \param{offset} deve essere un multiplo della dimensione di una pagina di memoria. @@ -3608,7 +3636,7 @@ verr bordo della pagina successiva. In questo caso è possibile accedere a quella zona di memoria che eccede le -dimensioni specificate da \param{lenght}, senza ottenere un \const{SIGSEGV} +dimensioni specificate da \param{length}, senza ottenere un \const{SIGSEGV} poiché essa è presente nello spazio di indirizzi del processo, anche se non è mappata sul file. Il comportamento del sistema è quello di restituire un valore nullo per quanto viene letto, e di non riportare su file quanto viene @@ -4011,9 +4039,9 @@ le opportune strategie di ottimizzazione. Il suo prototipo La sezione di memoria sulla quale si intendono fornire le indicazioni deve essere indicata con l'indirizzo iniziale \param{start} e l'estensione -\param{lenght}, il valore di \param{start} deve essere allineato, +\param{length}, il valore di \param{start} deve essere allineato, mentre \param{length} deve essere un numero positivo.\footnote{la versione di - Linux consente anche un valore nullo per \param{lenght}, inoltre se una + Linux consente anche un valore nullo per \param{length}, inoltre se una parte dell'intervallo non è mappato in memoria l'indicazione viene comunque applicata alle restanti parti, anche se la funzione ritorna un errore di \errval{ENOMEM}.} L'indicazione viene espressa dall'argomento \param{advice}