\hline
\const{POLLIN} & È possibile la lettura.\\
\const{POLLRDNORM}& Sono disponibili in lettura dati normali.\\
- \const{POLLRDBAND}& Sono disponibili in lettura dati prioritari. \\
+ \const{POLLRDBAND}& Sono disponibili in lettura dati prioritari.\\
\const{POLLPRI} & È possibile la lettura di \itindex{out-of-band} dati
urgenti.\\
\hline
\const{POLLOUT} & È possibile la scrittura immediata.\\
- \const{POLLWRNORM}& È possibile la scrittura di dati normali. \\
- \const{POLLWRBAND}& È possibile la scrittura di dati prioritari. \\
+ \const{POLLWRNORM}& È possibile la scrittura di dati normali.\\
+ \const{POLLWRBAND}& È possibile la scrittura di dati prioritari.\\
\hline
\const{POLLERR} & C'è una condizione di errore.\\
\const{POLLHUP} & Si è verificato un hung-up.\\
\textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \const{EPOLL\_CTL\_ADD}& aggiunge un nuovo file descriptor da osservare
+ \const{EPOLL\_CTL\_ADD}& Aggiunge un nuovo file descriptor da osservare
\param{fd} alla lista dei file descriptor
controllati tramite \param{epfd}, in
\param{event} devono essere specificate le
modalità di osservazione.\\
- \const{EPOLL\_CTL\_MOD}& modifica le modalità di osservazione del file
+ \const{EPOLL\_CTL\_MOD}& Modifica le modalità di osservazione del file
descriptor \param{fd} secondo il contenuto di
\param{event}.\\
- \const{EPOLL\_CTL\_DEL}& rimuove il file descriptor \param{fd} dalla lista
+ \const{EPOLL\_CTL\_DEL}& Rimuove il file descriptor \param{fd} dalla lista
dei file controllati tramite \param{epfd}.\\
\hline
\end{tabular}
sia scaduto il tempo massimo impostato con \param{timeout}. Per quest'ultimo,
oltre ad un numero di millisecondi, si può utilizzare il valore nullo, che
indica di non attendere e ritornare immediatamente,\footnote{anche in questo
- caso il valore di ritorno sarà nullo.} o $-1$, che indica un'attesa
-indefinita. L'argomento \param{maxevents} dovrà invece essere sempre un intero
-positivo.
+ caso il valore di ritorno sarà nullo.} o il valore $-1$, che indica
+un'attesa indefinita. L'argomento \param{maxevents} dovrà invece essere sempre
+un intero positivo.
Come accennato la funzione restituisce i suoi risultati nel vettore di
strutture \struct{epoll\_event} puntato da \param{events}; in tal caso nel
campo \param{events} di ciascuna di esse saranno attivi i flag relativi agli
eventi accaduti, mentre nel campo \var{data} sarà restituito il valore che era
-stato impostato (per il file descriptor per cui si è verificato l'evento)
-quando questo era stato registrato con le operazioni \const{EPOLL\_CTL\_MOD} o
-\const{EPOLL\_CTL\_ADD}.
+stato impostato per il file descriptor per cui si è verificato l'evento quando
+questo era stato registrato con le operazioni \const{EPOLL\_CTL\_MOD} o
+\const{EPOLL\_CTL\_ADD}, in questo modo il campo \var{data} consente di
+identificare il file descriptor.\footnote{ed è per questo che, come accennato,
+ è consuetudine usare per \var{data} il valore del file descriptor stesso.}
Si ricordi che le occasioni per cui \func{epoll\_wait} ritorna dipendono da
come si è impostata la modalità di osservazione (se \textit{level triggered} o
\textit{edge triggered}) del singolo file descriptor. L'interfaccia assicura
che se arrivano più eventi fra due chiamate successive ad \func{epoll\_wait}
-questi vengano combinati. Inoltre qualora su di esso fossero presenti eventi
-non ancora notificati, e si effettuasse una modifica dell'osservazione con
-\const{EPOLL\_CTL\_MOD} questi verrebbero riletti alla luce delle modifiche.
+questi vengano combinati. Inoltre qualora su un file descriptor fossero
+presenti eventi non ancora notificati, e si effettuasse una modifica
+dell'osservazione con \const{EPOLL\_CTL\_MOD} questi verrebbero riletti alla
+luce delle modifiche.
Si tenga presente infine che con l'uso della modalità \textit{edge triggered}
il ritorno di \func{epoll\_wait} indica un file descriptor è pronto e resterà
-tale fintanto che non si sono completamente esaurite le operazioni su di esso,
-questo può essere rilevato con un errore di \errcode{EAGAIN} in una
-\func{read} o una \func{write},\footnote{è opportuno ricordare ancora una
- volta che l'uso dell'I/O multiplexing richiede di operare sui file in
- modalità non bloccante.} ma anche con il fatto che sono stati restituiti
-meno dati di quelli richiesti.
-
-Come per le precedenti \func{select} e \func{poll}, essendo queste funzioni
-utiilizzate prevalentemente con i server di rete, tratteremo degli esempi del
-loro più avanti, nella trattazione dei socket, ed in particolare in
+tale fintanto che non si sono completamente esaurite le operazioni su di esso.
+Questa condizione viene generalmente rilevata dall'occorrere di un errore di
+\errcode{EAGAIN} al ritorno di una \func{read} o una \func{write},\footnote{è
+ opportuno ricordare ancora una volta che l'uso dell'I/O multiplexing
+ richiede di operare sui file in modalità non bloccante.} ma questa non è la
+sola modalità possibile, ad esempio la condizione può essere riconosciuta
+anche con il fatto che sono stati restituiti meno dati di quelli richiesti.
+
+Come le precedenti \func{select} e \func{poll}, le funzioni dell'interfaccia
+di \textit{epoll} vengono utiilizzate prevalentemente con i server di rete,
+quando si devono tenere sotto osservazione un gran numero di socket; per
+questo motivo rimandiamo di nuovo la trattazione di un esempio concreto a
+quando avremo esaminato in dettaglio le caratteristiche dei socket, in
+particolare si potrà trovare un programma che utilizza questa interfaccia in
sez.~\ref{sec:TCP_sock_multiplexing}.
impostare la lunghezza della coda dei segnali real-time ad una dimensione
identica al valore massimo del numero di file descriptor
utilizzabili.\footnote{vale a dire impostare il contenuto di
- \texttt{/proc/sys/kernel/rtsig-max} allo stesso valore di quello di
+ \texttt{/proc/sys/kernel/rtsig-max} allo stesso valore del contenuto di
\texttt{/proc/sys/fs/file-max}.}
% TODO fare esempio che usa O_ASYNC
\cite{UnixFAQ} viene anche chiamata una \textit{Frequently Unanswered
Question}.} è che nell'architettura classica di Unix questo non è
possibile. Al contrario di altri sistemi operativi infatti un kernel unix-like
-non prevede alcun meccanismo per cui un processo possa essere
+classico non prevedeva alcun meccanismo per cui un processo possa essere
\textsl{notificato} di eventuali modifiche avvenute su un file. Questo è il
motivo per cui i demoni devono essere \textsl{avvisati} in qualche
modo\footnote{in genere questo vien fatto inviandogli un segnale di
- \const{SIGHUP} che, per convenzione adottata dalla gran parte di detti
+ \const{SIGHUP} che, per una convenzione adottata dalla gran parte di detti
programmi, causa la rilettura della configurazione.} se il loro file di
configurazione è stato modificato, perché possano rileggerlo e riconoscere le
modifiche.
Questa scelta è stata fatta perché provvedere un simile meccanismo a livello
-generale comporterebbe un notevole aumento di complessità dell'architettura
-della gestione dei file, per fornire una funzionalità necessaria soltanto in
-casi particolari. Dato che all'origine di Unix i soli programmi che potevano
-avere una tale esigenza erano i demoni, attenendosi a uno dei criteri base
-della progettazione, che era di far fare al kernel solo le operazioni
-strettamente necessarie e lasciare tutto il resto a processi in user space,
-non era stata prevista nessuna funzionalità di notifica.
+generico per qualunque file comporterebbe un notevole aumento di complessità
+dell'architettura della gestione dei file, il tutto per fornire una
+funzionalità che serve soltanto in alcuni casi particolari. Dato che
+all'origine di Unix i soli programmi che potevano avere una tale esigenza
+erano i demoni, attenendosi a uno dei criteri base della progettazione, che
+era di far fare al kernel solo le operazioni strettamente necessarie e
+lasciare tutto il resto a processi in user space, non era stata prevista
+nessuna funzionalità di notifica.
Visto però il crescente interesse nei confronti di una funzionalità di questo
-tipo (molto richiesta specialmente nello sviluppo dei programmi ad interfaccia
-grafica) sono state successivamente introdotte delle estensioni che
+tipo, che è molto richiesta specialmente nello sviluppo dei programmi ad
+interfaccia grafica, quando si deve presentare all'utente lo stato del
+filesystem, sono state successivamente introdotte delle estensioni che
permettessero la creazione di meccanismi di notifica più efficienti dell'unica
soluzione disponibile con l'interfaccia tradizionale, che è quella del
\itindex{polling} \textit{polling}.
directory vengono modificati, che è quanto necessario ad esempio ai programma
di gestione dei file dei vari desktop grafici.
-Per risolvere questo problema è stata allora creata un'altra interfaccia,
-chiamata \textit{dnotify}, che consente di richiedere una notifica quando una
-directory, o di uno qualunque dei file in essa contenuti, viene modificato.
-Come per i \textit{file lease} la notifica avviene di default attraverso il
-segnale \const{SIGIO}, ma se ne può utilizzare un altro. Inoltre si potrà
-ottenere nel gestore del segnale il file descriptor che è stato modificato
-tramite il contenuto della struttura \struct{siginfo\_t}.
+Per risolvere questo problema a partire dal kernel 2.4 è stata allora creata
+un'altra interfaccia,\footnote{si ricordi che anche questa è una interfaccia
+ specifica di Linux che deve essere evitata se si vogliono scrivere progammi
+ portabili, e che le funzionalità illustrate sono disponibili soltato se è
+ stata definita la macro \macro{\_GNU\_SOURCE}.} chiamata \textit{dnotify},
+che consente di richiedere una notifica quando una directory, o uno qualunque
+dei file in essa contenuti, viene modificato. Come per i \textit{file lease}
+la notifica avviene di default attraverso il segnale \const{SIGIO}, ma se ne
+può utilizzare un altro.\footnote{e di nuovo, per le ragioni già esposte in
+ precedenza, è opportuno che si utilizzino dei segnali real-time.} Inoltre,
+come in precedenza, si potrà ottenere nel gestore del segnale il file
+descriptor che è stato modificato tramite il contenuto della struttura
+\struct{siginfo\_t}.
\index{file!lease|)}
\const{DN\_ATTRIB} & È stato modificato un attributo di un file con
l'esecuzione di una fra \func{chown}, \func{chmod},
\func{utime}.\\
- \const{DN\_MULTISHOT}& richiede una notifica permanente di tutti gli
+ \const{DN\_MULTISHOT}& Richiede una notifica permanente di tutti gli
eventi.\\
\hline
\end{tabular}
Il maggiore problema di \textit{dnotify} è quello della scalabilità: si deve
usare un file descriptor per ciascuna directory che si vuole tenere sotto
-controllo, il che porta facilmente ad un eccesso di file aperti. Inoltre
-quando la directory è su un dispositivo rimovibile, mantenere un file
-descriptor aperto comporta l'impossibilità di smontare il dispositivo e
-rimuoverlo, complicando la gestione.
-
-Un secondo problema è che l'interfaccia consente solo di tenere sotto
-controllo il contenuto di una directory; la modifica di un file viene
-segnalata, ma poi devo verificare quale è. Infine l'uso dei segnali come
-interfaccia di notifica comporta tutti i problemi di gestione visti in
-sez.~\ref{sec:sig_management} e sez.~\ref{sec:sig_control}, e per questo in
-generale quella di \textit{dnotify} viene considerata una interfaccia di
-usabilità problematica.
+controllo, il che porta facilmente ad avere un eccesso di file aperti. Inoltre
+quando la directory che si controlla è all'interno di un dispositivo
+rimovibile, mantenere il relativo file descriptor aperto comporta
+l'impossibilità di smontare il dispositivo e di rimuoverlo, il che in genere
+complica notevolmente la gestione dell'uso di questi dispositivi.
+
+Un altro problema è che l'interfaccia di \textit{dnotify} consente solo di
+tenere sotto controllo il contenuto di una directory; la modifica di un file
+viene segnalata, ma poi è necessario verificare di quale file si tratta
+(operazione che può essere molto onerosa quando una directory contiene un gran
+numero di file). Infine l'uso dei segnali come interfaccia di notifica
+comporta tutti i problemi di gestione visti in sez.~\ref{sec:sig_management} e
+sez.~\ref{sec:sig_control}. Per tutta questa serie di motivi in generale
+quella di \textit{dnotify} viene considerata una interfaccia di usabilità
+problematica.
\index{file!dnotify|)}
-Per questa serie di motivi, a partire dal kernel 2.6.13, è stata introdotta
-una nuova interfaccia per l'osservazione delle modifiche a file o directory,
-chiamata \textit{inotify}.\footnote{le corrispondenti funzioni di interfaccia
- sono state introdotte nelle glibc 2.4.} Questa è una interfaccia specifica
-di Linux (pertanto non deve essere usata se si devono scrivere programmi
-portabili), ed è basata sull'uso di una coda di notifica degli eventi
-associata ad un singolo file descriptor, risolvendo così il principale
-problema di \itindex{dnotify} \textit{dnotify}. La coda viene creata
-attraverso la funzione \funcd{inotify\_init}, il cui prototipo è:
+Per risolvere i problemi appena illustrati, a partire dal kernel 2.6.13, è
+stata introdotta una nuova interfaccia per l'osservazione delle modifiche a
+file o directory, chiamata \textit{inotify}.\footnote{le corrispondenti
+ funzioni di interfaccia sono state introdotte nelle glibc 2.4.} Anche questa
+è una interfaccia specifica di Linux (pertanto non deve essere usata se si
+devono scrivere programmi portabili), ed è basata sull'uso di una coda di
+notifica degli eventi associata ad un singolo file descriptor, risolvendo così
+il principale problema di \itindex{dnotify} \textit{dnotify}. La coda viene
+creata attraverso la funzione \funcd{inotify\_init}, il cui prototipo è:
\begin{prototype}{sys/inotify.h}
{int inotify\_init(void)}
La funzione non prende alcun argomento, e restituisce un file descriptor
associato alla coda, attraverso il quale verranno effettuate le operazioni di
notifica. Si tratta di un file descriptor speciale, che non è associato a
-nessun file, ma che viene utilizzato per notificare gli eventi che si sono
-posti in osservazione all'applicazione che usa l'interfaccia di
+nessun file su disco, ma che viene utilizzato per notificare gli eventi che si
+sono posti in osservazione all'applicazione che usa l'interfaccia di
\textit{inotify}. Dato che questo file descriptor non è associato a nessun
-file o directory, questo consente di evitare l'inconveniente di non poter
-smontare un filesystem i cui file sono tenuti sotto osservazione.\footnote{ed
- una delle caratteristiche dell'interfaccia di \textit{inotify} è proprio
- quella di notificare il fatto che il filesystem su cui si trova il file o la
- directory osservata è stato smontato.}
+file o directory, questo consente anche di evitare l'inconveniente di non
+poter smontare un filesystem i cui file sono tenuti sotto
+osservazione.\footnote{anzi, una delle capacità dell'interfaccia di
+ \textit{inotify} è proprio quella di notificare il fatto che il filesystem
+ su cui si trova il file o la directory osservata è stato smontato.}
Inoltre trattandosi di un file descriptor a tutti gli effetti, esso potrà
-essere utilizzato come argomento per le funzioni \func{select} e \func{poll},
-e siccome gli eventi vengono notificati come dati disponibili in lettura sul
-file descriptor, dette funzioni ritorneranno tutte le volte che si avrà un
-evento di notifica. Così, invece di dover utilizzare i segnali, si potrà
-gestire l'osservazione delle modifiche con l'\textit{I/O multiplexing},
-utilizzando secondo le modalità illustrate in
+essere utilizzato come argomento per le funzioni \func{select} e \func{poll} e
+con l'interfaccia di \textit{epoll}, e siccome gli eventi vengono notificati
+come dati disponibili in lettura sul file descriptor, dette funzioni
+ritorneranno tutte le volte che si avrà un evento di notifica. Così, invece di
+dover utilizzare i segnali, si potrà gestire l'osservazione delle modifiche
+con l'\textit{I/O multiplexing}, utilizzando secondo le modalità illustrate in
sez.~\ref{sec:file_multiplexing}.
Infine l'interfaccia di \textit{inotify} consente di mettere sotto
\textbf{Valore} & & \textbf{Significato} \\
\hline
\hline
- \const{IN\_ACCESS} &$\bullet$& c'è stato accesso al file in
+ \const{IN\_ACCESS} &$\bullet$& C'è stato accesso al file in
lettura.\\
- \const{IN\_ATTRIB} &$\bullet$& ci sono stati cambiamenti sui dati
- dell'inode.\\
- \const{IN\_CLOSE\_WRITE} &$\bullet$& è stato chiuso un file aperto in
+ \const{IN\_ATTRIB} &$\bullet$& Ci sono stati cambiamenti sui dati
+ dell'inode (o sugli attributi
+ estesi, vedi
+ sez.~\ref{sec:file_xattr}).\\
+ \const{IN\_CLOSE\_WRITE} &$\bullet$& È stato chiuso un file aperto in
scrittura.\\
- \const{IN\_CLOSE\_NOWRITE}&$\bullet$& è stato chiuso un file aperto in
+ \const{IN\_CLOSE\_NOWRITE}&$\bullet$& È stato chiuso un file aperto in
sola lettura.\\
- \const{IN\_CREATE} &$\bullet$& è stato creato un file o una
+ \const{IN\_CREATE} &$\bullet$& È stato creato un file o una
directory in una directory sotto
osservazione.\\
- \const{IN\_DELETE} &$\bullet$& è stato cancellato un file o una
+ \const{IN\_DELETE} &$\bullet$& È stato cancellato un file o una
directory in una directory sotto
osservazione.\\
- \const{IN\_DELETE\_SELF} & & è stato cancellato il file (o la
+ \const{IN\_DELETE\_SELF} & & È stato cancellato il file (o la
directory) sotto osservazione.\\
- \const{IN\_MODIFY} &$\bullet$& è stato modificato il file.\\
+ \const{IN\_MODIFY} &$\bullet$& È stato modificato il file.\\
\const{IN\_MOVE\_SELF} & & è stato rinominato il file (o la
directory) sotto osservazione.\\
- \const{IN\_MOVED\_FROM} &$\bullet$& un file è stato spostato fuori dalla
+ \const{IN\_MOVED\_FROM} &$\bullet$& Un file è stato spostato fuori dalla
directory sotto osservazione.\\
- \const{IN\_MOVED\_TO} &$\bullet$& un file è stato spostato nella
+ \const{IN\_MOVED\_TO} &$\bullet$& Un file è stato spostato nella
directory sotto osservazione.\\
- \const{IN\_OPEN} &$\bullet$& un file è stato aperto.\\
+ \const{IN\_OPEN} &$\bullet$& Un file è stato aperto.\\
\hline
\end{tabular}
\caption{Le costanti che identificano i valori per la maschera binaria
\label{tab:inotify_event_watch}
\end{table}
-Se non esiste nessun \textit{watch} per il file (o la directory) specificata
+Se non esiste nessun \textit{watch} per il file o la directory specificata
questo verrà creato per gli eventi specificati dall'argomento \param{mask},
altrimenti la funzione sovrascriverà le impostazioni precedenti. In caso di
successo la funzione ritorna un intero positivo, detto \textit{watch
da \param{start}, se questo non può essere usato
\func{mmap} fallisce. Se si imposta questo flag il
valore di \param{start} deve essere allineato
- alle dimensioni di una pagina. \\
+ alle dimensioni di una pagina.\\
\const{MAP\_SHARED} & I cambiamenti sulla memoria mappata vengono
riportati sul file e saranno immediatamente
visibili agli altri processi che mappano lo stesso
aggiornato fino alla chiamata di \func{msync} o
\func{munmap}), e solo allora le modifiche saranno
visibili per l'I/O convenzionale. Incompatibile
- con \const{MAP\_PRIVATE}. \\
+ con \const{MAP\_PRIVATE}.\\
\const{MAP\_PRIVATE} & I cambiamenti sulla memoria mappata non vengono
riportati sul file. Ne viene fatta una copia
privata cui solo il processo chiamante ha
salvate su swap in caso di necessità. Non è
specificato se i cambiamenti sul file originale
vengano riportati sulla regione
- mappata. Incompatibile con \const{MAP\_SHARED}. \\
+ mappata. Incompatibile con \const{MAP\_SHARED}.\\
\const{MAP\_DENYWRITE} & In Linux viene ignorato per evitare
\textit{DoS} \itindex{Denial~of~Service~(DoS)}
(veniva usato per segnalare che tentativi di
scrittura sul file dovevano fallire con
\errcode{ETXTBSY}).\\
- \const{MAP\_EXECUTABLE}& Ignorato. \\
+ \const{MAP\_EXECUTABLE}& Ignorato.\\
\const{MAP\_NORESERVE} & Si usa con \const{MAP\_PRIVATE}. Non riserva
delle pagine di swap ad uso del meccanismo del
\textit{copy on write} \itindex{copy~on~write}
modifiche fatte alla regione mappata, in
questo caso dopo una scrittura, se non c'è più
memoria disponibile, si ha l'emissione di
- un \const{SIGSEGV}. \\
+ un \const{SIGSEGV}.\\
\const{MAP\_LOCKED} & Se impostato impedisce lo swapping delle pagine
mappate.\\
\const{MAP\_GROWSDOWN} & Usato per gli \itindex{stack} stack. Indica
richiesto \const{MAP\_FIXED}.\\
\const{MAP\_POPULATE} & Esegue il \itindex{prefaulting}
\textit{prefaulting} delle pagine di memoria
- necessarie alla mappatura. \\
+ necessarie alla mappatura.\\
\const{MAP\_NONBLOCK} & Esegue un \textit{prefaulting} più limitato che
- non causa I/O.\footnotemark \\
+ non causa I/O.\footnotemark\\
% \const{MAP\_DONTEXPAND}& Non consente una successiva espansione dell'area
% mappata con \func{mremap}, proposto ma pare non
% implementato.\\
Permette di rimappare non linearmente un precedente \textit{memory mapping}.
- \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
+ \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
errore, nel qual caso \var{errno} assumerà uno dei valori:
\begin{errlist}
\item[\errcode{EINVAL}] Si è usato un valore non valido per uno degli
\itindend{memory~mapping}
-%\subsection{L'I/O diretto fra file descriptor}
-%\label{sec:file_sendfile_splice}
+\subsection{L'I/O diretto fra file descriptor}
+\label{sec:file_sendfile_splice}
-%Uno dei problemi
+Uno dei problemi che si presenta nella gestione dell'I/O è quello in cui si
+devono trasferire grandi quantità di dati da un file descriptor ed un altro;
+questo usualmente comporta la lettura dei dati dal primo file descriptor in un
+buffer in menoria, da cui essi vengono poi scritti sul secondo.
-%NdA è da finire, sul perché non è abilitata fra file vedi:
+Benché il kernel ottimizzi la gestione di questo processo quando si ha a che
+fare con file normali, in generale quando i dati da trasferire sono molti si
+pone il problema di effettuare trasferimenti di grandi quantità di dati da
+kernel space a user space e all'indietro, quando in realtà sarebbe molto più
+efficiente tenere tutto in kernel space. Tratteremo in questa sezione alcune
+funzioni specialistiche che permettono di ottimizzare le prestazioni in questo
+tipo di situazioni.
+
+La prima funzione che si pone l'obiettivo di ottimizzare il trasferimento dei
+dati fra due file descriptor è \funcd{sendfile}; la funzione è presente in
+diverse versioni di Unix,\footnote{la si ritrova ad esempio in FreeBSD, HPUX
+ ed altri Unix.} ma non è presente né in POSIX.1-2001 né in altri standard,
+per cui vengono utilizzati diversi prototipi e semantiche
+differenti;\footnote{pertanto si eviti di utilizzarla se si devono scrivere
+ programmi portabili.} nel caso di Linux il suo prototipo è:
+\begin{functions}
+ \headdecl{sys/sendfile.h}
+
+ \funcdecl{ssize\_t sendfile(int out\_fd, int in\_fd, off\_t *offset, size\_t
+ count)}
+
+ Copia dei dati da un file descriptor ad un altro.
+ \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
+ errore, nel qual caso \var{errno} assumerà uno dei valori:
+ \begin{errlist}
+ \item[\errcode{EAGAIN}] si è impostata la modalità non bloccante su
+ \param{out\_fd} e la scrittura si bloccherebbe.
+ \item[\errcode{EINVAL}] i file descriptor non sono validi, o sono bloccati
+ o una operazione di \func{mmap} non è disponibile per \param{in\_fd}.
+ \item[\errcode{EIO}] si è avuto un errore di lettura da \param{in\_fd}.
+ \item[\errcode{ENOMEM}] non c'è memoria sufficiente per la lettura da
+ \param{in\_fd}.
+ \end{errlist}
+ ed inoltre \errcode{EBADF} e \errcode{EFAULT}.
+ }
+\end{functions}
+
+
+%NdA è da finire, sul perché non è abilitata fra file vedi:
%\href{http://www.cs.helsinki.fi/linux/linux-kernel/2001-03/0200.html}
%{\texttt{http://www.cs.helsinki.fi/linux/linux-kernel/2001-03/0200.html}}
% http://kerneltrap.org/node/6505 e http://lwn.net/Articles/178199/ e
% http://lwn.net/Articles/179492/
% e http://en.wikipedia.org/wiki/Splice_(system_call)
+% e http://kerneltrap.org/node/6505
-%\subsection{Gestione avanzata del caching dei dati}
-%\label{sec:file_fadvise}
+\subsection{Gestione avanzata dell'accesso ai dati dei file}
+\label{sec:file_fadvise}
+
+Nell'uso generico dell'interfaccia per l'accesso al contenuto dei file le
+operazioni di lettura e scrittura non necessitano di nessun intervento di
+supervisione da parte dei programmi, si eseguirà una \func{read} o una
+\func{write}, i dati verranno passati al kernel che provvederà ad effettuare
+tutte le operazioni (e a gestire il \textit{caching} dei dati) per portarle a
+termine in quello che ritiene essere il modo più efficiente.
+
+Il problema è che il concetto di migliore efficienza inpiegato dal kernel è
+relativo all'uso generico, mentre esistono molti casi in cui ci sono esigenze
+specifiche dei singoli programmi, che avendo una conoscenza diretta di come
+verranno usati i file, possono necessitare di effettuare delle ottimizzazioni
+specifiche, relative alle proprie modalità di I/O sugli stessi. Tratteremo in
+questa sezione una serie funzioni che consentono ai programmi di ottimizzare
+il loro accesso ai dati dei file.
+
% TODO documentare \func{madvise}
% TODO documentare \func{mincore}
% TODO documentare \func{posix\_fadvise}
% vedi http://insights.oetiker.ch/linux/fadvise.html
% questo tread? http://www.ussg.iu.edu/hypermail/linux/kernel/0703.1/0032.html
+% TODO documentare \func{fallocate}
+% vedi http://lwn.net/Articles/226710/ e http://lwn.net/Articles/240571/
+
%\subsection{L'utilizzo delle porte di I/O}
%\label{sec:file_io_port}
\const{LOCK\_SH}& Richiede uno \textit{shared lock}. Più processi possono
mantenere un lock condiviso sullo stesso file.\\
\const{LOCK\_EX}& Richiede un \textit{exclusive lock}. Un solo processo
- alla volta può mantenere un lock esclusivo su un file. \\
+ alla volta può mantenere un lock esclusivo su un file.\\
\const{LOCK\_UN}& Sblocca il file.\\
\const{LOCK\_NB}& Non blocca la funzione quando il lock non è disponibile,
si specifica sempre insieme ad una delle altre operazioni
stringa con un carattere nullo e la tronca alla dimensione specificata da
\param{size} per evitare di sovrascrivere oltre le dimensioni del buffer.
-
\begin{figure}[htb]
\centering
- \includegraphics[width=8cm]{img/link_loop}
+ \includegraphics[width=8.5cm]{img/link_loop}
\caption{Esempio di loop nel filesystem creato con un link simbolico.}
\label{fig:file_link_loop}
\end{figure}
Benché in sostanza le directory non siano altro che dei file contenenti
elenchi di nomi ed \index{inode} inode, non è possibile trattarle come file
ordinari e devono essere create direttamente dal kernel attraverso una
-opportuna system call.\footnote{questo permette anche, attraverso l'uso del
- VFS, l'utilizzo di diversi formati per la gestione dei suddetti elenchi.}
-La funzione usata per creare una directory è \funcd{mkdir}, ed il suo
-prototipo è:
+opportuna system call.\footnote{questo è quello che permette anche, attraverso
+ l'uso del VFS, l'utilizzo di diversi formati per la gestione dei suddetti
+ elenchi.} La funzione usata per creare una directory è \funcd{mkdir}, ed il
+suo prototipo è:
\begin{functions}
\headdecl{sys/stat.h}
\headdecl{sys/types.h}
\bodydesc{La funzione restituisce zero in caso di successo e -1 per un
errore, nel qual caso \var{errno} assumerà i valori:
\begin{errlist}
- \item[\errcode{EEXIST}] Un file (o una directory) con quel nome esiste di
+ \item[\errcode{EEXIST}] un file (o una directory) con quel nome esiste di
già.
- \item[\errcode{EACCES}]
- Non c'è il permesso di scrittura per la directory in cui si vuole inserire
- la nuova directory.
- \item[\errcode{EMLINK}] La directory in cui si vuole creare la nuova
- directory contiene troppi file. Sotto Linux questo normalmente non avviene
+ \item[\errcode{EACCES}] non c'è il permesso di scrittura per la directory in
+ cui si vuole inserire la nuova directory.
+ \item[\errcode{EMLINK}] la directory in cui si vuole creare la nuova
+ directory contiene troppi file; sotto Linux questo normalmente non avviene
perché il filesystem standard consente la creazione di un numero di file
maggiore di quelli che possono essere contenuti nel disco, ma potendo
avere a che fare anche con filesystem di altri sistemi questo errore può
presentarsi.
- \item[\errcode{ENOSPC}] Non c'è abbastanza spazio sul file system per creare
+ \item[\errcode{ENOSPC}] non c'è abbastanza spazio sul file system per creare
la nuova directory o si è esaurita la quota disco dell'utente.
\end{errlist}
ed inoltre anche \errval{EPERM}, \errval{EFAULT}, \errval{ENAMETOOLONG},
\end{functions}
La funzione crea una nuova directory vuota, che contiene cioè solo le due voci
-standard (\file{.} e \file{..}), con il nome indicato dall'argomento
-\param{dirname}. Il nome può essere indicato sia come \itindex{pathname}
-\textit{pathname} assoluto che relativo.
-
-I permessi di accesso alla directory (vedi sez.~\ref{sec:file_access_control})
-sono specificati da \param{mode}, i cui possibili valori sono riportati in
-tab.~\ref{tab:file_permission_const}; questi sono modificati dalla maschera di
-creazione dei file (si veda sez.~\ref{sec:file_perm_management}). La
-titolarità della nuova directory è impostata secondo quanto riportato in
+standard presenti in ogni directory (cioè ``\file{.}'' e ``\file{..}''), con
+il nome indicato dall'argomento \param{dirname}. Il nome può essere indicato
+sia come \itindex{pathname} \textit{pathname} assoluto che come
+\itindex{pathname} \textit{pathname} relativo.
+
+I permessi di accesso (vedi sez.~\ref{sec:file_access_control}) con cui la
+directory viene creata sono specificati dall'argomemto \param{mode}, i cui
+possibili valori sono riportati in tab.~\ref{tab:file_permission_const}; si
+tenga presente che questi sono modificati dalla maschera di creazione dei file
+(si veda sez.~\ref{sec:file_perm_management}). La titolarità della nuova
+directory è impostata secondo quanto riportato in
sez.~\ref{sec:file_ownership_management}.
-La funzione per la cancellazione di una directory è \funcd{rmdir}, il suo
-prototipo è:
+La funzione che permette la cancellazione di una directory è invece
+\funcd{rmdir}, ed il suo prototipo è:
\begin{prototype}{sys/stat.h}{int rmdir(const char *dirname)}
Cancella una directory.
\end{prototype}
La funzione cancella la directory \param{dirname}, che deve essere vuota (la
-directory deve cioè contenere soltanto le due voci standard \file{.} e
-\file{..}). Il nome può essere indicato con il \itindex{pathname}
+directory deve cioè contenere soltanto le due voci standard ``\file{.}'' e
+``\file{..}''). Il nome può essere indicato con il \itindex{pathname}
\textit{pathname} assoluto o relativo.
La modalità con cui avviene la cancellazione è analoga a quella di
directory non diventa nullo e nessun processo ha la directory aperta lo spazio
occupato su disco non viene rilasciato. Se un processo ha la directory aperta
la funzione rimuove il link \index{inode} all'inode e nel caso sia l'ultimo,
-pure le voci standard \file{.} e \file{..}, a questo punto il kernel non
-consentirà di creare più nuovi file nella directory.
+pure le voci standard ``\file{.}'' e ``\file{..}'', a questo punto il kernel
+non consentirà di creare più nuovi file nella directory.
\subsection{La creazione di file speciali}
\footnotesize
\begin{tabular}[c]{|l|l|}
\hline
- \textbf{Valore} & \textbf{Significato} \\
+ \textbf{Valore} & \textbf{Tipo di file} \\
\hline
\hline
- \const{DT\_UNKNOWN} & tipo sconosciuto. \\
- \const{DT\_REG} & file normale. \\
- \const{DT\_DIR} & directory. \\
- \const{DT\_FIFO} & fifo. \\
- \const{DT\_SOCK} & socket. \\
- \const{DT\_CHR} & dispositivo a caratteri. \\
- \const{DT\_BLK} & dispositivo a blocchi. \\
+ \const{DT\_UNKNOWN} & tipo sconosciuto\\
+ \const{DT\_REG} & file normale\\
+ \const{DT\_DIR} & directory\\
+ \const{DT\_FIFO} & fifo\\
+ \const{DT\_SOCK} & socket\\
+ \const{DT\_CHR} & dispositivo a caratteri\\
+ \const{DT\_BLK} & dispositivo a blocchi\\
\hline
\end{tabular}
\caption{Costanti che indicano i vari tipi di file nel campo \var{d\_type}
da poter fornire un quadro d'insieme.
In tab.~\ref{tab:file_fileperm_bits} si sono riassunti gli effetti dei vari
-bit per un file; per quanto riguarda l'applicazione dei permessi per
-proprietario, gruppo ed altri si ricordi quanto illustrato in
-sez.~\ref{sec:file_perm_overview}. Si rammenti che il valore dei permessi non
-ha alcun effetto qualora il processo possieda i privilegi di amministratore.
+bit dei permessi per un file; per quanto riguarda l'applicazione dei permessi
+per proprietario, gruppo ed altri si ricordi quanto illustrato in
+sez.~\ref{sec:file_perm_overview}. Per compattezza, nella tabelle si sono
+specificati i bit di \itindex{suid~bit} \textit{suid}, \itindex{sgid~bit}
+\textit{sgid} e \textit{sticky} \itindex{sticky~bit} con la notazione
+illustrata anche in fig.~\ref{fig:file_perm_bit}.
\begin{table}[!htb]
\centering
\footnotesize
\begin{tabular}[c]{|c|c|c|c|c|c|c|c|c|c|c|c|l|}
\hline
- \multicolumn{3}{|c|}{}&
+ \multicolumn{3}{|c|}{special}&
\multicolumn{3}{|c|}{user}&
\multicolumn{3}{|c|}{group}&
\multicolumn{3}{|c|}{other}&
\acr{s}&\acr{s}&\acr{t}&r&w&x&r&w&x&r&w&x& \\
\hline
\hline
- 1&-&-&-&-&-&-&-&-&-&-&-&Se eseguito ha i permessi del proprietario\\
- -&1&-&-&-&1&-&-&-&-&-&-&Se eseguito ha i permessi del gruppo proprietario\\
- -&1&-&-&-&0&-&-&-&-&-&-&Il \itindex{mandatory~locking}
- \textit{mandatory locking} è abilitato\\
- -&-&1&-&-&-&-&-&-&-&-&-&Non utilizzato\\
- -&-&-&1&-&-&-&-&-&-&-&-&Permesso di lettura per il proprietario\\
- -&-&-&-&1&-&-&-&-&-&-&-&Permesso di scrittura per il proprietario\\
- -&-&-&-&-&1&-&-&-&-&-&-&Permesso di esecuzione per il proprietario\\
- -&-&-&-&-&-&1&-&-&-&-&-&Permesso di lettura per il gruppo proprietario\\
- -&-&-&-&-&-&-&1&-&-&-&-&Permesso di scrittura per il gruppo proprietario\\
- -&-&-&-&-&-&-&-&1&-&-&-&Permesso di esecuzione per il gruppo proprietario\\
- -&-&-&-&-&-&-&-&-&1&-&-&Permesso di lettura per tutti gli altri\\
- -&-&-&-&-&-&-&-&-&-&1&-&Permesso di scrittura per tutti gli altri \\
- -&-&-&-&-&-&-&-&-&-&-&1&Permesso di esecuzione per tutti gli altri\\
+ 1&-&-&-&-&-&-&-&-&-&-&-&Se eseguito ha i permessi del proprietario.\\
+ -&1&-&-&-&1&-&-&-&-&-&-&Se eseguito ha i permessi del gruppo proprietario.\\
+ -&1&-&-&-&0&-&-&-&-&-&-&Il \itindex{mandatory~locking}
+ \textit{mandatory locking} è abilitato.\\
+ -&-&1&-&-&-&-&-&-&-&-&-&Non utilizzato.\\
+ -&-&-&1&-&-&-&-&-&-&-&-&Permesso di lettura per il proprietario.\\
+ -&-&-&-&1&-&-&-&-&-&-&-&Permesso di scrittura per il proprietario.\\
+ -&-&-&-&-&1&-&-&-&-&-&-&Permesso di esecuzione per il proprietario.\\
+ -&-&-&-&-&-&1&-&-&-&-&-&Permesso di lettura per il gruppo proprietario.\\
+ -&-&-&-&-&-&-&1&-&-&-&-&Permesso di scrittura per il gruppo proprietario.\\
+ -&-&-&-&-&-&-&-&1&-&-&-&Permesso di esecuzione per il gruppo proprietario.\\
+ -&-&-&-&-&-&-&-&-&1&-&-&Permesso di lettura per tutti gli altri.\\
+ -&-&-&-&-&-&-&-&-&-&1&-&Permesso di scrittura per tutti gli altri.\\
+ -&-&-&-&-&-&-&-&-&-&-&1&Permesso di esecuzione per tutti gli altri.\\
\hline
\end{tabular}
\caption{Tabella riassuntiva del significato dei bit dei permessi per un
\label{tab:file_fileperm_bits}
\end{table}
-Per compattezza, nella tabella si sono specificati i bit di \itindex{suid~bit}
-\textit{suid}, \itindex{sgid~bit} \textit{sgid} e \textit{sticky}
-\itindex{sticky~bit} con la notazione illustrata anche in
-fig.~\ref{fig:file_perm_bit}.
-
In tab.~\ref{tab:file_dirperm_bits} si sono invece riassunti gli effetti dei
vari bit dei permessi per una directory; anche in questo caso si sono
specificati i bit di \itindex{suid~bit} \textit{suid}, \itindex{sgid~bit}
\footnotesize
\begin{tabular}[c]{|c|c|c|c|c|c|c|c|c|c|c|c|l|}
\hline
- \multicolumn{3}{|c|}{}&
+ \multicolumn{3}{|c|}{special}&
\multicolumn{3}{|c|}{user}&
\multicolumn{3}{|c|}{group}&
\multicolumn{3}{|c|}{other}&
\acr{s}&\acr{s}&\acr{t}&r&w&x&r&w&x&r&w&x& \\
\hline
\hline
- 1&-&-&-&-&-&-&-&-&-&-&-&Non utilizzato\\
- -&1&-&-&-&-&-&-&-&-&-&-&Propaga il gruppo proprietario ai nuovi file creati\\
- -&-&1&-&-&-&-&-&-&-&-&-&Limita l'accesso in scrittura dei file nella directory\\
- -&-&-&1&-&-&-&-&-&-&-&-&Permesso di visualizzazione per il proprietario\\
- -&-&-&-&1&-&-&-&-&-&-&-&Permesso di aggiornamento per il proprietario\\
- -&-&-&-&-&1&-&-&-&-&-&-&Permesso di attraversamento per il proprietario\\
- -&-&-&-&-&-&1&-&-&-&-&-&Permesso di visualizzazione per il gruppo proprietario\\
- -&-&-&-&-&-&-&1&-&-&-&-&Permesso di aggiornamento per il gruppo proprietario\\
- -&-&-&-&-&-&-&-&1&-&-&-&Permesso di attraversamento per il gruppo proprietario\\
- -&-&-&-&-&-&-&-&-&1&-&-&Permesso di visualizzazione per tutti gli altri\\
- -&-&-&-&-&-&-&-&-&-&1&-&Permesso di aggiornamento per tutti gli altri \\
- -&-&-&-&-&-&-&-&-&-&-&1&Permesso di attraversamento per tutti gli altri\\
+ 1&-&-&-&-&-&-&-&-&-&-&-&Non utilizzato.\\
+ -&1&-&-&-&-&-&-&-&-&-&-&Propaga il gruppo proprietario ai nuovi file
+ creati.\\
+ -&-&1&-&-&-&-&-&-&-&-&-&Limita l'accesso in scrittura dei file nella
+ directory.\\
+ -&-&-&1&-&-&-&-&-&-&-&-&Permesso di visualizzazione per il proprietario.\\
+ -&-&-&-&1&-&-&-&-&-&-&-&Permesso di aggiornamento per il proprietario.\\
+ -&-&-&-&-&1&-&-&-&-&-&-&Permesso di attraversamento per il proprietario.\\
+ -&-&-&-&-&-&1&-&-&-&-&-&Permesso di visualizzazione per il gruppo
+ proprietario.\\
+ -&-&-&-&-&-&-&1&-&-&-&-&Permesso di aggiornamento per il gruppo
+ proprietario.\\
+ -&-&-&-&-&-&-&-&1&-&-&-&Permesso di attraversamento per il gruppo
+ proprietario.\\
+ -&-&-&-&-&-&-&-&-&1&-&-&Permesso di visualizzazione per tutti gli altri.\\
+ -&-&-&-&-&-&-&-&-&-&1&-&Permesso di aggiornamento per tutti gli altri.\\
+ -&-&-&-&-&-&-&-&-&-&-&1&Permesso di attraversamento per tutti gli altri.\\
\hline
\end{tabular}
\caption{Tabella riassuntiva del significato dei bit dei permessi per una
\label{tab:file_dirperm_bits}
\end{table}
-Nelle tabelle si è indicato con ``-'' il fatto che il valore degli altri bit
-non è influente rispetto a quanto indicato in ciascuna riga; l'operazione fa
-riferimento soltanto alla combinazione di bit per i quali il valore è
-riportato esplicitamente.
+Nelle tabelle si è indicato con il carattere ``-'' il fatto che il valore del
+bit in questione non è influente rispetto a quanto indicato nella riga della
+tabella; la descrizione dell'operazione fa riferimento soltanto alla
+combinazione di bit per i quali è stato riportato esplicitamente un valore.
+Si rammenti infine che il valore dei bit dei permessi non ha alcun effetto
+qualora il processo possieda i privilegi di amministratore.
+
+
+
+\section{Caratteristiche e funzionalità avanzate}
+\label{sec:file_dir_advances}
+
+Tratteremo qui alcune caratteristiche e funzionalità avanzate della gestione
+di file e directory, affrontando anche una serie di estensioni
+dell'interfaccia classica dei sistemi unix-like, principalmente utilizzate a
+scopi di sicurezza, che sono state introdotte nelle versioni più recenti di
+Linux.
+
+
+\subsection{Gli attributi estesi}
+\label{sec:file_xattr}
+
+\itindbeg{Extended~Attributes}
+
+Nelle sezioni precedenti abbiamo trattato in dettaglio le varie informazioni
+che il sistema mantiene negli inode, e le varie funzioni che permettono di
+modificarle. Si sarà notato come in realtà queste informazioni siano
+estremamente ridotte. Questo è dovuto al fatto che Unix origina negli anni
+'70, quando le risorse di calcolo e di spazio disco erano minime. Con il venir
+meno di queste restrizioni è incominciata ad emergere l'esigenza di poter
+associare ai file delle ulteriori informazioni astratte (quelli che vengono
+chiamati i \textsl{meta-dati}) che però non potevano trovar spazio nei dati
+classici mantenuti negli inode.
+
+Per risolvere questo problema alcuni sistemi unix-like (e fra questi anche
+Linux) hanno introdotto un meccanismo generico che consenta di associare delle
+informazioni ai singoli file,\footnote{l'uso più comune è quello della ACL,
+ che tratteremo a breve, ma si possono inserire anche altre informazioni.}
+detto \textit{Extended Attributes}. Gli \textsl{attributi estesi} non sono
+altro che delle coppie nome/valore che sono associate permanentemente ad un
+oggetto sul filesystem, analoghi di quello che sono le variabili di ambiente
+(vedi sez.~\ref{sec:proc_environ}) per un processo.
+
+Altri sistemi (come Solaris, MacOS e Windows) hanno adottato un meccanismo
+diverso in cui ad un file sono associati diversi flussi di dati, su cui
+possono essere mantenute ulteriori informazioni, che possono essere accedute
+con le normali operazioni di lettura e scrittura. Questi non vanno confusi con
+gli \textit{Extended Attributes} (anche se su Solaris hanno lo stesso nome),
+che sono un meccanismo molto più semplice, che pur essendo limitato (potendo
+contenere solo una quantità limitata di informazione) hanno il grande
+vantaggio di essere molto più semplici da realizzare e più
+efficienti,\footnote{cosa molto importante, specie per le applicazioni che
+ richiedono una gran numero di accessi, come le ACL.} e di garantire
+l'atomicità di tutte le operazioni.
+
+
+
+
+\itindend{Extended~Attributes}
+
+% TODO trattare gli attributi estesi e le funzioni la documentazione di
+% sistema è nei pacchetti libxattr1-dev e attr
+
+
+\subsection{Le ACL}
+\label{sec:file_ACL}
+
+
+\itindbeg{Access~Control~List}
+
+Il modello classico dei permessi di Unix, per quanto funzionale ed efficiente,
+è comunque piuttosto limitato e per quanto possa aver coperto per lunghi anni
+le esigenze più comuni con un meccanismo semplice e potente, non è in grado di
+rispondere in maniera adeguata a situazioni che richiedono una gestione
+complessa dei permessi di accesso.\footnote{già un requisito come quello di
+ dare accesso in scrittura ad alcune persone ed in sola lettura ad altre non
+ si può soddisfare in maniera soddifacente.}
+
+Per questo motivo erano state progressivamente introdotte nelle varie versioni
+di Unix dei meccanismi di gestione dei permessi dei file più flessibili, nella
+forma delle cosiddette \textit{Access Control List}. Nello sforzo di
+standardizzare queste funzionalità era stato creato un gruppo di lavoro il cui
+scopo era estendere lo standard POSIX 1003 attraverso due nuovi insiemi di
+specifiche, la POSIX 1003.1e per l'interfaccia di programmazione e la POSIX
+1003.2c per i comandi di shell.
+
+Gli obiettivi erano però forse troppo ambizioni, e nel gennaio del 1998 i
+finanziamenti vennero ritirati senza che si fosse arrivati alla definizione di
+uno standard, dato però che una parte della documentazione prodotta era di
+alta qualità venne deciso di rilasciare al pubblico la diciassettesima bozza
+del documento, quella che va sotto il nome di POSIX 1003.1e Draft 17, che è
+divenuta la base sulla quale si definiscono quelle che vanno sotto il nome di
+\textit{Posix ACL}.
+
+A differenza di altri sistemi (ad esempio FreeBSD) nel caso di Linux si è
+scelto di realizzare le ACL attraverso l'interfaccia degli \textit{Extended
+ Attributes}, e fornire tutte le relative funzioni di gestione tramite una
+liberia, \texttt{libacl} che nasconde i dettagli implementativi delle stesse e
+presenta ai programmi una interfaccia che fa riferimento allo standard POSIX
+1003.1e.
+
+\itindend{Access~Control~List}
+
+
+% TODO trattare le ACL, la documentazione di sistema è nei pacchetti
+% libacl1-dev e acl
+% vedi anche http://www.suse.de/~agruen/acl/linux-acls/online/
+
-% TODO intrudurre nuova sezione sulle funzionalità di sicurezza avanzate, con
-% dentro chroot, gli attributi estesi, ecc.
\subsection{La funzione \func{chroot}}
\label{sec:file_chroot}
+% TODO intrudurre nuova sezione sulle funzionalità di sicurezza avanzate, con
+% dentro chroot SELinux e AppArmor ???
+
Benché non abbia niente a che fare con permessi, utenti e gruppi, la funzione
\func{chroot} viene usata spesso per restringere le capacità di accesso di un
programma ad una sezione limitata del filesystem, per cui ne parleremo in
\hline
\hline
\textit{regular file} & \textsl{file regolare} &
- un file che contiene dei dati (l'accezione normale di file) \\
+ Un file che contiene dei dati (l'accezione normale di file).\\
\textit{directory} & \textsl{cartella o direttorio} &
- un file che contiene una lista di nomi associati a degli
- \index{inode} \textit{inode} (vedi sez.~\ref{sec:file_vfs}). \\
+ Un file che contiene una lista di nomi associati a degli
+ \index{inode} \textit{inode} (vedi sez.~\ref{sec:file_vfs}).\\
\textit{symbolic link} & \textsl{collegamento simbolico} &
- un file che contiene un riferimento ad un altro file/directory \\
+ Un file che contiene un riferimento ad un altro file/directory.\\
\textit{char device} & \textsl{dispositivo a caratteri} &
- un file che identifica una periferica ad accesso a caratteri \\
+ Un file che identifica una periferica ad accesso a caratteri.\\
\textit{block device} & \textsl{dispositivo a blocchi} &
- un file che identifica una periferica ad accesso a blocchi \\
+ Un file che identifica una periferica ad accesso a blocchi.\\
\textit{fifo} & ``\textsl{coda}'' &
- un file speciale che identifica una linea di comunicazione software
+ Un file speciale che identifica una linea di comunicazione software
unidirezionale (vedi sez.~\ref{sec:ipc_named_pipe}).\\
\textit{socket} & ``\textsl{presa}''&
- un file speciale che identifica una linea di comunicazione software
- bidirezionale (vedi cap.~\ref{cha:socket_intro}) \\
+ Un file speciale che identifica una linea di comunicazione software
+ bidirezionale (vedi cap.~\ref{cha:socket_intro}).\\
\hline
\end{tabular}
\caption{Tipologia dei file definiti nel VFS}
\textbf{Funzione} & \textbf{Operazione} \\
\hline
\hline
- \textsl{\code{open}} & apre il file (vedi sez.~\ref{sec:file_open}). \\
- \textsl{\code{read}} & legge dal file (vedi sez.~\ref{sec:file_read}).\\
- \textsl{\code{write}} & scrive sul file (vedi
+ \textsl{\code{open}} & Apre il file (vedi sez.~\ref{sec:file_open}).\\
+ \textsl{\code{read}} & Legge dal file (vedi sez.~\ref{sec:file_read}).\\
+ \textsl{\code{write}} & Scrive sul file (vedi
sez.~\ref{sec:file_write}).\\
- \textsl{\code{llseek}} & sposta la posizione corrente sul file (vedi
- sez.~\ref{sec:file_lseek}). \\
- \textsl{\code{ioctl}} & accede alle operazioni di controllo
+ \textsl{\code{llseek}} & Sposta la posizione corrente sul file (vedi
+ sez.~\ref{sec:file_lseek}).\\
+ \textsl{\code{ioctl}} & Accede alle operazioni di controllo
(vedi sez.~\ref{sec:file_ioctl}).\\
- \textsl{\code{readdir}}& legge il contenuto di una directory \\
- \textsl{\code{poll}} & usata nell'I/O multiplexing (vedi
- sez.~\ref{sec:file_multiplexing}). \\
- \textsl{\code{mmap}} & mappa il file in memoria (vedi
- sez.~\ref{sec:file_memory_map}). \\
- \textsl{\code{release}}& chiamata quando l'ultimo riferimento a un file
- aperto è chiuso. \\
- \textsl{\code{fsync}} & sincronizza il contenuto del file (vedi
- sez.~\ref{sec:file_sync}). \\
- \textsl{\code{fasync}} & abilita l'I/O asincrono (vedi
- sez.~\ref{sec:file_asyncronous_io}) sul file. \\
+ \textsl{\code{readdir}}& Legge il contenuto di una directory.\\
+ \textsl{\code{poll}} & Usata nell'I/O multiplexing (vedi
+ sez.~\ref{sec:file_multiplexing}).\\
+ \textsl{\code{mmap}} & Mappa il file in memoria (vedi
+ sez.~\ref{sec:file_memory_map}).\\
+ \textsl{\code{release}}& Chiamata quando l'ultimo riferimento a un file
+ aperto è chiuso.\\
+ \textsl{\code{fsync}} & Sincronizza il contenuto del file (vedi
+ sez.~\ref{sec:file_sync}).\\
+ \textsl{\code{fasync}} & Abilita l'I/O asincrono (vedi
+ sez.~\ref{sec:file_asyncronous_io}) sul file.\\
\hline
\end{tabular}
\caption{Operazioni sui file definite nel VFS.}
\texttt{r} & Il file viene aperto, l'accesso viene posto in sola
lettura, lo stream è posizionato all'inizio del file.\\
\texttt{r+}& Il file viene aperto, l'accesso viene posto in lettura e
- scrittura, lo stream è posizionato all'inizio del file. \\
+ scrittura, lo stream è posizionato all'inizio del file.\\
% \hline
\texttt{w} & Il file viene aperto e troncato a lunghezza nulla (o
creato se non esiste), l'accesso viene posto in sola
\itindex{append~mode} \textit{append mode}, l'accesso viene
posto in lettura e scrittura.\\
\hline
- \texttt{b} & specifica che il file è binario, non ha alcun effetto. \\
- \texttt{x} & l'apertura fallisce se il file esiste già. \\
+ \texttt{b} & Specifica che il file è binario, non ha alcun effetto. \\
+ \texttt{x} & L'apertura fallisce se il file esiste già. \\
\hline
\end{tabular}
\caption{Modalità di apertura di uno stream dello standard ANSI C che
\hline
\hline
\cmd{\%d} &\ctyp{int} & Stampa un numero intero in formato decimale
- con segno \\
- \cmd{\%i} &\ctyp{int} & Identico a \cmd{\%i} in output, \\
- \cmd{\%o} &\ctyp{unsigned int}& Stampa un numero intero come ottale\\
+ con segno.\\
+ \cmd{\%i} &\ctyp{int} & Identico a \cmd{\%i} in output.\\
+ \cmd{\%o} &\ctyp{unsigned int}& Stampa un numero intero come ottale.\\
\cmd{\%u} &\ctyp{unsigned int}& Stampa un numero intero in formato
- decimale senza segno \\
+ decimale senza segno.\\
\cmd{\%x},
\cmd{\%X} &\ctyp{unsigned int}& Stampano un intero in formato esadecimale,
rispettivamente con lettere minuscole e
- maiuscole. \\
+ maiuscole.\\
\cmd{\%f} &\ctyp{double} & Stampa un numero in virgola mobile con la
- notazione a virgola fissa \\
+ notazione a virgola fissa.\\
\cmd{\%e},
\cmd{\%E} &\ctyp{double} & Stampano un numero in virgola mobile con la
notazione esponenziale, rispettivamente con
- lettere minuscole e maiuscole. \\
+ lettere minuscole e maiuscole.\\
\cmd{\%g},
\cmd{\%G} &\ctyp{double} & Stampano un numero in virgola mobile con la
notazione più appropriate delle due precedenti,
rispettivamente con lettere minuscole e
- maiuscole. \\
+ maiuscole.\\
\cmd{\%a},
\cmd{\%A} &\ctyp{double} & Stampano un numero in virgola mobile in
- notazione esadecimale frazionaria\\
- \cmd{\%c} &\ctyp{int} & Stampa un carattere singolo\\
- \cmd{\%s} &\ctyp{char *} & Stampa una stringa \\
- \cmd{\%p} &\ctyp{void *} & Stampa il valore di un puntatore\\
- \cmd{\%n} &\ctyp{\&int} & Prende il numero di caratteri stampati finora\\
- \cmd{\%\%}& & Stampa un \% \\
+ notazione esadecimale frazionaria.\\
+ \cmd{\%c} &\ctyp{int} & Stampa un carattere singolo.\\
+ \cmd{\%s} &\ctyp{char *} & Stampa una stringa.\\
+ \cmd{\%p} &\ctyp{void *} & Stampa il valore di un puntatore.\\
+ \cmd{\%n} &\ctyp{\&int} & Prende il numero di caratteri stampati finora.\\
+ \cmd{\%\%}& & Stampa un \%.\\
\hline
\end{tabular}
\caption{Valori possibili per gli specificatori di conversione in una
\val{0} & La conversione è riempita con zeri alla sinistra del valore.\\
\val{-} & La conversione viene allineata a sinistra sul bordo del campo.\\
\val{' '}& Mette uno spazio prima di un numero con segno di valore
- positivo\\
+ positivo.\\
\val{+} & Mette sempre il segno ($+$ o $-$) prima di un numero.\\
\hline
\end{tabular}
\textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \cmd{hh} & una conversione intera corrisponde a un \ctyp{char} con o senza
+ \cmd{hh} & Una conversione intera corrisponde a un \ctyp{char} con o senza
segno, o il puntatore per il numero dei parametri \cmd{n} è di
tipo \ctyp{char}.\\
- \cmd{h} & una conversione intera corrisponde a uno \ctyp{short} con o
+ \cmd{h} & Una conversione intera corrisponde a uno \ctyp{short} con o
senza segno, o il puntatore per il numero dei parametri \cmd{n}
è di tipo \ctyp{short}.\\
- \cmd{l} & una conversione intera corrisponde a un \ctyp{long} con o
+ \cmd{l} & Una conversione intera corrisponde a un \ctyp{long} con o
senza segno, o il puntatore per il numero dei parametri \cmd{n}
è di tipo \ctyp{long}, o il carattere o la stringa seguenti
sono in formato esteso.\\
- \cmd{ll} & una conversione intera corrisponde a un \ctyp{long long} con o
+ \cmd{ll} & Una conversione intera corrisponde a un \ctyp{long long} con o
senza segno, o il puntatore per il numero dei parametri \cmd{n}
è di tipo \ctyp{long long}.\\
- \cmd{L} & una conversione in virgola mobile corrisponde a un
+ \cmd{L} & Una conversione in virgola mobile corrisponde a un
\ctyp{double}.\\
- \cmd{q} & sinonimo di \cmd{ll}.\\
- \cmd{j} & una conversione intera corrisponde a un \type{intmax\_t} o
+ \cmd{q} & Sinonimo di \cmd{ll}.\\
+ \cmd{j} & Una conversione intera corrisponde a un \type{intmax\_t} o
\type{uintmax\_t}.\\
- \cmd{z} & una conversione intera corrisponde a un \type{size\_t} o
+ \cmd{z} & Una conversione intera corrisponde a un \type{size\_t} o
\type{ssize\_t}.\\
- \cmd{t} & una conversione intera corrisponde a un \type{ptrdiff\_t}.\\
+ \cmd{t} & Una conversione intera corrisponde a un \type{ptrdiff\_t}.\\
\hline
\end{tabular}
\caption{Il modificatore di tipo di dato per il formato di \func{printf}}
titolarità del file viste in
sez.~\ref{sec:file_ownership_management}. Con questa
opzione l'argomento \param{mode} deve essere
- specificato. \\
+ specificato.\\
\const{O\_EXCL} & Usato in congiunzione con \const{O\_CREAT} fa sì che
la precedente esistenza del file diventi un
errore\protect\footnotemark\ che fa fallire
- \func{open} con \errcode{EEXIST}. \\
+ \func{open} con \errcode{EEXIST}.\\
\const{O\_NONBLOCK}& Apre il file in modalità non bloccante, e
comporta che \func{open} ritorni immediatamente anche
quando dovrebbe bloccarsi (l'opzione ha senso solo per
- le fifo, vedi sez.~\ref{sec:ipc_named_pipe}). \\
+ le fifo, vedi sez.~\ref{sec:ipc_named_pipe}).\\
\const{O\_NOCTTY} & Se \param{pathname} si riferisce ad un dispositivo di
terminale, questo non diventerà il terminale di
controllo, anche se il processo non ne ha ancora uno
- (si veda sez.~\ref{sec:sess_ctrl_term}). \\
+ (si veda sez.~\ref{sec:sess_ctrl_term}).\\
\const{O\_SHLOCK} & Apre il file con uno shared lock (vedi
sez.~\ref{sec:file_locking}). Specifica di BSD,
- assente in Linux. \\
+ assente in Linux.\\
\const{O\_EXLOCK} & Apre il file con un lock esclusivo (vedi
sez.~\ref{sec:file_locking}). Specifica di BSD,
assente in Linux.\\
\const{O\_TRUNC} & Se usato su un file di dati aperto in scrittura,
ne tronca la lunghezza a zero; con un terminale o una
fifo viene ignorato, negli altri casi il
- comportamento non è specificato. \\
+ comportamento non è specificato.\\
\const{O\_NOFOLLOW}& Se \param{pathname} è un link simbolico la chiamata
fallisce. Questa è un'estensione BSD aggiunta in Linux
dal kernel 2.1.126. Nelle versioni precedenti i link
simbolici sono sempre seguiti, e questa opzione è
- ignorata. \\
+ ignorata.\\
\const{O\_DIRECTORY}&Se \param{pathname} non è una directory la chiamata
fallisce. Questo flag è specifico di Linux ed è stato
introdotto con il kernel 2.1.126 per evitare dei
\func{opendir} viene chiamata su una fifo o su un
dispositivo associato ad una unità a nastri, non deve
dispositivo a nastri; non deve essere utilizzato
- al di fuori dell'implementazione di \func{opendir}. \\
- \const{O\_LARGEFILE}&nel caso di sistemi a 32 bit che supportano file di
+ al di fuori dell'implementazione di \func{opendir}.\\
+ \const{O\_LARGEFILE}&Nel caso di sistemi a 32 bit che supportano file di
grandi dimensioni consente di aprire file le cui
dimensioni non possono essere rappresentate da numeri
- a 31 bit. \\
+ a 31 bit.\\
\hline
\hline % modalità di operazione coi file
\const{O\_APPEND} & Il file viene aperto in \itindex{append~mode}
leggere e quello di \func{write} in caso di
impossibilità di scrivere immediatamente. Questa
modalità ha senso solo per le fifo e per alcuni file
- di dispositivo. \\
+ di dispositivo.\\
\const{O\_NDELAY} & In Linux\footnotemark\ è sinonimo di
\const{O\_NONBLOCK}.\\
\const{O\_ASYNC} & Apre il file per l'I/O in modalità asincrona (vedi
sez.~\ref{sec:file_asyncronous_io}). Quando è
impostato viene generato il segnale \const{SIGIO}
tutte le volte che sono disponibili dati in input
- sul file. \\
+ sul file.\\
\const{O\_SYNC} & Apre il file per l'input/output sincrono: ogni
\func{write} bloccherà fino al completamento della
scrittura di tutti i dati sull'hardware
sottostante.\\
- \const{O\_FSYNC} & sinonimo di \const{O\_SYNC}, usato da BSD. \\
+ \const{O\_FSYNC} & Sinonimo di \const{O\_SYNC}, usato da BSD.\\
\const{O\_DSYNC} & Variante di I/O sincrono definita da POSIX; presente
dal kernel 2.1.130 come sinonimo di
- \const{O\_SYNC}. \\
+ \const{O\_SYNC}.\\
\const{O\_RSYNC} & Variante analoga alla precedente, trattata allo stesso
- modo. \\
+ modo.\\
\const{O\_NOATIME} & Blocca l'aggiornamento dei tempi di accesso dei
file (vedi sez.~\ref{sec:file_file_times}). Per molti
filesystem questa funzionalità non è disponibile per
\hline
\hline
\const{MSGMNI}& 16& \file{msgmni} & Numero massimo di code di
- messaggi. \\
+ messaggi.\\
\const{MSGMAX}& 8192& \file{msgmax} & Dimensione massima di un singolo
messaggio.\\
\const{MSGMNB}&16384& \file{msgmnb} & Dimensione massima del contenuto di
\textbf{Costante} & \textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \const{SEMMNI}& 128 & Numero massimo di insiemi di semafori. \\
+ \const{SEMMNI}& 128 & Numero massimo di insiemi di semafori.\\
\const{SEMMSL}& 250 & Numero massimo di semafori per insieme.\\
\const{SEMMNS}&\const{SEMMNI}*\const{SEMMSL}& Numero massimo di semafori
- nel sistema .\\
+ nel sistema.\\
\const{SEMVMX}& 32767 & Massimo valore per un semaforo.\\
\const{SEMOPM}& 32 & Massimo numero di operazioni per chiamata a
\func{semop}. \\
\const{SEMMNU}&\const{SEMMNS}& Massimo numero di strutture di ripristino.\\
\const{SEMUME}&\const{SEMOPM}& Massimo numero di voci di ripristino.\\
- \const{SEMAEM}&\const{SEMVMX}& valore massimo per l'aggiustamento
+ \const{SEMAEM}&\const{SEMVMX}& Valore massimo per l'aggiustamento
all'uscita. \\
\hline
\end{tabular}
\textbf{Operazione} & \textbf{Valore restituito} \\
\hline
\hline
- \const{GETNCNT}& valore di \var{semncnt}.\\
- \const{GETPID} & valore di \var{sempid}.\\
- \const{GETVAL} & valore di \var{semval}.\\
- \const{GETZCNT}& valore di \var{semzcnt}.\\
+ \const{GETNCNT}& Valore di \var{semncnt}.\\
+ \const{GETPID} & Valore di \var{sempid}.\\
+ \const{GETVAL} & Valore di \var{semval}.\\
+ \const{GETZCNT}& Valore di \var{semzcnt}.\\
\hline
\end{tabular}
\caption{Valori di ritorno della funzione \func{semctl}.}
\hline
\const{SHMALL}& 0x200000&\file{shmall}& Numero massimo di pagine che
possono essere usate per i segmenti di
- memoria condivisa. \\
+ memoria condivisa.\\
\const{SHMMAX}&0x2000000&\file{shmmax}& Dimensione massima di un segmento
di memoria condivisa.\\
\const{SHMMNI}& 4096&\file{msgmni}& Numero massimo di segmenti di
memoria condivisa presenti nel
kernel.\\
\const{SHMMIN}& 1& --- & Dimensione minima di un segmento di
- memoria condivisa. \\
+ memoria condivisa.\\
\const{SHMLBA}&\const{PAGE\_SIZE}&--- & Limite inferiore per le dimensioni
minime di un segmento (deve essere
allineato alle dimensioni di una
- pagina di memoria). \\
+ pagina di memoria).\\
\const{SHMSEG}& --- & --- & Numero massimo di segmenti di
- memoria condivisa
- per ciascun processo.\\
+ memoria condivisa per ciascun
+ processo.\\
\hline
\textbf{Valore} & \textbf{Costante} &\textbf{Significato}\\
\hline
\hline
- $<-1$& -- & attende per un figlio il cui
+ $<-1$& -- & Attende per un figlio il cui
\itindex{process~group} \textit{process group}
(vedi sez.~\ref{sec:sess_proc_group}) è uguale
al valore assoluto di \param{pid}. \\
- $-1$&\const{WAIT\_ANY} & attende per un figlio qualsiasi, usata in
+ $-1$&\const{WAIT\_ANY} & Attende per un figlio qualsiasi, usata in
questa maniera senza specificare nessuna opzione
è equivalente a \func{wait}.\\
- $ 0$&\const{WAIT\_MYPGRP}&attende per un figlio il cui
+ $ 0$&\const{WAIT\_MYPGRP}&Attende per un figlio il cui
\itindex{process~group} \textit{process group}
(vedi sez.~\ref{sec:sess_proc_group}) è
uguale a quello del processo chiamante. \\
- $>0$& -- & attende per un figlio il cui \acr{pid} è uguale
+ $>0$& -- & Attende per un figlio il cui \acr{pid} è uguale
al valore di \param{pid}.\\
\hline
\end{tabular}
\textbf{Macro} & \textbf{Descrizione}\\
\hline
\hline
- \const{WNOHANG} & la funzione ritorna immediatamente anche se non è
+ \const{WNOHANG} & La funzione ritorna immediatamente anche se non è
terminato nessun processo figlio. \\
- \const{WUNTRACED} & ritorna anche se un processo figlio è stato fermato. \\
- \const{WCONTINUED}& ritorna anche quando un processo figlio che era stato
+ \const{WUNTRACED} & Ritorna anche se un processo figlio è stato fermato. \\
+ \const{WCONTINUED}& Ritorna anche quando un processo figlio che era stato
fermato ha ripreso l'esecuzione.\footnotemark \\
\hline
\end{tabular}
\textbf{Macro} & \textbf{Descrizione}\\
\hline
\hline
- \macro{WIFEXITED(s)} & condizione vera (valore non nullo) per un processo
+ \macro{WIFEXITED(s)} & Condizione vera (valore non nullo) per un processo
figlio che sia terminato normalmente. \\
- \macro{WEXITSTATUS(s)} & restituisce gli otto bit meno significativi dello
+ \macro{WEXITSTATUS(s)} & Restituisce gli otto bit meno significativi dello
stato di uscita del processo (passato attraverso
\func{\_exit}, \func{exit} o come valore di
ritorno di \func{main}); può essere valutata solo
se \val{WIFEXITED} ha restituito un valore non
nullo.\\
- \macro{WIFSIGNALED(s)} & condizione vera se il processo figlio è terminato
+ \macro{WIFSIGNALED(s)} & Condizione vera se il processo figlio è terminato
in maniera anomala a causa di un segnale che non
è stato catturato (vedi
sez.~\ref{sec:sig_notification}).\\
- \macro{WTERMSIG(s)} & restituisce il numero del segnale che ha causato
+ \macro{WTERMSIG(s)} & Restituisce il numero del segnale che ha causato
la terminazione anomala del processo; può essere
valutata solo se \val{WIFSIGNALED} ha restituito
un valore non nullo.\\
- \macro{WCOREDUMP(s)} & vera se il processo terminato ha generato un
+ \macro{WCOREDUMP(s)} & Vera se il processo terminato ha generato un
file di \itindex{core~dump} \textit{core
dump}; può essere valutata solo se
\val{WIFSIGNALED} ha restituito un valore non
nullo.\footnotemark \\
- \macro{WIFSTOPPED(s)} & vera se il processo che ha causato il ritorno di
+ \macro{WIFSTOPPED(s)} & Vera se il processo che ha causato il ritorno di
\func{waitpid} è bloccato; l'uso è possibile solo
con \func{waitpid} avendo specificato l'opzione
\const{WUNTRACED}.\\
- \macro{WSTOPSIG(s)} & restituisce il numero del segnale che ha bloccato
+ \macro{WSTOPSIG(s)} & Restituisce il numero del segnale che ha bloccato
il processo; può essere valutata solo se
\val{WIFSTOPPED} ha restituito un valore non
nullo. \\
- \macro{WIFCONTINUED(s)}& vera se il processo che ha causato il ritorno è
+ \macro{WIFCONTINUED(s)}& Vera se il processo che ha causato il ritorno è
stato riavviato da un
\const{SIGCONT}.\footnotemark \\
\hline
\textbf{Macro} & \textbf{Descrizione}\\
\hline
\hline
- \const{P\_PID} & indica la richiesta di attendere per un processo figlio
+ \const{P\_PID} & Indica la richiesta di attendere per un processo figlio
il cui \acr{pid} corrisponda al valore dell'argomento
\param{id}.\\
- \const{P\_PGID}& indica la richiesta di attendere per un processo figlio
+ \const{P\_PGID}& Indica la richiesta di attendere per un processo figlio
appartenente al \textit{process group} (vedi
sez.~\ref{sec:sess_proc_group}) il cui \acr{pgid}
corrisponda al valore dell'argomento \param{id}.\\
- \const{P\_ALL} & indica la richiesta di attendere per un processo figlio
+ \const{P\_ALL} & Indica la richiesta di attendere per un processo figlio
generico, il valore dell'argomento \param{id} viene
ignorato.\\
\hline
\textbf{Macro} & \textbf{Descrizione}\\
\hline
\hline
- \const{WEXITED} & ritorna quando un processo figlio è terminato. \\
- \const{WNOHANG} & ritorna immediatamente anche se non c'è niente da
+ \const{WEXITED} & Ritorna quando un processo figlio è terminato. \\
+ \const{WNOHANG} & Ritorna immediatamente anche se non c'è niente da
notificare. \\
- \const{WSTOPPED} & ritorna quando un processo figlio è stato fermato. \\
+ \const{WSTOPPED} & Ritorna quando un processo figlio è stato fermato. \\
\const{WCONTINUED}& ritorna quando un processo figlio che era stato
fermato ha ripreso l'esecuzione. \\
- \const{WNOWAIT} & lascia il processo ancora in attesa di ricezione, così
+ \const{WNOWAIT} & Lascia il processo ancora in attesa di ricezione, così
che una successiva chiamata possa di nuovo riceverne
lo stato. \\
\hline
%
% POSIX-draft defined capabilities.
%
- \const{CAP\_CHOWN} & la capacità di cambiare proprietario e gruppo
+ \const{CAP\_CHOWN} & La capacità di cambiare proprietario e gruppo
proprietario di un file (vedi
sez.~\ref{sec:file_ownership_management}).\\
- \const{CAP\_DAC\_OVERRIDE}& la capacità di evitare il controllo dei
+ \const{CAP\_DAC\_OVERRIDE}& La capacità di evitare il controllo dei
permessi di lettura, scrittura ed esecuzione dei
file, (vedi sez.~\ref{sec:file_access_control})
caratteristici del modello classico del
\itindex{Discrectionary~Access~Control~(DAC)}
\textit{Discrectionary Access Control} (da cui
il nome DAC).\\
- \const{CAP\_DAC\_READ\_SEARCH}& la capacità di evitare il controllo dei
+ \const{CAP\_DAC\_READ\_SEARCH}& La capacità di evitare il controllo dei
permessi di lettura, scrittura ed esecuzione per
le directory (vedi
sez.~\ref{sec:file_access_control}).\\
- \const{CAP\_FOWNER} & la capacità di evitare il controllo che
+ \const{CAP\_FOWNER} & La capacità di evitare il controllo che
l'user-ID effettivo del processo (o meglio il
\textit{filesystem user-ID}, vedi
sez.~\ref{sec:proc_setuid}) coincida con
\func{open} e \func{fcntl} (vedi
sez.~\ref{sec:file_open} e
sez.~\ref{sec:file_fcntl}).\\
- \const{CAP\_FSETID} & la capacità di evitare la cancellazione
+ \const{CAP\_FSETID} & La capacità di evitare la cancellazione
automatica dei bit \itindex{suid~bit} \acr{suid}
e \itindex{sgid~bit} \acr{sgid} quando un file
per i quali sono impostati viene modificato da
quando questo è relativo ad un gruppo cui non si
appartiene (vedi
sez.~\ref{sec:file_perm_management}).\\
- \const{CAP\_KILL} & la capacità di mandare segnali a qualunque
+ \const{CAP\_KILL} & La capacità di mandare segnali a qualunque
processo (vedi sez.~\ref{sec:sig_kill_raise}).\\
- \const{CAP\_SETGID} & la capacità di manipolare i group ID dei
+ \const{CAP\_SETGID} & La capacità di manipolare i group ID dei
processi, sia il principale che i supplementari,
(vedi sez.~\ref{sec:proc_setgroups} che quelli
trasmessi tramite i socket \textit{unix domain}
(vedi sez.~\ref{sec:unix_socket}).\\
- \const{CAP\_SETUID} & la capacità di manipolare gli user ID del
+ \const{CAP\_SETUID} & La capacità di manipolare gli user ID del
processo (con \func{setuid}, \func{setreuid},
\func{setresuid}, \func{setfsuid}) e di
trasmettere un valore arbitrario
% Linux specific capabilities
%
\hline
- \const{CAP\_SETPCAP} & la capacità di impostare o rimuovere una capacità
+ \const{CAP\_SETPCAP} & La capacità di impostare o rimuovere una capacità
(limitatamente a quelle che il processo
chiamante ha nel suo insieme di capacità
permesse) da qualunque processo.\\
\textit{append only} per i file su un
filesystem che supporta questi
attributi estesi.\\
- \const{CAP\_NET\_BIND\_SERVICE}& la capacità di porre in ascolto server
+ \const{CAP\_NET\_BIND\_SERVICE}& La capacità di porre in ascolto server
su porte riservate (vedi
sez.~\ref{sec:TCP_func_bind}).\\
- \const{CAP\_NET\_BROADCAST}& la capacità di consentire l'uso di socket in
+ \const{CAP\_NET\_BROADCAST}& La capacità di consentire l'uso di socket in
\itindex{broadcast} \textit{broadcast} e
\itindex{multicast} \textit{multicast}.\\
\const{CAP\_NET\_ADMIN} & la capacità di eseguire alcune operazioni
\itindex{multicast} \textit{multicasting},
impostare interfacce di rete e
tabella di instradamento).\\
- \const{CAP\_NET\_RAW} & la capacità di usare socket \texttt{RAW} e
+ \const{CAP\_NET\_RAW} & La capacità di usare socket \texttt{RAW} e
\texttt{PACKET} (quelli che permettono di creare
pacchetti nei protocolli di basso livello).\\
- \const{CAP\_IPC\_LOCK} & la capacità di effettuare il \textit{memory
+ \const{CAP\_IPC\_LOCK} & La capacità di effettuare il \textit{memory
locking} \itindex{memory~locking} con le
funzioni \func{mlock}, \func{mlockall},
\func{shmctl}, \func{mmap} (vedi
sez.~\ref{sec:proc_mem_lock} e
sez.~\ref{sec:file_memory_map}). \\
- \const{CAP\_IPC\_OWNER} & la capacità di evitare il controllo dei permessi
+ \const{CAP\_IPC\_OWNER} & La capacità di evitare il controllo dei permessi
per le operazioni sugli oggetti di
intercomunicazione fra processi (vedi
sez.~\ref{sec:ipc_sysv}).\\
- \const{CAP\_SYS\_MODULE}& la capacità di caricare e rimuovere moduli del
+ \const{CAP\_SYS\_MODULE}& La capacità di caricare e rimuovere moduli del
kernel. \\
- \const{CAP\_SYS\_RAWIO} & la capacità di eseguire operazioni sulle porte
+ \const{CAP\_SYS\_RAWIO} & La capacità di eseguire operazioni sulle porte
di I/O con \func{ioperm} e \func{iopl} (vedi
sez.~\ref{sec:file_io_port}).\\
- \const{CAP\_SYS\_CHROOT}& la capacità di eseguire la funzione
+ \const{CAP\_SYS\_CHROOT}& La capacità di eseguire la funzione
\func{chroot} (vedi
sez.~\ref{sec:file_chroot}).\\
- \const{CAP\_SYS\_PTRACE}& consente di tracciare qualunque processo con
+ \const{CAP\_SYS\_PTRACE}& Consente di tracciare qualunque processo con
\func{ptrace} (vedi
sez.~\ref{sec:xxx_ptrace}).\\
-% TODO documentatare ptrace
- \const{CAP\_SYS\_PACCT} & la capacità di usare le funzioni di
+ \const{CAP\_SYS\_PACCT} & La capacità di usare le funzioni di
\textit{accounting} dei processi (vedi
sez.~\ref{sec:sys_bsd_accounting}).\\
- \const{CAP\_SYS\_ADMIN} & la capacità di eseguire una serie di compiti
+ \const{CAP\_SYS\_ADMIN} & La capacità di eseguire una serie di compiti
amministrativi (come impostare le quote,
attivare e disattivare la swap, montare,
rimontare e smontare filesystem, ecc.). \\
- \const{CAP\_SYS\_BOOT} & la capacità di fare eseguire un riavvio del
+ \const{CAP\_SYS\_BOOT} & La capacità di fare eseguire un riavvio del
sistema.\\
- \const{CAP\_SYS\_NICE} & la capacità di modificare le priorità dei
+ \const{CAP\_SYS\_NICE} & La capacità di modificare le priorità dei
processi (vedi sez.~\ref{sec:proc_priority}). \\
\const{CAP\_SYS\_RESOURCE}& la capacità di superare le limitazioni sulle
risorse, aumentare le quote disco, usare lo
spazio disco riservato all'amministratore.\\
- \const{CAP\_SYS\_TIME} & la capacità di modificare il tempo di sistema
+ \const{CAP\_SYS\_TIME} & La capacità di modificare il tempo di sistema
(vedi sez.~\ref{sec:sys_time}).\\
\const{CAP\_SYS\_TTY\_CONFIG}& la capacità di simulare un \textit{hangup}
della console, con la funzione
\func{vhangup}.\\
- \const{CAP\_MKNOD} & la capacità di creare file di dispositivo con la
+ \const{CAP\_MKNOD} & La capacità di creare file di dispositivo con la
funzione \func{mknod} (vedi
sez.~\ref{sec:file_mknod}).\footnotemark\\
- \const{CAP\_LEASE} & la capacità di creare dei \textit{file lease}
+ \const{CAP\_LEASE} & La capacità di creare dei \textit{file lease}
\index{file!lease} su di un file (vedi
sez.~\ref{sec:file_asyncronous_lease})
indipendentemente dalla proprietà dello
stesso.\footnotemark\\
- \const{CAP\_SETFCAP} & la capacità di impostare le
+ \const{CAP\_SETFCAP} & La capacità di impostare le
\textit{capabilities} di un file (non
supportata).\\
\hline
\textbf{Policy} & \textbf{Significato} \\
\hline
\hline
- \const{SCHED\_FIFO} & Scheduling real-time con politica \textit{FIFO} \\
+ \const{SCHED\_FIFO} & Scheduling real-time con politica \textit{FIFO}. \\
\const{SCHED\_RR} & Scheduling real-time con politica \textit{Round
- Robin} \\
- \const{SCHED\_OTHER}& Scheduling ordinario\\
+ Robin}. \\
+ \const{SCHED\_OTHER}& Scheduling ordinario.\\
\hline
\end{tabular}
\caption{Valori dell'argomento \param{policy} per la funzione
\hline
\hline
\const{LOG\_AUTH} & Messaggi relativi ad autenticazione e sicurezza,
- obsoleto, è sostituito da \const{LOG\_AUTHPRIV}. \\
+ obsoleto, è sostituito da \const{LOG\_AUTHPRIV}.\\
\const{LOG\_AUTHPRIV} & Sostituisce \const{LOG\_AUTH}.\\
\const{LOG\_CRON} & Messaggi dei demoni di gestione dei comandi
programmati (\cmd{cron} e \cmd{at}).\\
\const{LOG\_DAEMON} & Demoni di sistema.\\
\const{LOG\_FTP} & Server FTP.\\
- \const{LOG\_KERN} & Messaggi del kernel\\
- \const{LOG\_LOCAL0} & Riservato all'amministratore per uso locale\\
+ \const{LOG\_KERN} & Messaggi del kernel.\\
+ \const{LOG\_LOCAL0} & Riservato all'amministratore per uso locale.\\
--- & \\
- \const{LOG\_LOCAL7} & Riservato all'amministratore per uso locale\\
- \const{LOG\_LPR} & Messaggi del sistema di gestione delle stampanti \\
- \const{LOG\_MAIL} & Messaggi del sistema di posta elettronica\\
+ \const{LOG\_LOCAL7} & Riservato all'amministratore per uso locale.\\
+ \const{LOG\_LPR} & Messaggi del sistema di gestione delle stampanti.\\
+ \const{LOG\_MAIL} & Messaggi del sistema di posta elettronica.\\
\const{LOG\_NEWS} & Messaggi del sistema di gestione delle news
- (USENET) \\
- \const{LOG\_SYSLOG} & Messaggi generati dallo stesso \cmd{syslogd}\\
- \const{LOG\_USER} & Messaggi generici a livello utente\\
- \const{LOG\_UUCP} & Messaggi del sistema UUCP\\
+ (USENET).\\
+ \const{LOG\_SYSLOG} & Messaggi generati dallo stesso \cmd{syslogd}.\\
+ \const{LOG\_USER} & Messaggi generici a livello utente.\\
+ \const{LOG\_UUCP} & Messaggi del sistema UUCP.\\
\hline
\end{tabular}
\caption{Valori possibili per l'argomento \param{facility} di \func{openlog}.}
\const{LOG\_NDELAY} & Sostituisce \const{LOG\_AUTH}.\\
\const{LOG\_NOWAIT} & Messaggi dei demoni di gestione dei comandi
programmati (\cmd{cron} e \cmd{at}).\\
-\const{LOG\_ODELAY} & .\\
+\const{LOG\_ODELAY} & \\
\const{LOG\_PERROR} & Stampa anche su \file{stderr}.\\
\const{LOG\_PID} & Inserisce nei messaggi il \acr{pid} del processo
- chiamante. \\
+ chiamante.\\
\hline
\end{tabular}
\caption{Valori possibili per l'argomento \param{option} di \func{openlog}.}
\textbf{Valore}& \textbf{Significato}\\
\hline
\hline
- \const{LOG\_EMERG} & Il sistema è inutilizzabile. \\
+ \const{LOG\_EMERG} & Il sistema è inutilizzabile.\\
\const{LOG\_ALERT} & C'è una emergenza che richiede intervento
immediato.\\
\const{LOG\_CRIT} & Si è in una condizione critica.\\
\const{LOG\_ERR} & Si è in una condizione di errore.\\
\const{LOG\_WARNING} & Messaggio di avvertimento.\\
\const{LOG\_NOTICE} & Notizia significativa relativa al comportamento.\\
- \const{LOG\_INFO} & Messaggio informativo. \\
+ \const{LOG\_INFO} & Messaggio informativo.\\
\const{LOG\_DEBUG} & Messaggio di debug.\\
\hline
\end{tabular}
\const{IGNBRK} & Ignora le condizioni di BREAK sull'input. Una
\textit{condizione di BREAK} è definita nel contesto di
una trasmissione seriale asincrona come una sequenza di
- bit nulli più lunga di un byte. \\
+ bit nulli più lunga di un byte.\\
\const{BRKINT} & Controlla la reazione ad un BREAK quando
\const{IGNBRK} non è impostato. Se \const{BRKINT} è
impostato il BREAK causa lo scarico delle code,
(\textit{carriage return}, \verb|'\r'|) viene scartato
dall'input. Può essere utile per i terminali che inviano
entrambi i caratteri di ritorno carrello e a capo
- (\textit{newline}, \verb|'\n'|). \\
+ (\textit{newline}, \verb|'\n'|).\\
\const{ICRNL} & Se impostato un carattere di ritorno carrello
(\verb|'\r'|) sul terminale viene automaticamente
trasformato in un a capo (\verb|'\n'|) sulla coda di
- input. \\
+ input.\\
\const{INLCR} & Se impostato il carattere di a capo
(\verb|'\n'|) viene automaticamente trasformato in un
ritorno carrello (\verb|'\r'|).\\
\const{IXOFF} & Se impostato abilita il controllo di flusso in
ingresso. Il computer emette un carattere di STOP per
bloccare l'input dal terminale e lo sblocca con il
- carattere START. \\
+ carattere START.\\
\const{IMAXBEL}& Se impostato fa suonare il cicalino se si riempie la cosa
di ingresso; in Linux non è implementato e il kernel si
comporta cose se fosse sempre impostato (è una estensione
- BSD). \\
+ BSD).\\
\hline
\end{tabular}
\caption{Costanti identificative dei vari bit del flag di controllo
\const{O\_NOBLOCK} si bloccherà il processo finché
non si è stabilita una connessione con il modem; inoltre
se viene rilevata una disconnessione viene inviato un
- segnale di
- \const{SIGHUP} al processo di controllo del terminale. La
- lettura su un terminale sconnesso comporta una condizione
- di \textit{end of file} e la scrittura un errore di
- \errcode{EIO}. \\
+ segnale di \const{SIGHUP} al processo di controllo del
+ terminale. La lettura su un terminale sconnesso comporta
+ una condizione di \textit{end of file} e la scrittura un
+ errore di \errcode{EIO}.\\
\const{HUPCL} & Se è impostato viene distaccata la connessione del
modem quando l'ultimo dei processi che ha ancora un file
aperto sul terminale lo chiude o esce.\\
parità. La reazione in caso di errori dipende dai
relativi valori per \var{c\_iflag}, riportati in
tab.~\ref{tab:sess_termios_iflag}. Se non è impostato i
- bit di parità non vengono
- generati e i caratteri non vengono controllati.\\
+ bit di parità non vengono generati e i caratteri non
+ vengono controllati.\\
\const{PARODD} & Ha senso solo se è attivo anche \const{PARENB}. Se
impostato viene usata una parità è dispari, altrimenti
viene usata una parità pari.\\
\const{CSIZE} & Maschera per i bit usati per specificare la dimensione
del carattere inviato lungo la linea di trasmissione, i
valore ne indica la lunghezza (in bit), ed i valori
- possibili sono \val{CS5}, \val{CS6},
- \val{CS7} e \val{CS8}
+ possibili sono \val{CS5}, \val{CS6}, \val{CS7} e \val{CS8}
corrispondenti ad un analogo numero di bit.\\
\const{CBAUD} & Maschera dei bit (4+1) usati per impostare della velocità
- della linea (il \textit{baud rate}) in ingresso.
- In Linux non è implementato in quanto viene
- usato un apposito campo di \struct{termios}.\\
+ della linea (il \textit{baud rate}) in ingresso; in Linux
+ non è implementato in quanto viene usato un apposito
+ campo di \struct{termios}.\\
\const{CBAUDEX}& Bit aggiuntivo per l'impostazione della velocità della
linea, per le stesse motivazioni del precedente non è
implementato in Linux.\\
\const{CIBAUD} & Maschera dei bit della velocità della linea in
- ingresso. Analogo a \const{CBAUD}, anch'esso in Linux è
- mantenuto in un apposito campo di \struct{termios}. \\
+ ingresso; analogo a \const{CBAUD}, anch'esso in Linux è
+ mantenuto in un apposito campo di \struct{termios}.\\
\const{CRTSCTS}& Abilita il controllo di flusso hardware sulla seriale,
attraverso l'utilizzo delle dei due fili di RTS e CTS.\\
\hline
cancellando l'ultimo carattere della riga corrente dallo
schermo; altrimenti il carattere è rimandato in eco per
mostrare quanto accaduto (usato per i terminali con
- l'uscita su una stampante). \\
+ l'uscita su una stampante).\\
\const{ECHOPRT}& Se impostato abilita la visualizzazione del carattere di
cancellazione in una modalità adatta ai terminali con
l'uscita su stampante; l'invio del carattere di ERASE
\const{ECHOE} e \const{ECHOPRT}.\\
\const{ECHONL} & Se impostato viene effettuato l'eco di un a
capo (\verb|\n|) anche se non è stato impostato
- \const{ECHO}. \\
+ \const{ECHO}.\\
\const{ECHOCTL}& Se impostato insieme ad \const{ECHO} i caratteri di
controllo ASCII (tranne TAB, NL, START, e STOP) sono
mostrati nella forma che prepone un ``\texttt{\circonf}''
\const{IEXTEN} & Abilita alcune estensioni previste dalla
implementazione. Deve essere impostato perché caratteri
speciali come EOL2, LNEXT, REPRINT e WERASE possano
- essere interpretati. \\
+ essere interpretati.\\
\const{NOFLSH} & Se impostato disabilita lo scarico delle code di ingresso
e uscita quando vengono emessi i segnali \const{SIGINT},
\const{SIGQUIT} e \const{SIGSUSP}.\\
\hline
\const{VINTR} &\texttt{0x03}&(\texttt{C-c})& Carattere di interrupt,
provoca l'emissione di
- \const{SIGINT}. \\
+ \const{SIGINT}.\\
\const{VQUIT} &\texttt{0x1C}&(\texttt{C-|})& Carattere di uscita provoca
l'emissione di
\const{SIGQUIT}.\\
\const{VEOL} &\texttt{0x00}& NUL & Carattere di fine riga. Agisce come
un a capo, ma non viene scartato ed
è letto come l'ultimo carattere
- nella riga. \\
+ nella riga.\\
\const{VREPRINT}&\texttt{0x12}&(\texttt{C-r})& Ristampa i caratteri non
- ancora letti. \\
+ ancora letti.\\
\const{VDISCARD}&\texttt{0x07}&(\texttt{C-o})& Non riconosciuto in Linux.\\
\const{VWERASE}&\texttt{0x17}&(\texttt{C-w})&Cancellazione di una
parola.\\
quotare il carattere
successivo che non viene
interpretato ma passato
- direttamente all'output. \\
+ direttamente all'output.\\
\const{VEOL2} &\texttt{0x00}& NUL & Ulteriore carattere di fine
riga. Ha lo stesso effetto di
\const{VEOL} ma può essere un
\textbf{Valore}& \textbf{Significato}\\
\hline
\hline
- \const{TCSANOW} & Esegue i cambiamenti in maniera immediata. \\
+ \const{TCSANOW} & Esegue i cambiamenti in maniera immediata.\\
\const{TCSADRAIN}& I cambiamenti vengono eseguiti dopo aver atteso che
- tutto l'output presente sulle code è stato scritto. \\
+ tutto l'output presente sulle code è stato scritto.\\
\const{TCSAFLUSH}& È identico a \const{TCSADRAIN}, ma in più scarta
tutti i dati presenti sulla coda di input.\\
\hline
\textbf{Valore}& \textbf{Significato}\\
\hline
\hline
- \const{TCIFLUSH} & Cancella i dati sulla coda di ingresso. \\
+ \const{TCIFLUSH} & Cancella i dati sulla coda di ingresso.\\
\const{TCOFLUSH} & Cancella i dati sulla coda di uscita. \\
\const{TCIOFLUSH}& Cancella i dati su entrambe le code.\\
\hline
\const{TCOOFF}& Sospende l'output.\\
\const{TCOON} & Riprende un output precedentemente sospeso.\\
\const{TCIOFF}& Il sistema trasmette un carattere di STOP, che
- fa interrompere la trasmissione dei dati dal terminale. \\
+ fa interrompere la trasmissione dei dati dal terminale.\\
\const{TCION} & Il sistema trasmette un carattere di START, che
fa riprendere la trasmissione dei dati dal terminale.\\
\hline
\textbf{Sigla} & \textbf{Significato} \\
\hline
\hline
- A & L'azione predefinita è terminare il processo. \\
- B & L'azione predefinita è ignorare il segnale. \\
+ A & L'azione predefinita è terminare il processo.\\
+ B & L'azione predefinita è ignorare il segnale.\\
C & L'azione predefinita è terminare il processo e scrivere un
- \itindex{core~dump} \textit{core dump}. \\
- D & L'azione predefinita è fermare il processo. \\
- E & Il segnale non può essere intercettato. \\
+ \itindex{core~dump} \textit{core dump}.\\
+ D & L'azione predefinita è fermare il processo.\\
+ E & Il segnale non può essere intercettato.\\
F & Il segnale non può essere ignorato.\\
\hline
\end{tabular}
\textbf{Sigla} & \textbf{Standard} \\
\hline
\hline
- P & POSIX. \\
- B & BSD. \\
- L & Linux.\\
- S & SUSv2.\\
+ P & POSIX \\
+ B & BSD \\
+ L & Linux \\
+ S & SUSv2 \\
\hline
\end{tabular}
\caption{Legenda dei valori della colonna \textbf{Standard} di
\textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- $>0$ & il segnale è mandato al processo con il \acr{pid} indicato.\\
- 0 & il segnale è mandato ad ogni processo del \itindex{process~group}
+ $>0$ & Il segnale è mandato al processo con il \acr{pid} indicato.\\
+ 0 & Il segnale è mandato ad ogni processo del \itindex{process~group}
\textit{process group} del chiamante.\\
- $-1$ & il segnale è mandato ad ogni processo (eccetto \cmd{init}).\\
- $<-1$ & il segnale è mandato ad ogni processo del \textit{process group}
+ $-1$ & Il segnale è mandato ad ogni processo (eccetto \cmd{init}).\\
+ $<-1$ & Il segnale è mandato ad ogni processo del \textit{process group}
\itindex{process~group} $|\code{pid}|$.\\
\hline
\end{tabular}
lanciato, riproduce cioè il comportamento della
semantica inaffidabile.\\
\const{SA\_ONESHOT} & Nome obsoleto, sinonimo non standard di
- \const{SA\_RESETHAND}; da evitare. \\
+ \const{SA\_RESETHAND}; da evitare.\\
\const{SA\_ONSTACK} & Stabilisce l'uso di uno \itindex{stack} stack
alternativo per l'esecuzione del gestore (vedi
sez.~\ref{sec:sig_specific_features}).\\
--- /dev/null
+/* inotify_monitor.c
+ *
+ * Copyright (C) 2007 Simone Piccardi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*****************************************************************************
+ *
+ * File inotufy_monitor.c:
+ *
+ * An example for shared memory use: monitor a directory status,
+ * saving data in a shared memory segment
+ *
+ * Author: S. Piccardi Jul. 2007
+ *
+ *****************************************************************************/
+#include <sys/types.h>
+#include <sys/inotify.h>
+#include <stdlib.h> /* C standard library */
+#include <unistd.h>
+#include <errno.h> /* error definitions and routines */
+#include <stdio.h> /* standard I/O library */
+#include <string.h> /* string functions */
+
+
+#include "macros.h"
+
+/* Help printing routine */
+void usage(void);
+
+int main(int argc, char *argv[])
+{
+ int i;
+ int fd;
+ unsigned int mask=0;
+ /*
+ * Input section: decode command line parameters
+ * Use getopt function
+ */
+ opterr = 0; /* don't want writing to stderr */
+ while ( (i = getopt(argc, argv, "hrwcda")) != -1) {
+ switch (i) {
+ /*
+ * Handling options
+ */
+ case 'h': /* help option */
+ printf("Wrong -h option use\n");
+ usage();
+ return -1;
+ break;
+ case 'r': /* read access */
+ mask |= IN_ACCESS;
+ break;
+ case 'w': /* write access */
+ mask |= IN_MODIFY;
+ break;
+ case 'c': /* creation */
+ mask |= IN_CREATE;
+ break;
+ case 'd': /* deletion */
+ mask |= IN_DELETE;
+ break;
+ case 'a': /* all events */
+ mask |= IN_ALL_EVENTS;
+ break;
+ case '?': /* unrecognized options */
+ printf("Unrecognized options -%c\n",optopt);
+ usage();
+ default: /* should not reached */
+ usage();
+ }
+ }
+ /* ***********************************************************
+ *
+ * Options processing completed
+ *
+ * Main code beginning
+ *
+ * ***********************************************************/
+ if ((argc - optind) != 1) { /* There must be remaing parameters */
+ printf("Wrong number of arguments %d\n", argc - optind);
+ usage();
+ }
+ /* initalialize */
+ fd = inotify_init ();
+ if (fd < 0)
+ perror("Failing on inotify_init");
+
+ /* add watch */
+ if (inotify_add_watch(fd, argv[1], mask) != 0) {
+ printf("Failing to add watched file %s; %s\n",
+ argv[1], strerror(errno));
+ exit(-1);
+ }
+
+ return 0;
+
+}
+/*
+ * routine to print usage info and exit
+ */
+void usage(void) {
+ printf("Program inotify_monitor: monitor file changes \n");
+ printf("Usage:\n");
+ printf(" inotify_monitor [-h] -rwcd dirname/filename \n");
+ printf(" -h print this help\n");
+ printf(" -w watch write\n");
+ printf(" -r watch read\n");
+ printf(" -c watch create\n");
+ printf(" -d watch delete\n");
+ printf(" -a watch all\n");
+ exit(1);
+}
\textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \const{ARG\_MAX} &131072& dimensione massima degli argomenti
+ \const{ARG\_MAX} &131072& Dimensione massima degli argomenti
passati ad una funzione della famiglia
\func{exec}.\\
- \const{CHILD\_MAX} & 999& numero massimo di processi contemporanei
+ \const{CHILD\_MAX} & 999& Numero massimo di processi contemporanei
che un utente può eseguire.\\
- \const{OPEN\_MAX} & 256& numero massimo di file che un processo
+ \const{OPEN\_MAX} & 256& Numero massimo di file che un processo
può mantenere aperti in contemporanea.\\
- \const{STREAM\_MAX}& 8& massimo numero di stream aperti per
+ \const{STREAM\_MAX}& 8& Massimo numero di stream aperti per
processo in contemporanea.\\
- \const{TZNAME\_MAX}& 6& dimensione massima del nome di una
+ \const{TZNAME\_MAX}& 6& Dimensione massima del nome di una
\texttt{timezone} (vedi
sez.~\ref{sec:sys_time_base})).\\
- \const{NGROUPS\_MAX}& 32& numero di gruppi supplementari per
+ \const{NGROUPS\_MAX}& 32& Numero di gruppi supplementari per
processo (vedi sez.~\ref{sec:proc_access_id}).\\
- \const{SSIZE\_MAX}&32767& valore massimo del tipo \type{ssize\_t}.\\
- \hline
+ \const{SSIZE\_MAX}&32767& Valore massimo del tipo \type{ssize\_t}.\\
\hline
\end{tabular}
\caption{Costanti per i limiti del sistema.}
\textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \const{\_POSIX\_ARG\_MAX} & 4096& dimensione massima degli argomenti
+ \const{\_POSIX\_ARG\_MAX} & 4096& Dimensione massima degli argomenti
passati ad una funzione della famiglia
\func{exec}.\\
- \const{\_POSIX\_CHILD\_MAX} & 6& numero massimo di processi
+ \const{\_POSIX\_CHILD\_MAX} & 6& Numero massimo di processi
contemporanei che un utente può
eseguire.\\
- \const{\_POSIX\_OPEN\_MAX} & 16& numero massimo di file che un processo
+ \const{\_POSIX\_OPEN\_MAX} & 16& Numero massimo di file che un processo
può mantenere aperti in
contemporanea.\\
- \const{\_POSIX\_STREAM\_MAX} & 8& massimo numero di stream aperti per
+ \const{\_POSIX\_STREAM\_MAX} & 8& Massimo numero di stream aperti per
processo in contemporanea.\\
- \const{\_POSIX\_TZNAME\_MAX} & & dimensione massima del nome di una
+ \const{\_POSIX\_TZNAME\_MAX} & & Dimensione massima del nome di una
\textit{timezone} (vedi
sez.~\ref{sec:sys_date}). \\
- \const{\_POSIX\_NGROUPS\_MAX}& 0& numero di gruppi supplementari per
+ \const{\_POSIX\_NGROUPS\_MAX}& 0& Numero di gruppi supplementari per
processo (vedi
sez.~\ref{sec:proc_access_id}).\\
- \const{\_POSIX\_SSIZE\_MAX} &32767& valore massimo del tipo
+ \const{\_POSIX\_SSIZE\_MAX} &32767& Valore massimo del tipo
\type{ssize\_t}.\\
\const{\_POSIX\_AIO\_LISTIO\_MAX}&2& \\
\const{\_POSIX\_AIO\_MAX} & 1& \\
\hline
- \hline
\end{tabular}
\caption{Macro dei valori minimi delle caratteristiche generali del sistema
per la conformità allo standard POSIX.1.}
\textbf{Macro}&\textbf{Significato}\\
\hline
\hline
- \macro{\_POSIX\_JOB\_CONTROL}& il sistema supporta il
+ \macro{\_POSIX\_JOB\_CONTROL}& Il sistema supporta il
\textit{job control} (vedi
sez.~\ref{sec:sess_job_control}).\\
- \macro{\_POSIX\_SAVED\_IDS} & il sistema supporta gli identificatori del
+ \macro{\_POSIX\_SAVED\_IDS} & Il sistema supporta gli identificatori del
gruppo \textit{saved} (vedi
sez.~\ref{sec:proc_access_id})
per il controllo di accesso dei processi\\
- \const{\_POSIX\_VERSION} & fornisce la versione dello standard POSIX.1
+ \const{\_POSIX\_VERSION} & Fornisce la versione dello standard POSIX.1
supportata nel formato YYYYMML (ad esempio
199009L).\\
\hline
\textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \const{LINK\_MAX} &8 & numero massimo di link a un file\\
- \const{NAME\_MAX}& 14 & lunghezza in byte di un nome di file. \\
- \const{PATH\_MAX}& 256 & lunghezza in byte di un
+ \const{LINK\_MAX} &8 & Numero massimo di link a un file.\\
+ \const{NAME\_MAX}& 14 & Lunghezza in byte di un nome di file. \\
+ \const{PATH\_MAX}& 256 & Lunghezza in byte di un
\itindex{pathname} \textit{pathname}.\\
- \const{PIPE\_BUF}&4096 & byte scrivibili atomicamente in una pipe
+ \const{PIPE\_BUF}&4096 & Byte scrivibili atomicamente in una pipe
(vedi sez.~\ref{sec:ipc_pipes}).\\
- \const{MAX\_CANON}&255 & dimensione di una riga di terminale in modo
+ \const{MAX\_CANON}&255 & Dimensione di una riga di terminale in modo
canonico (vedi sez.~\ref{sec:term_design}).\\
- \const{MAX\_INPUT}&255 & spazio disponibile nella coda di input
+ \const{MAX\_INPUT}&255 & Spazio disponibile nella coda di input
del terminale (vedi
sez.~\ref{sec:term_design}).\\
\hline
\textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \const{\_POSIX\_LINK\_MAX} &8 & numero massimo di link a un file.\\
- \const{\_POSIX\_NAME\_MAX}& 14 & lunghezza in byte di un nome di file. \\
- \const{\_POSIX\_PATH\_MAX}& 256 & lunghezza in byte di un
- \itindex{pathname} \textit{pathname}.\\
- \const{\_POSIX\_PIPE\_BUF}& 512 & byte scrivibili atomicamente in una
- pipe.\\
- \const{\_POSIX\_MAX\_CANON}&255 & dimensione di una riga di
- terminale in modo canonico.\\
- \const{\_POSIX\_MAX\_INPUT}&255 & spazio disponibile nella coda di input
- del terminale.\\
+ \const{\_POSIX\_LINK\_MAX} &8 & Numero massimo di link a un file.\\
+ \const{\_POSIX\_NAME\_MAX}& 14 & Lunghezza in byte di un nome di file.\\
+ \const{\_POSIX\_PATH\_MAX}& 256 & Lunghezza in byte di un
+ \itindex{pathname} \textit{pathname}.\\
+ \const{\_POSIX\_PIPE\_BUF}& 512 & Byte scrivibili atomicamente in una
+ pipe.\\
+ \const{\_POSIX\_MAX\_CANON}&255 & Dimensione di una riga di
+ terminale in modo canonico.\\
+ \const{\_POSIX\_MAX\_INPUT}&255 & Spazio disponibile nella coda di input
+ del terminale.\\
% \const{\_POSIX\_MQ\_OPEN\_MAX}& 8& \\
% \const{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\
% \const{\_POSIX\_FD\_SETSIZE}& 16 & \\
\textbf{Parametro} & \textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \const{MS\_RDONLY} & 1 & monta in sola lettura.\\
- \const{MS\_NOSUID} & 2 & ignora i bit \itindex{suid~bit} \acr{suid} e
+ \const{MS\_RDONLY} & 1 & Monta in sola lettura.\\
+ \const{MS\_NOSUID} & 2 & Ignora i bit \itindex{suid~bit} \acr{suid} e
\itindex{sgid~bit} \acr{sgid}.\\
- \const{MS\_NODEV} & 4 & impedisce l'accesso ai file di dispositivo.\\
- \const{MS\_NOEXEC} & 8 & impedisce di eseguire programmi.\\
- \const{MS\_SYNCHRONOUS}& 16 & abilita la scrittura sincrona.\\
- \const{MS\_REMOUNT} & 32 & rimonta il filesystem cambiando le opzioni.\\
- \const{MS\_MANDLOCK} & 64 & consente il \textit{mandatory locking}
+ \const{MS\_NODEV} & 4 & Impedisce l'accesso ai file di dispositivo.\\
+ \const{MS\_NOEXEC} & 8 & Impedisce di eseguire programmi.\\
+ \const{MS\_SYNCHRONOUS}& 16 & Abilita la scrittura sincrona.\\
+ \const{MS\_REMOUNT} & 32 & Rimonta il filesystem cambiando le opzioni.\\
+ \const{MS\_MANDLOCK} & 64 & Consente il \textit{mandatory locking}
\itindex{mandatory~locking} (vedi
sez.~\ref{sec:file_mand_locking}).\\
- \const{S\_WRITE} & 128 & scrive normalmente.\\
- \const{S\_APPEND} & 256 & consente la scrittura solo in
+ \const{S\_WRITE} & 128 & Scrive normalmente.\\
+ \const{S\_APPEND} & 256 & Consente la scrittura solo in
\itindex{append~mode} \textit{append mode}
(vedi sez.~\ref{sec:file_sharing}).\\
- \const{S\_IMMUTABLE} & 512 & impedisce che si possano modificare i file.\\
- \const{MS\_NOATIME} &1024 & non aggiorna gli \textit{access time} (vedi
+ \const{S\_IMMUTABLE} & 512 & Impedisce che si possano modificare i file.\\
+ \const{MS\_NOATIME} &1024 & Non aggiorna gli \textit{access time} (vedi
sez.~\ref{sec:file_file_times}).\\
- \const{MS\_NODIRATIME}&2048 & non aggiorna gli \textit{access time} delle
+ \const{MS\_NODIRATIME}&2048 & Non aggiorna gli \textit{access time} delle
directory.\\
- \const{MS\_BIND} &4096 & monta il filesystem altrove.\\
- \const{MS\_MOVE} &8192 & sposta atomicamente il punto di montaggio.\\
+ \const{MS\_BIND} &4096 & Monta il filesystem altrove.\\
+ \const{MS\_MOVE} &8192 & Sposta atomicamente il punto di montaggio.\\
\hline
\end{tabular}
\caption{Tabella dei codici dei flag di montaggio di un filesystem.}
\textbf{Valore} & \textbf{Significato}\\
\hline
\hline
- \const{EMPTY} & Non contiene informazioni valide. \\
- \const{RUN\_LVL} & Identica il runlevel del sistema. \\
- \const{BOOT\_TIME} & Identifica il tempo di avvio del sistema \\
+ \const{EMPTY} & Non contiene informazioni valide.\\
+ \const{RUN\_LVL} & Identica il runlevel del sistema.\\
+ \const{BOOT\_TIME} & Identifica il tempo di avvio del sistema.\\
\const{OLD\_TIME} & Identifica quando è stato modificato l'orologio di
- sistema. \\
+ sistema.\\
\const{NEW\_TIME} & Identifica da quanto è stato modificato il
- sistema. \\
- \const{INIT\_PROCESS} & Identifica un processo lanciato da \cmd{init}. \\
- \const{LOGIN\_PROCESS}& Identifica un processo di login. \\
- \const{USER\_PROCESS} & Identifica un processo utente. \\
- \const{DEAD\_PROCESS} & Identifica un processo terminato. \\
+ sistema.\\
+ \const{INIT\_PROCESS} & Identifica un processo lanciato da \cmd{init}.\\
+ \const{LOGIN\_PROCESS}& Identifica un processo di login.\\
+ \const{USER\_PROCESS} & Identifica un processo utente.\\
+ \const{DEAD\_PROCESS} & Identifica un processo terminato.\\
% \const{ACCOUNTING} & ??? \\
\hline
\end{tabular}
\errcode{ENOMEM}, mentre se il superamento viene
causato dalla crescita dello \itindex{stack}
stack il processo riceverà un segnale di
- \const{SIGSEGV}. \\
+ \const{SIGSEGV}.\\
\const{RLIMIT\_CORE} & La massima dimensione per di un file di
\itindex{core~dump} \textit{core dump} (vedi
sez.~\ref{sec:sig_prog_error}) creato nella
\hline
\hline
\const{TIME\_OK} & 0 & L'orologio è sincronizzato.\\
- \const{TIME\_INS} & 1 & insert leap second.\\
- \const{TIME\_DEL} & 2 & delete leap second.\\
- \const{TIME\_OOP} & 3 & leap second in progress.\\
- \const{TIME\_WAIT} & 4 & leap second has occurred.\\
+ \const{TIME\_INS} & 1 & Insert leap second.\\
+ \const{TIME\_DEL} & 2 & Delete leap second.\\
+ \const{TIME\_OOP} & 3 & Leap second in progress.\\
+ \const{TIME\_WAIT} & 4 & Leap second has occurred.\\
\const{TIME\_BAD} & 5 & L'orologio non è sincronizzato.\\
\hline
\end{tabular}