La prima modalità di \textit{file locking} che è stata implementata nei
sistemi unix-like è quella che viene usualmente chiamata \textit{advisory
locking},\footnote{Stevens in \cite{APUE} fa riferimento a questo argomento
La prima modalità di \textit{file locking} che è stata implementata nei
sistemi unix-like è quella che viene usualmente chiamata \textit{advisory
locking},\footnote{Stevens in \cite{APUE} fa riferimento a questo argomento
\acr{glibc}; nelle pagine di manuale si parla di \textit{discrectionary file
lock} per \func{fcntl} e di \textit{advisory locking} per \func{flock},
mentre questo nome viene usato da Stevens per riferirsi al \textit{file
\acr{glibc}; nelle pagine di manuale si parla di \textit{discrectionary file
lock} per \func{fcntl} e di \textit{advisory locking} per \func{flock},
mentre questo nome viene usato da Stevens per riferirsi al \textit{file
Il comportamento seguito in questo caso è che la funzione ha successo ed
esegue l'operazione richiesta sulla regione indicata; è compito del kernel
preoccuparsi di accorpare o dividere le voci nella lista dei \textit{file
Il comportamento seguito in questo caso è che la funzione ha successo ed
esegue l'operazione richiesta sulla regione indicata; è compito del kernel
preoccuparsi di accorpare o dividere le voci nella lista dei \textit{file
tutti i sistemi che supportano i socket, compreso le varianti di System V ed
inserita in POSIX.1-2001; il suo prototipo è:\footnote{l'header
\texttt{sys/select.h} è stato introdotto con POSIX.1-2001, è ed presente con
tutti i sistemi che supportano i socket, compreso le varianti di System V ed
inserita in POSIX.1-2001; il suo prototipo è:\footnote{l'header
\texttt{sys/select.h} è stato introdotto con POSIX.1-2001, è ed presente con
- le \acr{glibc} a partire dalla versione 2.0, in precedenza, con le
- \acr{libc4} e le \acr{libc5}, occorreva includere \texttt{sys/time.h},
+ la \acr{glibc} a partire dalla versione 2.0, in precedenza, con le
+ \acr{libc4} e \acr{libc5}, occorreva includere \texttt{sys/time.h},
ricalcolano \param{timeout} tutte le volte. In genere questa caratteristica è
disponibile nei sistemi che derivano da System V e non è disponibile per
quelli che derivano da BSD; lo standard POSIX.1-2001 non permette questo
ricalcolano \param{timeout} tutte le volte. In genere questa caratteristica è
disponibile nei sistemi che derivano da System V e non è disponibile per
quelli che derivano da BSD; lo standard POSIX.1-2001 non permette questo
passando alla \textit{system call} una copia dell'argomento \param{timeout}.
Uno dei problemi che si presentano con l'uso di \func{select} è che il suo
passando alla \textit{system call} una copia dell'argomento \param{timeout}.
Uno dei problemi che si presentano con l'uso di \func{select} è che il suo
vengano dichiarate nell'header \headfiled{sys/select.h}, che sostituisce i
precedenti, ed inoltre aggiunge a \func{select} una nuova funzione
\funcd{pselect},\footnote{il supporto per lo standard POSIX 1003.1-2001, ed
vengano dichiarate nell'header \headfiled{sys/select.h}, che sostituisce i
precedenti, ed inoltre aggiunge a \func{select} una nuova funzione
\funcd{pselect},\footnote{il supporto per lo standard POSIX 1003.1-2001, ed
senza l'argomento \param{sigmask}, la definizione corretta è presente dalle
\acr{glibc} 2.1-2.2.1 se si è definito \macro{\_GNU\_SOURCE} e nelle
\acr{glibc} 2.2.2-2.2.4 se si è definito \macro{\_XOPEN\_SOURCE} con valore
senza l'argomento \param{sigmask}, la definizione corretta è presente dalle
\acr{glibc} 2.1-2.2.1 se si è definito \macro{\_GNU\_SOURCE} e nelle
\acr{glibc} 2.2.2-2.2.4 se si è definito \macro{\_XOPEN\_SOURCE} con valore
struttura \struct{timespec} (vedi fig.~\ref{fig:sys_timespec_struct}) per
indicare con maggiore precisione il timeout e non ne aggiorna il valore in
caso di interruzione. In realtà anche in questo caso la \textit{system call}
struttura \struct{timespec} (vedi fig.~\ref{fig:sys_timespec_struct}) per
indicare con maggiore precisione il timeout e non ne aggiorna il valore in
caso di interruzione. In realtà anche in questo caso la \textit{system call}
\acr{glibc} modifica questo comportamento passando alla \textit{system call}
una variabile locale, in modo da mantenere l'aderenza allo standard POSIX che
richiede che il valore di \param{timeout} non sia modificato.
\acr{glibc} modifica questo comportamento passando alla \textit{system call}
una variabile locale, in modo da mantenere l'aderenza allo standard POSIX che
richiede che il valore di \param{timeout} non sia modificato.
\param{sigmask} permette di riabilitare la ricezione il segnale
contestualmente all'esecuzione della funzione,\footnote{in Linux però, fino al
kernel 2.6.16, non era presente la relativa \textit{system call}, e la
\param{sigmask} permette di riabilitare la ricezione il segnale
contestualmente all'esecuzione della funzione,\footnote{in Linux però, fino al
kernel 2.6.16, non era presente la relativa \textit{system call}, e la
\texttt{man select\_tut}) per cui la possibilità di \textit{race condition}
permaneva; in tale situazione si può ricorrere ad una soluzione alternativa,
chiamata \itindex{self-pipe~trick} \textit{self-pipe trick}, che consiste
\texttt{man select\_tut}) per cui la possibilità di \textit{race condition}
permaneva; in tale situazione si può ricorrere ad una soluzione alternativa,
chiamata \itindex{self-pipe~trick} \textit{self-pipe trick}, che consiste
risultati illustrati in precedenza. Come nel caso di \func{pselect} la
\textit{system call} che implementa \func{ppoll} restituisce, se la funzione
viene interrotta da un segnale, il tempo mancante in \param{timeout}, e come
risultati illustrati in precedenza. Come nel caso di \func{pselect} la
\textit{system call} che implementa \func{ppoll} restituisce, se la funzione
viene interrotta da un segnale, il tempo mancante in \param{timeout}, e come
questo comportamento non modificando mai il valore di \param{timeout} anche se
in questo caso non esiste nessuno standard che richieda questo comportamento.
questo comportamento non modificando mai il valore di \param{timeout} anche se
in questo caso non esiste nessuno standard che richieda questo comportamento.
servizio è chiamata \textit{epoll},\footnote{l'interfaccia è stata creata da
Davide Libenzi, ed è stata introdotta per la prima volta nel kernel 2.5.44,
ma la sua forma definitiva è stata raggiunta nel kernel 2.5.66, il supporto
servizio è chiamata \textit{epoll},\footnote{l'interfaccia è stata creata da
Davide Libenzi, ed è stata introdotta per la prima volta nel kernel 2.5.44,
ma la sua forma definitiva è stata raggiunta nel kernel 2.5.66, il supporto
sono state in discussione altre interfacce con le quali effettuare lo stesso
tipo di operazioni; \textit{epoll} è in grado di operare sia in modalità
\textit{level triggered} che \textit{edge triggered}.
sono state in discussione altre interfacce con le quali effettuare lo stesso
tipo di operazioni; \textit{epoll} è in grado di operare sia in modalità
\textit{level triggered} che \textit{edge triggered}.
-La prima versione di \textit{epoll} prevedeva l'apertura di uno speciale file
-di dispositivo, \texttt{/dev/epoll}, per ottenere un file descriptor da
+La prima versione di \textit{epoll} prevedeva l'uso di uno speciale file di
+dispositivo, \texttt{/dev/epoll}, per ottenere un file descriptor da
utilizzare con le funzioni dell'interfaccia ma poi si è passati all'uso di
apposite \textit{system call}. Il primo passo per usare l'interfaccia di
\textit{epoll} è pertanto quello ottenere detto file descriptor chiamando una
utilizzare con le funzioni dell'interfaccia ma poi si è passati all'uso di
apposite \textit{system call}. Il primo passo per usare l'interfaccia di
\textit{epoll} è pertanto quello ottenere detto file descriptor chiamando una
La funzione di sistema che permette di abilitare la ricezione dei segnali
tramite file descriptor è \funcd{signalfd},\footnote{in realtà quella
La funzione di sistema che permette di abilitare la ricezione dei segnali
tramite file descriptor è \funcd{signalfd},\footnote{in realtà quella
\acr{glibc} 2.8 che non supporta l'argomento \texttt{flags}, ed una seconda
versione, \funcm{signalfd4}, introdotta con il kernel 2.6.27 e che è quella
\acr{glibc} 2.8 che non supporta l'argomento \texttt{flags}, ed una seconda
versione, \funcm{signalfd4}, introdotta con il kernel 2.6.27 e che è quella
potranno essere ricevuti normalmente una volta che si rimuova il blocco
imposto con \func{sigprocmask}.
potranno essere ricevuti normalmente una volta che si rimuova il blocco
imposto con \func{sigprocmask}.
-Oltre che con le funzioni dell'\textit{I/O multiplexing} l'uso del file
-descriptor restituito da \func{signalfd} cerca di seguire la semantica di un
-sistema unix-like anche con altre \textit{system call}; in particolare esso
+Oltre a poter essere usato con le funzioni dell'\textit{I/O multiplexing}, il
+file descriptor restituito da \func{signalfd} cerca di seguire la semantica di
+un sistema unix-like anche con altre \textit{system call}; in particolare esso
resta aperto (come ogni altro file descriptor) attraverso una chiamata ad
\func{exec}, a meno che non lo si sia creato con il flag di
\const{SFD\_CLOEXEC} o si sia successivamente impostato il
resta aperto (come ogni altro file descriptor) attraverso una chiamata ad
\func{exec}, a meno che non lo si sia creato con il flag di
\const{SFD\_CLOEXEC} o si sia successivamente impostato il
-Il contenuto di \struct{signalfd\_siginfo} ricalca da vicino quella della
-analoga struttura \struct{siginfo\_t} (illustrata in
+Il contenuto di \struct{signalfd\_siginfo} ricalca da vicino quella
+dell'analoga struttura \struct{siginfo\_t} (illustrata in
fig.~\ref{fig:sig_siginfo_t}) usata dall'interfaccia ordinaria dei segnali, e
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à
fig.~\ref{fig:sig_siginfo_t}) usata dall'interfaccia ordinaria dei segnali, e
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à
interfaccia è stata introdotta in forma considerata difettosa con il kernel
2.6.22, per cui è stata immediatamente tolta nel successivo 2.6.23 e
reintrodotta in una forma considerata adeguata nel kernel 2.6.25, il
interfaccia è stata introdotta in forma considerata difettosa con il kernel
2.6.22, per cui è stata immediatamente tolta nel successivo 2.6.23 e
reintrodotta in una forma considerata adeguata nel kernel 2.6.25, il
2.8.6, la versione del kernel 2.6.22, presente solo su questo kernel, non è
supportata e non deve essere usata.} La prima funzione di sistema prevista,
quella che consente di creare un timer, è \funcd{timerfd\_create}, il cui
2.8.6, la versione del kernel 2.6.22, presente solo su questo kernel, non è
supportata e non deve essere usata.} La prima funzione di sistema prevista,
quella che consente di creare un timer, è \funcd{timerfd\_create}, il cui
In generale questa interfaccia è completamente astratta e può essere
implementata sia direttamente nel kernel che in \textit{user space} attraverso
l'uso di \textit{thread}. Per le versioni del kernel meno recenti esiste una
In generale questa interfaccia è completamente astratta e può essere
implementata sia direttamente nel kernel che in \textit{user space} attraverso
l'uso di \textit{thread}. Per le versioni del kernel meno recenti esiste una
a partire dalla versione 2.1, che è realizzata completamente in \textit{user
space}, ed è accessibile linkando i programmi con la libreria
\file{librt}. A partire dalla versione 2.5.32 è stato introdotto nel kernel
a partire dalla versione 2.1, che è realizzata completamente in \textit{user
space}, ed è accessibile linkando i programmi con la libreria
\file{librt}. A partire dalla versione 2.5.32 è stato introdotto nel kernel
-(illustrata in in fig.~\ref{fig:struct_sigevent}) che serve a specificare il
-modo in cui si vuole che venga effettuata la notifica del completamento delle
+(illustrata in fig.~\ref{fig:struct_sigevent}) che serve a specificare il modo
+in cui si vuole che venga effettuata la notifica del completamento delle
operazioni richieste; per la trattazione delle modalità di utilizzo della
stessa si veda quanto già visto in proposito in sez.~\ref{sec:sig_timer_adv}.
operazioni richieste; per la trattazione delle modalità di utilizzo della
stessa si veda quanto già visto in proposito in sez.~\ref{sec:sig_timer_adv}.
con \const{MAP\_PRIVATE}.\\
\const{MAP\_STACK} & Al momento è ignorato, è stato fornito (dal kernel
2.6.27) a supporto della implementazione dei
con \const{MAP\_PRIVATE}.\\
\const{MAP\_STACK} & Al momento è ignorato, è stato fornito (dal kernel
2.6.27) a supporto della implementazione dei
- thread nelle \acr{glibc}, per allocare memoria in
- uno spazio utilizzabile come \textit{stack} per le
- architetture hardware che richiedono un
- trattamento speciale di quest'ultimo.\\
+ \textit{thread} nella \acr{glibc}, per allocare
+ memoria in uno spazio utilizzabile come
+ \textit{stack} per le architetture hardware che
+ richiedono un trattamento speciale di
+ quest'ultimo.\\
\constd{MAP\_UNINITIALIZED}& Specifico per i sistemi embedded ed
utilizzabile dal kernel 2.6.33 solo se è stata
abilitata in fase di compilazione dello stesso
\constd{MAP\_UNINITIALIZED}& Specifico per i sistemi embedded ed
utilizzabile dal kernel 2.6.33 solo se è stata
abilitata in fase di compilazione dello stesso
L'argomento \param{advice} invece può assumere solo i valori indicati in
tab.~\ref{tab:posix_madvise_advice_values}, che riflettono gli analoghi di
\func{madvise}, con lo stesso effetto per tutti tranne
L'argomento \param{advice} invece può assumere solo i valori indicati in
tab.~\ref{tab:posix_madvise_advice_values}, che riflettono gli analoghi di
\func{madvise}, con lo stesso effetto per tutti tranne
\const{POSIX\_MADV\_DONTNEED} viene ignorato, in quanto l'uso del
corrispondente \const{MADV\_DONTNEED} di \func{madvise} ha, per la semantica
imperativa, l'effetto immediato di far liberare le pagine da parte del kernel,
\const{POSIX\_MADV\_DONTNEED} viene ignorato, in quanto l'uso del
corrispondente \const{MADV\_DONTNEED} di \func{madvise} ha, per la semantica
imperativa, l'effetto immediato di far liberare le pagine da parte del kernel,
-Nel caso di Linux il limite di sistema è di 1024, però se si usano le
-\acr{glibc} queste forniscono un \textit{wrapper} per le \textit{system call}
+Nel caso di Linux il limite di sistema è di 1024, però se si usa la
+\acr{glibc} essa fornisce un \textit{wrapper} per le \textit{system call}
che si accorge se una operazione supererà il precedente limite, in tal caso i
dati verranno letti o scritti con le usuali \func{read} e \func{write} usando
che si accorge se una operazione supererà il precedente limite, in tal caso i
dati verranno letti o scritti con le usuali \func{read} e \func{write} usando
contenere tutti i dati indicati da \param{vector}. L'operazione avrà successo
ma si perderà l'atomicità del trasferimento da e verso la destinazione finale.
contenere tutti i dati indicati da \param{vector}. L'operazione avrà successo
ma si perderà l'atomicità del trasferimento da e verso la destinazione finale.
-% http://lwn.net/Articles/670231/ ed il flag RWF_HIPRI
+% http://lwn.net/Articles/670231/ ed il flag RWF_HIPRI, anche l'aggiunta del
+% flag RWF_APPEND a pwritev2 con il kernel 4.16, vedi
+% https://lwn.net/Articles/746129/
La prima funzione che è stata ideata per ottimizzare il trasferimento dei dati
fra due file descriptor è \func{sendfile}.\footnote{la funzione è stata
La prima funzione che è stata ideata per ottimizzare il trasferimento dei dati
fra due file descriptor è \func{sendfile}.\footnote{la funzione è stata
2.1.} La funzione è presente in diverse versioni di Unix (la si ritrova ad
esempio in FreeBSD, HPUX ed altri Unix) ma non è presente né in POSIX.1-2001
né in altri standard (pertanto si eviti di utilizzarla se si devono scrivere
2.1.} La funzione è presente in diverse versioni di Unix (la si ritrova ad
esempio in FreeBSD, HPUX ed altri Unix) ma non è presente né in POSIX.1-2001
né in altri standard (pertanto si eviti di utilizzarla se si devono scrivere
che l'uso di \func{truncate} per estendere un file creerebbe soltanto uno
\textit{sparse file} (vedi sez.~\ref{sec:file_lseek}) senza una effettiva
allocazione dello spazio disco.} In realtà questa è la modalità con cui la
che l'uso di \func{truncate} per estendere un file creerebbe soltanto uno
\textit{sparse file} (vedi sez.~\ref{sec:file_lseek}) senza una effettiva
allocazione dello spazio disco.} In realtà questa è la modalità con cui la
cui la funzione costituiva in sostanza soltanto una standardizzazione delle
modalità di esecuzione di questo tipo di allocazioni.
cui la funzione costituiva in sostanza soltanto una standardizzazione delle
modalità di esecuzione di questo tipo di allocazioni.
stato introdotto solo a partire dal kernel 2.6.25.} che consente di
realizzare direttamente all'interno del kernel l'allocazione dello spazio
disco così da poter realizzare una versione di \func{posix\_fallocate} con
stato introdotto solo a partire dal kernel 2.6.25.} che consente di
realizzare direttamente all'interno del kernel l'allocazione dello spazio
disco così da poter realizzare una versione di \func{posix\_fallocate} con
come funzione di libreria,\footnote{pertanto poteva essere invocata soltanto
in maniera indiretta con l'ausilio di \func{syscall}, vedi
sez.~\ref{sec:proc_syscall}, come \code{long fallocate(int fd, int mode,
come funzione di libreria,\footnote{pertanto poteva essere invocata soltanto
in maniera indiretta con l'ausilio di \func{syscall}, vedi
sez.~\ref{sec:proc_syscall}, come \code{long fallocate(int fd, int mode,