From: Simone Piccardi Date: Sat, 14 Jul 2007 18:05:05 +0000 (+0000) Subject: Uniformate la tabelle, riletta la sezione su epoll, altre correzioni X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=60e20d29c0515f95b8a171fb33c7214c9bf92021 Uniformate la tabelle, riletta la sezione su epoll, altre correzioni sparse, creta nuova sezione nel capitolo su file e directory per trattare ACL e attributi estesi, rilettura dnotify, inizio di esempio per inotify, inizio di trattazione di sendfile, introduzione sulla sezione di controllo del caching dei file. --- diff --git a/fileadv.tex b/fileadv.tex index 1286c56..90157c7 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -410,13 +410,13 @@ nel campo \var{revents} per notificare delle condizioni di errore. \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.\\ @@ -668,15 +668,15 @@ delle operazioni cui fanno riferimento. \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} @@ -848,38 +848,45 @@ La funzione ritorna il numero di eventi rilevati, o un valore nullo qualora 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}. @@ -989,7 +996,7 @@ diventati attivi. L'unico modo per essere sicuri che questo non avvenga 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 @@ -1004,27 +1011,29 @@ risposta\footnote{o meglio la non risposta, tanto che questa nelle Unix FAQ \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}. @@ -1153,13 +1162,19 @@ risolvere il problema di rilevare automaticamente quando un file o una 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|)} @@ -1189,7 +1204,7 @@ tramite il contenuto della struttura \struct{siginfo\_t}. \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} @@ -1221,30 +1236,33 @@ specificare un valore nullo. 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)} @@ -1266,22 +1284,22 @@ attraverso la funzione \funcd{inotify\_init}, il cui prototipo 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 @@ -1328,30 +1346,32 @@ per una directory, vengono osservati anche su tutti i file che essa contiene. \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 @@ -1359,7 +1379,7 @@ per una directory, vengono osservati anche su tutti i file che essa contiene. \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 @@ -2016,7 +2036,7 @@ tab.~\ref{tab:file_mmap_flag}. 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 @@ -2024,7 +2044,7 @@ tab.~\ref{tab:file_mmap_flag}. 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 @@ -2034,13 +2054,13 @@ tab.~\ref{tab:file_mmap_flag}. 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} @@ -2048,7 +2068,7 @@ tab.~\ref{tab:file_mmap_flag}. 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 @@ -2066,9 +2086,9 @@ tab.~\ref{tab:file_mmap_flag}. 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.\\ @@ -2422,7 +2442,7 @@ nuova system call, \funcd{remap\_file\_pages}, il cui prototipo 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 @@ -2485,14 +2505,55 @@ mappatura che gi \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}} @@ -2502,18 +2563,38 @@ mappatura che gi % 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} @@ -3258,7 +3339,7 @@ tab.~\ref{tab:file_lockf_type}. \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 diff --git a/filedir.tex b/filedir.tex index d2f2de6..f30fee5 100644 --- a/filedir.tex +++ b/filedir.tex @@ -430,10 +430,9 @@ buffer, e lo richiude. Si tenga presente che la funzione non termina la 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} @@ -487,10 +486,10 @@ ci mostrerebbe invece l'esistenza di \file{temporaneo}. 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} @@ -501,18 +500,17 @@ prototipo \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}, @@ -521,19 +519,21 @@ prototipo \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. @@ -557,8 +557,8 @@ prototipo \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 @@ -566,8 +566,8 @@ La modalit 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} @@ -809,16 +809,16 @@ il nome del relativo campo; nel nostro caso sono definite le macro \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} @@ -2428,17 +2428,19 @@ riepilogo in cui si riassumono le caratteristiche di ciascuno di essi, in modo 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}& @@ -2447,20 +2449,20 @@ ha alcun effetto qualora il processo possieda i privilegi di amministratore. \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 @@ -2468,11 +2470,6 @@ ha alcun effetto qualora il processo possieda i privilegi di amministratore. \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} @@ -2484,7 +2481,7 @@ illustrata in fig.~\ref{fig:file_perm_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}& @@ -2493,18 +2490,23 @@ illustrata in fig.~\ref{fig:file_perm_bit}. \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 @@ -2512,17 +2514,122 @@ illustrata in fig.~\ref{fig:file_perm_bit}. \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 diff --git a/fileintro.tex b/fileintro.tex index bc11f82..f5c46c6 100644 --- a/fileintro.tex +++ b/fileintro.tex @@ -168,22 +168,22 @@ dispositivo sottostante effettua le operazioni di I/O.\footnote{in sostanza i \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} @@ -447,25 +447,25 @@ tab.~\ref{tab:file_file_operations}. \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.} diff --git a/filestd.tex b/filestd.tex index 15da6a7..0bb202f 100644 --- a/filestd.tex +++ b/filestd.tex @@ -273,7 +273,7 @@ aperti con le funzioni delle librerie standard del C. \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 @@ -289,8 +289,8 @@ aperti con le funzioni delle librerie standard del C. \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 @@ -961,34 +961,34 @@ si \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 @@ -1014,7 +1014,7 @@ tab.~\ref{tab:file_format_spec}) che la conclude. \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} @@ -1058,27 +1058,27 @@ manuale di \func{printf} e nella documentazione delle \acr{glibc}. \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}} diff --git a/fileunix.tex b/fileunix.tex index 1b4edce..9be2f23 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -261,34 +261,34 @@ ritorno il file descriptor con il valore pi 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 @@ -297,11 +297,11 @@ ritorno il file descriptor con il valore pi \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} @@ -317,24 +317,24 @@ ritorno il file descriptor con il valore pi 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 diff --git a/ipc.tex b/ipc.tex index f21ffe7..169f1dd 100644 --- a/ipc.tex +++ b/ipc.tex @@ -1160,7 +1160,7 @@ coda. \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 @@ -1860,16 +1860,16 @@ indicano rispettivamente: \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} @@ -2008,10 +2008,10 @@ tutti i semafori il cui valore viene modificato. \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}.} @@ -2430,21 +2430,21 @@ che permettono di cambiarne il valore. \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 diff --git a/prochand.tex b/prochand.tex index 1ac1ff8..a6b8484 100644 --- a/prochand.tex +++ b/prochand.tex @@ -914,18 +914,18 @@ sono riportate anche le costanti definite per indicare alcuni di essi. \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} @@ -957,10 +957,10 @@ valore nullo anzich \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} @@ -1055,36 +1055,36 @@ presente che queste macro prendono come parametro la variabile di tipo \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 @@ -1149,14 +1149,14 @@ primo, quale processo o quale gruppo di processi selezionare. \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 @@ -1186,13 +1186,13 @@ nuovo riceverne lo stato. \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 @@ -2128,10 +2128,10 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e % % 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 @@ -2139,11 +2139,11 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e \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 @@ -2164,7 +2164,7 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e \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 @@ -2173,14 +2173,14 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e 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 @@ -2191,7 +2191,7 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e % 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.\\ @@ -2200,10 +2200,10 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e \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 @@ -2212,59 +2212,58 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e \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 @@ -3146,10 +3145,10 @@ assolute diverse da zero o politiche \const{SCHED\_FIFO} e \const{SCHED\_RR}. \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 diff --git a/session.tex b/session.tex index 23bf180..4652bc5 100644 --- a/session.tex +++ b/session.tex @@ -767,23 +767,23 @@ specificato con un OR aritmetico. \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}.} @@ -808,10 +808,10 @@ tab.~\ref{tab:sess_openlog_option}. \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}.} @@ -860,14 +860,14 @@ con la maschera binaria delle costanti di tab.~\ref{tab:sess_syslog_facility}. \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} @@ -1146,7 +1146,7 @@ modificare i bit su cui non si interviene. \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, @@ -1161,11 +1161,11 @@ modificare i bit su cui non si interviene. (\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'|).\\ @@ -1185,11 +1185,11 @@ modificare i bit su cui non si interviene. \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 @@ -1305,11 +1305,10 @@ valore. \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.\\ @@ -1322,27 +1321,26 @@ valore. 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 @@ -1390,7 +1388,7 @@ fig.~\ref{fig:term_termios}). 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 @@ -1409,7 +1407,7 @@ fig.~\ref{fig:term_termios}). \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}'' @@ -1422,7 +1420,7 @@ fig.~\ref{fig:term_termios}). \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}.\\ @@ -1484,7 +1482,7 @@ altri.\footnote{in Linux il valore della costante \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}.\\ @@ -1523,9 +1521,9 @@ altri.\footnote{in Linux il valore della costante \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.\\ @@ -1533,7 +1531,7 @@ altri.\footnote{in Linux il valore della costante 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 @@ -1630,9 +1628,9 @@ utili qualora si cambino i parametri di output. \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 @@ -1869,7 +1867,7 @@ di uscita canceller \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 @@ -1913,7 +1911,7 @@ riportati in tab.~\ref{tab:sess_tcflow_action}. \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 diff --git a/signal.tex b/signal.tex index 2d9d439..0679079 100644 --- a/signal.tex +++ b/signal.tex @@ -304,12 +304,12 @@ definiti in vari standard. \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} @@ -334,10 +334,10 @@ colonna standard sono stati indicati anche gli standard in cui ciascun segnale \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 @@ -1045,11 +1045,11 @@ Una seconda funzione che pu \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} @@ -1763,7 +1763,7 @@ tab.~\ref{tab:sig_sa_flag}. 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}).\\ diff --git a/sources/inotify_monitor.c b/sources/inotify_monitor.c new file mode 100644 index 0000000..d2c4f2d --- /dev/null +++ b/sources/inotify_monitor.c @@ -0,0 +1,125 @@ +/* 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 +#include +#include /* C standard library */ +#include +#include /* error definitions and routines */ +#include /* standard I/O library */ +#include /* 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); +} diff --git a/system.tex b/system.tex index dfc71d9..ab28481 100644 --- a/system.tex +++ b/system.tex @@ -163,22 +163,21 @@ file, riportate in tab.~\ref{tab:sys_file_macro}). \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.} @@ -207,29 +206,28 @@ riportati in tab.~\ref{tab:sys_posix1_general}. \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.} @@ -250,14 +248,14 @@ valori ottenuti da \func{sysconf}. \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 @@ -401,15 +399,15 @@ riportate in tab.~\ref{tab:sys_file_macro}. \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 @@ -432,16 +430,16 @@ le analoghe di tab.~\ref{tab:sys_posix1_general}. \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 & \\ @@ -766,27 +764,27 @@ valori riportati in tab.~\ref{tab:sys_mount_flags}. \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.} @@ -1282,17 +1280,17 @@ corrispondente al valore del campo \var{ut\_id} specificato in \param{ut}. \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} @@ -1471,7 +1469,7 @@ fatto solo fino al valore del secondo, che per questo viene detto \textit{hard \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 @@ -2178,10 +2176,10 @@ sintassi specificata per la forma equivalente di questa funzione definita come \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}