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,
+di \textit{epoll} vengono utilizzate 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
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 del contenuto di
- \texttt{/proc/sys/fs/file-max}.}
+ \procfile{/proc/sys/kernel/rtsig-max} allo stesso valore del contenuto di
+ \procfile{/proc/sys/fs/file-max}.}
% TODO fare esempio che usa O_ASYNC
Se il \textit{lease holder} non provvede a rilasciare il \textit{lease} entro
il numero di secondi specificato dal parametro di sistema mantenuto in
-\file{/proc/sys/fs/lease-break-time} sarà il kernel stesso a rimuoverlo (o
+\procfile{/proc/sys/fs/lease-break-time} sarà il kernel stesso a rimuoverlo (o
declassarlo) automaticamente.\footnote{questa è una misura di sicurezza per
evitare che un processo blocchi indefinitamente l'accesso ad un file
acquisendo un \textit{lease}.} Una volta che un \textit{lease} è stato
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 è
+ specifica di Linux che deve essere evitata se si vogliono scrivere programmi
+ portabili, e che le funzionalità illustrate sono disponibili soltanto 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}
\index{file!dnotify|)}
-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 è:
+Per risolvere i problemi appena illustrati è stata introdotta una nuova
+interfaccia per l'osservazione delle modifiche a file o directory, chiamata
+\textit{inotify}.\footnote{l'interfaccia è disponibile a partire dal kernel
+ 2.6.13, le relative funzioni 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, il che permette
+di risolvere 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)}
}
\end{prototype}
-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 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 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
+La funzione non prende alcun argomento; inizializza una istanza di
+\textit{inotify} e restituisce un file descriptor attraverso il quale verranno
+effettuate le operazioni di notifica;\footnote{per evitare abusi delle risorse
+ di sistema è previsto che un utente possa utilizzare un numero limitato di
+ istanze di \textit{inotify}; il valore di default del limite è di 128, ma
+ questo valore può essere cambiato con \func{sysctl} o usando il file
+ \procfile{/proc/sys/fs/inotify/max\_user\_instances}.} si tratta di un file
+descriptor speciale che non è associato a nessun file su disco, e che viene
+utilizzato solo per notificare gli eventi che sono stati posti in
+osservazione. Dato che questo file descriptor non è associato a nessun file o
+directory reale, l'inconveniente di non poter smontare un filesystem i cui
+file sono tenuti sotto osservazione viene completamente
+eliminato.\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
-con l'interfaccia di \textit{epoll}, e siccome gli eventi vengono notificati
+con l'interfaccia di \textit{epoll}; 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}.
+dover utilizzare i segnali,\footnote{considerati una pessima scelta dal punto
+ di vista dell'interfaccia utente.} si potrà gestire l'osservazione delle
+modifiche con una qualunque delle modalità di \textit{I/O multiplexing}
+illustrate in sez.~\ref{sec:file_multiplexing}.
Infine l'interfaccia di \textit{inotify} consente di mettere sotto
-osservazione sia singoli file, che intere directory; in quest'ultimo caso
-l'interfaccia restituirà informazioni sia riguardo alla directory che ai file
-che essa contiene. Una volta creata la coda di notifica si devono definire
-gli eventi da tenere sotto osservazione; questo viene fatto tramite una
-\textsl{lista di osservazione} (o \textit{watch list}) associata alla coda.
-Per gestire la lista di osservazione l'interfaccia fornisce due funzioni, la
-prima di queste è \funcd{inotify\_add\_watch}, il cui prototipo è:
+osservazione, oltre che una directory anche singoli file. Una volta creata la
+coda di notifica si devono definire gli eventi da tenere sotto osservazione;
+questo viene fatto attraverso una \textsl{lista di osservazione} (o
+\textit{watch list}) che è associata alla coda. Per gestire la lista di
+osservazione l'interfaccia fornisce due funzioni, la prima di queste è
+\funcd{inotify\_add\_watch}, il cui prototipo è:
\begin{prototype}{sys/inotify.h}
{int inotify\_add\_watch(int fd, const char *pathname, uint32\_t mask)}
ed inoltre \errval{EFAULT}, \errval{ENOMEM} e \errval{EBADF}.}
\end{prototype}
-La funzione consente di creare un \textsl{evento di osservazione} (un
-cosiddetto ``\textit{watch}'') nella lista di una coda di notifica, indicata
-specificando il file descriptor ad essa associato nell'argomento \param{fd}.
-Il file o la directory da porre sotto osservazione viene invece indicato per
-nome, che viene passato nell'argomento \param{pathname}. Infine il terzo
-argomento, \param{mask}, indica che tipo di eventi devono essere tenuti sotto
-osservazione. Questo deve essere specificato come maschera binaria combinando
-i valori delle costanti riportate in tab.~\ref{tab:inotify_event_watch}. In
-essa si sono marcati con un ``$\bullet$'' gli eventi che, quando specificati
-per una directory, vengono osservati anche su tutti i file che essa contiene.
+La funzione consente di creare un ``\textsl{osservatore}'' (il cosiddetto
+``\textit{watch}'') nella lista di osservazione di una coda di notifica, che
+deve essere indicata specificando il file descriptor ad essa associato
+nell'argomento \param{fd}.\footnote{questo ovviamente dovrà essere un file
+ descriptor creato con \func{inotify\_init}.} Il file o la directory da
+porre sotto osservazione vengono invece indicati per nome, da passare
+nell'argomento \param{pathname}. Infine il terzo argomento, \param{mask},
+indica che tipo di eventi devono essere tenuti sotto osservazione e le
+modalità della stessa. L'operazione può essere ripetuta per tutti i file e le
+directory che si vogliono tenere sotto osservazione,\footnote{anche in questo
+ caso c'è un limite massimo che di default è pari a 8192, ed anche questo
+ valore può essere cambiato con \func{sysctl} o usando il file
+ \procfile{/proc/sys/fs/inotify/max\_user\_watches}.} e si utilizzerà sempre
+un solo file descriptor.
+
+Il tipo di evento che si vuole osservare deve essere specificato
+nell'argomento \param{mask} come maschera binaria, combinando i valori delle
+costanti riportate in tab.~\ref{tab:inotify_event_watch} che identificano i
+singoli bit della maschera ed il relativo significato. In essa si sono marcati
+con un ``$\bullet$'' gli eventi che, quando specificati per una directory,
+vengono osservati anche su tutti i file che essa contiene. Nella seconda
+parte della tabella si sono poi indicate alcune combinazioni predefinite dei
+flag della prima parte.
\begin{table}[htb]
\centering
\footnotesize
\begin{tabular}[c]{|l|c|p{10cm}|}
\hline
- \textbf{Valore} & & \textbf{Significato} \\
+ \textbf{Flag} & & \textbf{Significato} \\
\hline
\hline
\const{IN\_ACCESS} &$\bullet$& C'è stato accesso al file in
\const{IN\_CLOSE\_WRITE} &$\bullet$& È stato chiuso un file aperto in
scrittura.\\
\const{IN\_CLOSE\_NOWRITE}&$\bullet$& È stato chiuso un file aperto in
- sola lettura.\\
+ sola lettura.\\
\const{IN\_CREATE} &$\bullet$& È stato creato un file o una
directory in una directory sotto
osservazione.\\
directory sotto osservazione.\\
\const{IN\_OPEN} &$\bullet$& Un file è stato aperto.\\
\hline
+ \const{IN\_CLOSE} & -- & Combinazione di
+ \const{IN\_CLOSE\_WRITE} e
+ \const{IN\_CLOSE\_NOWRITE}.\\
+ \const{IN\_MOVE} & -- & Combinazione di
+ \const{IN\_MOVED\_FROM} e
+ \const{IN\_MOVED\_TO}.\\
+ \const{IN\_ALL\_EVENTS} & -- & Combinazione di tutti i flag
+ possibili.\\
+ \hline
\end{tabular}
\caption{Le costanti che identificano i valori per la maschera binaria
- dell'argomento \param{mask} di \func{inotify\_add\_watch}.}
+ dell'argomento \param{mask} di \func{inotify\_add\_watch} che indicano il
+ tipo di evento da tenere sotto osservazione.}
\label{tab:inotify_event_watch}
\end{table}
+Oltre ai flag di tab.~\ref{tab:inotify_event_watch}, che indicano il tipo di
+evento da osservare e che vengono utilizzati anche in uscita per indicare il
+tipo di evento avvenuto, \func{inotify\_add\_watch} supporta ulteriori
+flag,\footnote{i flag \const{IN\_DONT\_FOLLOW}, \const{IN\_MASK\_ADD} e
+ \const{IN\_ONLYDIR} sono stati introdotti a partire dalle glibc 2.5, se si
+ usa la versione 2.4 è necessario definirli a mano.} riportati in
+tab.~\ref{tab:inotify_add_watch_flag}, che indicano le modalità di
+osservazione (da passare sempre nell'argomento \param{mask}) e che al
+contrario dei precedenti non vengono mai impostati nei risultati in uscita.
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|p{10cm}|}
+ \hline
+ \textbf{Flag} & \textbf{Significato} \\
+ \hline
+ \hline
+ \const{IN\_DONT\_FOLLOW}& Non dereferenzia \param{pathname} se questo è un
+ link simbolico.\\
+ \const{IN\_MASK\_ADD} & Aggiunge a quelli già impostati i flag indicati
+ nell'argomento \param{mask}, invece di
+ sovrascriverli.\\
+ \const{IN\_ONESHOT} & Esegue l'osservazione su \param{pathname} per una
+ sola volta, rimuovendolo poi dalla \textit{watch
+ list}.\\
+ \const{IN\_ONLYDIR} & Se \param{pathname} è una directory riporta
+ soltanto gli eventi ad essa relativi e non
+ quelli per i file che contiene.\\
+ \hline
+ \end{tabular}
+ \caption{Le costanti che identificano i valori per la maschera binaria
+ dell'argomento \param{mask} di \func{inotify\_add\_watch} che indicano le
+ modalità di osservazione.}
+ \label{tab:inotify_add_watch_flag}
+\end{table}
+
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
- descriptor} che identifica univocamente l'evento di osservazione. Questo
-valore è importante perché è soltanto con esso che si può rimuovere un evento
-di osservazione, usando la seconda funzione dell'interfaccia di gestione,
-\funcd{inotify\_rm\_watch}, il cui prototipo è:
+altrimenti la funzione sovrascriverà le impostazioni precedenti, a meno che
+non si sia usato il flag \const{IN\_MASK\_ADD}, nel qual caso gli eventi
+specificati saranno aggiunti a quelli già presenti.
+
+Come accennato quando si tiene sotto osservazione una directory vengono
+restituite le informazioni sia riguardo alla directory stessa che ai file che
+essa contiene; questo comportamento può essere disabilitato utilizzando il
+flag \const{IN\_ONLYDIR}, che richiede di riportare soltanto gli eventi
+relativi alla directory stessa. Si tenga presente inoltre che quando si
+osserva una directory vengono riportati solo gli eventi sui file che essa
+contiene direttamente, non quelli relativi a file contenuti in eventuali
+sottodirectory; se si vogliono osservare anche questi sarà necessario creare
+ulteriori \textit{watch} per ciascuna sottodirectory.
+
+Infine usando il flag \const{IN\_ONESHOT} è possibile richiedere una notifica
+singola;\footnote{questa funzionalità però è disponibile soltato a partire dal
+ kernel 2.6.16.} una volta verificatosi uno qualunque fra gli eventi
+richiesti con \func{inotify\_add\_watch} l'\textsl{osservatore} verrà
+automaticamente rimosso dalla lista di osservazione e nessun ulteriore evento
+sarà più notificato.
+
+In caso di successo \func{inotify\_add\_watch} ritorna un intero positivo,
+detto \textit{watch descriptor}; è tramite questo valore che si identifica
+univocamente un \textsl{osservatore} su una coda di notifica, sia per quanto
+riguarda i risultati restituiti da \textit{inotify}, che per quanto riguarda
+la eventuale rimozione dello stesso; la seconda funzione per la gestione delle
+liste di osservazione è infatti \funcd{inotify\_rm\_watch}, che permette di
+rimuovere un \textsl{osservatore}; il suo prototipo è:
\begin{prototype}{sys/inotify.h}
{int inotify\_rm\_watch(int fd, uint32\_t wd)}
- Rimuove un evento di osservazione.
+ Rimuove un \textsl{osservatore} da una coda di notifica.
\bodydesc{La funzione restituisce 0 in caso di successo, o $-1$ in caso di
errore, nel qual caso \var{errno} assumerà uno dei valori:
}
\end{prototype}
+La funzione rimuove dalla coda di notifica identificata dall'argomento
+\param{fd} l'osservatore identificato dal \textit{watch descriptor}
+\param{wd};\footnote{ovviamente deve essere usato per questo argomento un
+ valore ritornato da \func{inotify\_add\_watch}, altrimenti si avrà un errore
+ di \errval{EINVAL}.} inoltre, contemporaneamente alla rimozione
+dell'osservatore, sulla coda di notifica verrà generato un evento di tipo
+\const{IN\_IGNORED} (vedi tab.~\ref{tab:inotify_read_event_flag}).
+
+
Oltre che per la rimozione, il \textit{watch descriptor} viene usato anche per
identificare l'evento a cui si fa riferimento nella lista dei risultati
-restituiti da \textit{inotify}
+restituiti da \textit{inotify}; questi ultimi infatti vengono notificati alle
+applicazioni che usano l'interfaccia di \textit{inotify} come dati presenti in
+lettura su file descriptor creato con \func{inotify\_init}.
\begin{figure}[!htb]
+
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|p{10cm}|}
+ \hline
+ \textbf{Flag} & \textbf{Significato} \\
+ \hline
+ \hline
+ \const{IN\_IGNORED} & .\\
+ \const{IN\_ISDIR} & .\\
+ \const{IN\_Q\_OVERFLOW}& .\\
+ \const{IN\_UNMOUNT} & .\\
+ \hline
+ \end{tabular}
+ \caption{Le costanti che identificano i flag aggiuntivi usati nella maschera
+ binaria del campo \var{mask} di \structd{inotify\_event}.}
+ \label{tab:inotify_read_event_flag}
+\end{table}
+
+
+
% TODO inserire anche inotify, vedi http://www.linuxjournal.com/article/8478
% TODO e man inotify
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.
+buffer in memoria, da cui essi vengono poi scritti sul secondo.
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
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 è
+Il problema è che il concetto di migliore efficienza impiegato 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
% LocalWords: attribute Universe epoll Solaris kqueue level triggered Jonathan
% LocalWords: Lemon BSDCON edge Libenzi kevent backporting epfd EEXIST ENOENT
% LocalWords: MOD wait EPOLLIN EPOLLOUT EPOLLRDHUP SOCK EPOLLPRI EPOLLERR one
-% LocalWords: EPOLLHUP EPOLLET EPOLLONESHOT shot maxevents
+% LocalWords: EPOLLHUP EPOLLET EPOLLONESHOT shot maxevents ctlv ALL DONT HPUX
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "gapil"
%%% End:
+% LocalWords: FOLLOW ONESHOT ONLYDIR FreeBSD EIO caching
in Linux il valore utilizzato è di 5 secondi; con le nuove versioni\footnote{a
partire dal kernel 2.2.8} poi, è il kernel che si occupa direttamente di
tutto quanto attraverso il demone interno \cmd{bdflush}, il cui comportamento
-può essere controllato attraverso il file \file{/proc/sys/vm/bdflush} (per il
-significato dei valori si può leggere la documentazione allegata al kernel in
-\file{Documentation/sysctl/vm.txt}).
+può essere controllato attraverso il file \procfile{/proc/sys/vm/bdflush} (per
+il significato dei valori si può leggere la documentazione allegata al kernel
+in \file{Documentation/sysctl/vm.txt}).
Quando si vogliono scaricare soltanto i dati di un file (ad esempio essere
sicuri che i dati di un database sono stati registrati su disco) si possono
definendo gruppi di lavoro, di accesso a determinate risorse, ecc.
L'utente e il gruppo sono identificati da due numeri, la cui corrispondenza ad
-un nome espresso in caratteri è inserita nei due file \file{/etc/passwd} e
-\file{/etc/groups}.\footnote{in realtà negli sistemi più moderni, come vedremo
- in sez.~\ref{sec:sys_user_group} queste informazioni possono essere
+un nome espresso in caratteri è inserita nei due file \conffile{/etc/passwd} e
+\conffile{/etc/group}.\footnote{in realtà negli sistemi più moderni, come
+ vedremo in sez.~\ref{sec:sys_user_group} queste informazioni possono essere
mantenute, con l'uso del \itindex{Name~Service~Switch} \textit{Name Service
Switch}, su varie tipologie di supporti, compresi server centralizzati
come LDAP.} Questi numeri sono l'\textit{user identifier}, detto in breve
altri limiti relativi al \textit{SysV IPC}) solo con una ricompilazione del
kernel, andando a modificarne la definizione nei relativi header file. A
partire dal kernel 2.4.x è possibile cambiare questi valori a sistema attivo
- scrivendo sui file \file{shmmni}, \file{msgmni} e \file{sem} di
- \file{/proc/sys/kernel} o con l'uso di \func{sysctl}.} e per ciascuno di
+ scrivendo sui file \procrelfile{/proc/sys/kernel}{shmmni},
+ \procrelfile{/proc/sys/kernel}{msgmni} e \procrelfile{/proc/sys/kernel}{sem}
+ di \file{/proc/sys/kernel} o con l'uso di \func{sysctl}.} e per ciascuno di
essi viene mantenuto in \var{seq} un numero di sequenza progressivo che viene
incrementato di uno ogni volta che l'oggetto viene cancellato. Quando
l'oggetto viene creato usando uno spazio che era già stato utilizzato in
negli header e corrispondenti alle prime tre costanti riportate in
tab.~\ref{tab:ipc_msg_limits}, come accennato però in Linux è possibile
modificare questi limiti attraverso l'uso di \func{sysctl} o scrivendo nei
-file \file{msgmax}, \file{msgmnb} e \file{msgmni} di \file{/proc/sys/kernel/}.
+file \procrelfile{/proc/sys/kernel}{msgmax},
+\procrelfile{/proc/sys/kernel}{msgmnb} e
+\procrelfile{/proc/sys/kernel}{msgmni} di \file{/proc/sys/kernel/}.
\begin{figure}[htb]
serie di limiti, i cui valori sono associati ad altrettante costanti, che si
sono riportate in tab.~\ref{tab:ipc_sem_limits}. Alcuni di questi limiti sono
al solito accessibili e modificabili attraverso \func{sysctl} o scrivendo
-direttamente nel file \file{/proc/sys/kernel/sem}.
+direttamente nel file \procfile{/proc/sys/kernel/sem}.
La funzione che permette di effettuare le varie operazioni di controllo sui
semafori (fra le quali, come accennato, è impropriamente compresa anche la
& \textbf{Significato} \\
\hline
\hline
- \const{SHMALL}& 0x200000&\file{shmall}& Numero massimo di pagine che
- possono essere usate per i segmenti di
- 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{SHMALL}& 0x200000&\procrelfile{/proc/sys/kernel}{shmall}
+ & Numero massimo di pagine che
+ possono essere usate per i segmenti di
+ memoria condivisa.\\
+ \const{SHMMAX}&0x2000000&\procrelfile{/proc/sys/kernel}{shmmax}
+ & Dimensione massima di un segmento di memoria
+ condivisa.\\
+ \const{SHMMNI}& 4096&\procrelfile{/proc/sys/kernel}{msgmni}
+ & Numero massimo di segmenti di memoria condivisa
+ presenti nel kernel.\\
\const{SHMMIN}& 1& --- & Dimensione minima di un segmento di
memoria condivisa.\\
\const{SHMLBA}&\const{PAGE\_SIZE}&--- & Limite inferiore per le dimensioni
\newcommand{\link}[1]{\texttt{#1}} % html link
\newcommand{\ctyp}[1]{\texttt{#1}} % C standard type
+\newcommand{\headfile}[1]{%
+\index{file!include!{#1}@{{\tt {#1}}}}\texttt{#1}%
+%\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}%
+} % header file name
+\newcommand{\procfile}[1]{%
+\index{file!filesystem~\texttt{/proc}!{#1}@{{\tt {#1}}}}\texttt{#1}%
+%\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}%
+} % /proc file name
+\newcommand{\sysfile}[1]{%
+\index{file!di~sistema!{#1}@{{\tt {#1}}}}\texttt{#1}%
+%\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}%
+} % system file name
+\newcommand{\conffile}[1]{%
+\index{file!di~configurazione!{#1}@{{\tt {#1}}}}\texttt{#1}%
+%\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}%
+} % configuration file name
+\newcommand{\procrelfile}[2]{%
+\index{file!filesystem~\texttt{/proc}!{#2}@{{\tt {#1}/{#2}}}}\texttt{#2}%
+%\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}%
+}
+
+
\newcommand{\type}[1]{%
\index{tipo!{#1}@{{\tt {#1}}}}\texttt{#1}%
%\index{#1@{{\tt {#1}} (tipo)}}\texttt{#1}%
specificato il flag \texttt{-static} durante la compilazione, tutti i
programmi in Linux sono incompleti e necessitano di essere \textsl{collegati}
alle librerie condivise quando vengono avviati. La procedura è controllata da
-alcune variabili di ambiente e dal contenuto di \file{/etc/ld.so.conf}. I
+alcune variabili di ambiente e dal contenuto di \conffile{/etc/ld.so.conf}. I
dettagli sono riportati nella man page di \cmd{ld.so}.
Il sistema fa partire qualunque programma chiamando la funzione \func{main};
del programma per caricare le librerie necessarie ed effettuare il link
dell'eseguibile. Se il programma è in formato ELF per caricare le librerie
dinamiche viene usato l'interprete indicato nel segmento \const{PT\_INTERP},
-in genere questo è \file{/lib/ld-linux.so.1} per programmi collegati con le
-\acr{libc5}, e \file{/lib/ld-linux.so.2} per programmi collegati con le
+in genere questo è \sysfile{/lib/ld-linux.so.1} per programmi collegati con le
+\acr{libc5}, e \sysfile{/lib/ld-linux.so.2} per programmi collegati con le
\acr{glibc}.
Infine nel caso il file sia uno script esso deve iniziare con una linea nella
ed eventualmente tornare indietro.
Come esempio per chiarire l'uso di queste funzioni prendiamo quello con cui
-viene gestito l'accesso al file \file{/var/log/utmp}. In questo file viene
+viene gestito l'accesso al file \sysfile{/var/log/utmp}. In questo file viene
registrato chi sta usando il sistema al momento corrente; chiaramente non può
essere lasciato aperto in scrittura a qualunque utente, che potrebbe
falsificare la registrazione. Per questo motivo questo file (e l'analogo
-\file{/var/log/wtmp} su cui vengono registrati login e logout) appartengono ad
-un gruppo dedicato (\acr{utmp}) ed i programmi che devono accedervi (ad
+\sysfile{/var/log/wtmp} su cui vengono registrati login e logout) appartengono
+ad un gruppo dedicato (\acr{utmp}) ed i programmi che devono accedervi (ad
esempio tutti i programmi di terminale in X, o il programma \cmd{screen} che
crea terminali multipli su una console) appartengono a questo gruppo ed hanno
il bit \acr{sgid} impostato.
\textsl{group-ID salvato} &=& \textrm{\acr{utmp}}
\end{eqnarray*}
in questo modo, dato che il \textsl{group-ID effettivo} è quello giusto, il
-programma può accedere a \file{/var/log/utmp} in scrittura ed aggiornarlo. A
-questo punto il programma può eseguire una \code{setgid(getgid())} per
+programma può accedere a \sysfile{/var/log/utmp} in scrittura ed aggiornarlo.
+A questo punto il programma può eseguire una \code{setgid(getgid())} per
impostare il \textsl{group-ID effettivo} a quello dell'utente (e dato che il
\textsl{group-ID reale} corrisponde la funzione avrà successo), in questo modo
non sarà possibile lanciare dal terminale programmi che modificano detto file,
\end{eqnarray*}
e ogni processo lanciato dal terminale avrebbe comunque \acr{gid} come
\textsl{group-ID effettivo}. All'uscita dal terminale, per poter di nuovo
-aggiornare lo stato di \file{/var/log/utmp} il programma eseguirà una
+aggiornare lo stato di \sysfile{/var/log/utmp} il programma eseguirà una
\code{setgid(utmp)} (dove \var{utmp} è il valore numerico associato al gruppo
\acr{utmp}, ottenuto ad esempio con una precedente \func{getegid}), dato che
in questo caso il valore richiesto corrisponde al \textsl{group-ID salvato} la
\textsl{group-ID effettivo} &=& \textrm{\acr{utmp}} \\
\textsl{group-ID salvato} &=& \textrm{\acr{utmp} (invariato)}
\end{eqnarray*}
-consentendo l'accesso a \file{/var/log/utmp}.
+consentendo l'accesso a \sysfile{/var/log/utmp}.
Occorre però tenere conto che tutto questo non è possibile con un processo con
i privilegi di amministratore, in tal caso infatti l'esecuzione di una
\end{functions}
La funzione esegue la scansione del database dei gruppi (usualmente
-\file{/etc/groups}) cercando i gruppi di cui è membro l'utente \param{user}
+\conffile{/etc/group}) cercando i gruppi di cui è membro l'utente \param{user}
con cui costruisce una lista di gruppi supplementari, a cui aggiunge anche
\param{group}, infine imposta questa lista per il processo corrente usando
\func{setgroups}. Si tenga presente che sia \func{setgroups} che
capacità in esso elencate.
Il \textit{capabilities bounding set} è un parametro di sistema, accessibile
-attraverso il contenuto del file \file{/proc/sys/kernel/cap-bound}, che per
+attraverso il contenuto del file \procfile{/proc/sys/kernel/cap-bound}, che per
questa sua caratteristica consente di impostare un limite generale alle
capacità che possono essere accordate ai vari processi. Questo valore può
essere impostato ad un valore arbitrario esclusivamente dal primo processo
distribuzione \textit{Slackware}, come alcune distribuzioni su dischetto, ed
altre distribuzioni dedicate a compiti limitati e specifici.} viene usata
la procedura di avvio di System V; questa prevede che \cmd{init} legga dal
-file di configurazione \file{/etc/inittab} quali programmi devono essere
+file di configurazione \conffile{/etc/inittab} quali programmi devono essere
lanciati, ed in quali modalità, a seconda del cosiddetto \textit{run level},
anch'esso definito nello stesso file.
tutto ripetuto per ciascuno dei terminali che si hanno a disposizione (o per
un certo numero di essi, nel caso delle console virtuali), secondo quanto
indicato dall'amministratore nel file di configurazione del programma,
-\file{/etc/inittab}.
+\conffile{/etc/inittab}.
Quando viene lanciato da \cmd{init} il programma parte con i privilegi di
amministratore e con un ambiente vuoto; \cmd{getty} si cura di chiamare
\item scartare.
\end{itemize*}
secondo le modalità che questo preferisce e che possono essere impostate
-attraverso il file di configurazione \file{/etc/syslog.conf} (maggiori
+attraverso il file di configurazione \conffile{/etc/syslog.conf} (maggiori
dettagli si possono trovare sulle pagine di manuale per questo file e per
\cmd{syslogd}).
sez.~\ref{sec:sys_limits}; il suo valore minimo secondo lo standard,
\const{\_POSIX\_SIGQUEUE\_MAX}, è pari a 32. Nel caso di Linux questo è uno
dei parametri del kernel impostabili sia con \func{sysctl}, che scrivendolo
- direttamente in \file{/proc/sys/kernel/rtsig-max}, il valore predefinito è
- di 1024.} nella coda dei segnali real-time) esso viene inserito e diventa
+ direttamente in \procfile{/proc/sys/kernel/rtsig-max}, il valore predefinito
+ è di 1024.} nella coda dei segnali real-time) esso viene inserito e diventa
pendente; una volta consegnato riporterà nel campo \var{si\_code} di
\struct{siginfo\_t} il valore \const{SI\_QUEUE} e il campo \var{si\_value}
riceverà quanto inviato con \param{value}. Se invece si è installato un
per mantenere dati amministrativi e strutture interne, e solo una parte
viene usata come buffer per i dati, mentre il valore letto da
\func{getsockopt} e quello riportato nei vari parametri di
- \textit{sysctl}\footnote{cioè \texttt{wmem\_max} e \texttt{rmem\_max} in
- \texttt{/proc/sys/net/core} e \texttt{tcp\_wmem} e \texttt{tcp\_rmem} in
+ \textit{sysctl}\footnote{cioè \procrelfile{/proc/sys/net/core}{wmem\_max} e
+ \procrelfile{/proc/sys/net/core}{rmem\_max} in \texttt{/proc/sys/net/core}
+ e \procrelfile{/proc/sys/net/ipv4}{tcp\_wmem} e
+ \procrelfile{/proc/sys/net/ipv4}{tcp\_rmem} in
\texttt{/proc/sys/net/ipv4}, vedi sez.~\ref{sec:sock_sysctl}.} indica la
memoria effettivamente impiegata. Si tenga presente inoltre che le
modifiche alle dimensioni dei buffer di ingresso e di uscita, per poter
di tentativi di ritrasmissione dei segmenti SYN usati nel
\itindex{three~way~handshake} \textit{three way handshake} prima che il
tentativo di connessione venga abortito (si ricordi quanto accennato in
- sez.\ref{sec:TCP_func_connect}). Sovrascrive per il singolo socket il valore
+ sez.~\ref{sec:TCP_func_connect}). Sovrascrive per il singolo socket il valore
globale impostato con la \textit{sysctl} \texttt{tcp\_syn\_retries} (vedi
sez.~\ref{sec:sock_ipv4_sysctl}). Non vengono accettati valori maggiori di
255; anche questa opzione non è standard e deve essere evitata se si vuole
\texttt{man 7 socket} sono i seguenti:
\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
-\item[\texttt{rmem\_default}] imposta la dimensione di default del buffer di
- lettura (cioè per i dati in ingresso) dei socket.
-\item[\texttt{rmem\_max}] imposta la dimensione massima che si può assegnare al
- buffer di ingresso dei socket attraverso l'uso dell'opzione
- \const{SO\_RCVBUF}.
-\item[\texttt{wmem\_default}] imposta la dimensione di default del buffer di
- scrittura (cioè per i dati in uscita) dei socket.
-\item[\texttt{wmem\_max}] imposta la dimensione massima che si può assegnare al
- buffer di uscita dei socket attraverso l'uso dell'opzione
- \const{SO\_SNDBUF}.
-\item[\texttt{message\_cost}, \texttt{message\_burst}] contengono le
- impostazioni del \itindex{bucket~filter} \textit{bucket filter} che
- controlla l'emissione di messaggi di avviso da parte kernel per eventi
- relativi a problemi sulla rete, imponendo un limite che consente di
- prevenire eventuali attacchi di \itindex{Denial~of~Service~(DoS)}
- \textit{Denial of Service} usando i log.\footnote{senza questo limite un
- attaccante potrebbe inviare ad arte un traffico che generi
- intenzionalmente messaggi di errore, per saturare il sistema dei log.}
+\item[\procrelfile{/proc/sys/net/core}{rmem\_default}] imposta la dimensione
+ di default del buffer di lettura (cioè per i dati in ingresso) dei socket.
+\item[\procrelfile{/proc/sys/net/core}{rmem\_max}] imposta la dimensione
+ massima che si può assegnare al buffer di ingresso dei socket attraverso
+ l'uso dell'opzione \const{SO\_RCVBUF}.
+\item[\procrelfile{/proc/sys/net/core}{wmem\_default}] imposta la dimensione
+ di default del buffer di scrittura (cioè per i dati in uscita) dei socket.
+\item[\procrelfile{/proc/sys/net/core}{wmem\_max}] imposta la dimensione
+ massima che si può assegnare al buffer di uscita dei socket attraverso l'uso
+ dell'opzione \const{SO\_SNDBUF}.
+\item[\procrelfile{/proc/sys/net/core}{message\_cost},
+ \procrelfile{/proc/sys/net/core}{message\_burst}] contengono le impostazioni
+ del \itindex{bucket~filter} \textit{bucket filter} che controlla l'emissione
+ di messaggi di avviso da parte kernel per eventi relativi a problemi sulla
+ rete, imponendo un limite che consente di prevenire eventuali attacchi di
+ \itindex{Denial~of~Service~(DoS)} \textit{Denial of Service} usando i
+ log.\footnote{senza questo limite un attaccante potrebbe inviare ad arte un
+ traffico che generi intenzionalmente messaggi di errore, per saturare il
+ sistema dei log.}
Il \itindex{bucket~filter} \textit{bucket filter} è un algoritmo generico
che permette di impostare dei limiti di flusso su una quantità\footnote{uno
emissione (verranno accettati inizialmente fino ad un massimo di
\texttt{message\_cost/message\_burst} messaggi).
-\item[\texttt{netdev\_max\_backlog}] numero massimo di pacchetti che possono
- essere contenuti nella coda di ingresso generale.
+\item[\procrelfile{/proc/sys/net/core}{netdev\_max\_backlog}] numero massimo
+ di pacchetti che possono essere contenuti nella coda di ingresso generale.
-\item[\texttt{optmem\_max}] lunghezza massima dei dati ancillari e di
- controllo (vedi sez.~\ref{sec:net_ancillary_data}).
+\item[\procrelfile{/proc/sys/net/core}{optmem\_max}] lunghezza massima dei
+ dati ancillari e di controllo (vedi sez.~\ref{sec:net_ancillary_data}).
\end{basedescript}
Oltre a questi nella directory \texttt{/proc/sys/net/core} si trovano altri
nel file \texttt{Documentation/networking/ip-sysctl.txt}; la maggior parte di
questi però non è documentato:
\begin{basedescript}{\desclabelwidth{3.0cm}\desclabelstyle{\nextlinelabel}}
-\item[\texttt{dev\_weight}] blocco di lavoro (\textit{work quantum}) dello
- scheduler di processo dei pacchetti.
+\item[\procrelfile{/proc/sys/net/core}{dev\_weight}] blocco di lavoro
+ (\textit{work quantum}) dello scheduler di processo dei pacchetti.
% TODO da documentare meglio
-\item[\texttt{lo\_cong}] valore per l'occupazione della coda di ricezione
- sotto la quale si considera di avere una bassa congestione.
+\item[\procrelfile{/proc/sys/net/core}{lo\_cong}] valore per l'occupazione
+ della coda di ricezione sotto la quale si considera di avere una bassa
+ congestione.
-\item[\texttt{mod\_cong}] valore per l'occupazione della coda di ricezione
- sotto la quale si considera di avere una congestione moderata.
+\item[\procrelfile{/proc/sys/net/core}{mod\_cong}] valore per l'occupazione
+ della coda di ricezione sotto la quale si considera di avere una congestione
+ moderata.
-\item[\texttt{no\_cong}] valore per l'occupazione della coda di ricezione
- sotto la quale si si considera di non avere congestione.
+\item[\procrelfile{/proc/sys/net/core}{no\_cong}] valore per l'occupazione
+ della coda di ricezione sotto la quale si si considera di non avere
+ congestione.
-\item[\texttt{no\_cong\_thresh}] valore minimo (\textit{low water mark}) per
- il riavvio dei dispositivi congestionati.
+\item[\procrelfile{/proc/sys/net/core}{no\_cong\_thresh}] valore minimo
+ (\textit{low water mark}) per il riavvio dei dispositivi congestionati.
-%\item[\texttt{netdev\_fastroute}] è presente soltanto quando si è compilato il
-% kernel con l'apposita opzione di ottimizzazione per l'uso come router (.
+ % \item[\procrelfile{/proc/sys/net/core}{netdev\_fastroute}] è presente
+ % soltanto quando si è compilato il kernel con l'apposita opzione di
+ % ottimizzazione per l'uso come router.
-\item[\texttt{somaxconn}] imposta la dimensione massima del \textit{backlog}
- della funzione \func{listen} (vedi sez.~\ref{sec:TCP_func_listen}), e
- corrisponde al valore della costante \const{SOMAXCONN}; il suo valore di
- default è 128.
+\item[\procrelfile{/proc/sys/net/core}{somaxconn}] imposta la dimensione
+ massima del \textit{backlog} della funzione \func{listen} (vedi
+ sez.~\ref{sec:TCP_func_listen}), e corrisponde al valore della costante
+ \const{SOMAXCONN}; il suo valore di default è 128.
\end{basedescript}
accessibile con \texttt{man 7 ip}, sono i seguenti:
\begin{basedescript}{\desclabelwidth{3.5cm}\desclabelstyle{\nextlinelabel}}
-\item[\texttt{ip\_default\_ttl}] imposta il valore di default per il campo TTL
- (vedi sez.~\ref{sec:IP_header}) di tutti i pacchetti uscenti, stabilendo
- così il numero massimo di router che i pacchetti possono attraversare. Il
- valore può essere modificato anche per il singolo socket con l'opzione
- \const{IP\_TTL}. Prende un valore intero, ma dato che il campo citato è di
- 8 bit hanno senso solo valori fra 0 e 255. Il valore di default è 64, e non
- ci normalmente non c'è nessuna necessità di modificarlo,\footnote{l'unico
- motivo sarebbe per raggiungere macchine estremamente ``{lontane}'' in
- termini di \textit{hop}, ma è praticamente } aumentare il valore è una
- pratica poco gentile, in quanto in caso di problemi di routing si allunga
- inutilmente il numero di ritrasmissioni.
+\item[\procrelfile{/proc/sys/net/ipv4}{ip\_default\_ttl}] imposta il valore di
+ default per il campo TTL (vedi sez.~\ref{sec:IP_header}) di tutti i
+ pacchetti uscenti, stabilendo così il numero massimo di router che i
+ pacchetti possono attraversare. Il valore può essere modificato anche per il
+ singolo socket con l'opzione \const{IP\_TTL}. Prende un valore intero, ma
+ dato che il campo citato è di 8 bit hanno senso solo valori fra 0 e 255. Il
+ valore di default è 64, e non ci normalmente non c'è nessuna necessità di
+ modificarlo,\footnote{l'unico motivo sarebbe per raggiungere macchine
+ estremamente ``{lontane}'' in termini di \textit{hop}, ma è praticamente }
+ aumentare il valore è una pratica poco gentile, in quanto in caso di
+ problemi di routing si allunga inutilmente il numero di ritrasmissioni.
-\item[\texttt{ip\_forward}] abilita l'inoltro dei pacchetti da una interfaccia
- ad un altra, e può essere impostato anche per la singola interfaccia. Prende
- un valore logico (0 disabilita, diverso da zero abilita).
-
-\item[\texttt{ip\_dynaddr}] Abilita la riscrittura automatica degli indirizzi
- associati ad un socket quando una interfaccia cambia indirizzo. Viene usato
- per le interfacce usate nei collegamenti in dial-up, il cui indirizzo IP
- viene assegnato dinamicamente dal provider, e può essere modificato. Un
- valore nullo disabilita la funzionalità, con 1 la si abilita, con 2 la si
- abilità in modalità \textsl{prolissa}.
-
-\item[\texttt{ip\_autoconfig}] Specifica se l'indirizzo IP è stato configurato
- automaticamente via DHCP, BOOTP o RARP.
-
-\item[\texttt{ip\_local\_port\_range}] imposta l'intervallo dei valori usati
- per l'assegnazione delle porte effimere, permette cioè di modificare i
- valori illustrati in fig.~\ref{fig:TCP_port_alloc}; prende due valori
- numerici, che indicano gli estremi dell'intervallo. Si abbia cura di non
- definire un intervallo che si sovrappone a quello delle porte usate per il
- \itindex{masquerading} \textit{masquerading}, il kernel può gestire la
- sovrapposizione, ma si avrà una perdita di prestazioni. Si imposti sempre un
- valore iniziale maggiore di 1024 (o meglio ancora di 4096) per evitare
- conflitti con le porte usate dai servizi noti.
-
-\item[\texttt{ip\_no\_pmtu\_disc}] imposta la disciplina di ricerca della
- \itindex{Maximum~Transfer~Unit} \textit{Path MTU} (vedi
- sez.~\ref{sec:net_lim_dim} e sez.~\ref{sec:sock_ipv4_options}).
-
-\item[\texttt{ipfrag\_high\_thresh}] limite massimo (espresso in numero di
- byte) sui pacchetti IP frammentati presenti in coda; quando questo valore
- viene raggiunta la coda viene ripulita fino al valore
+\item[\procrelfile{/proc/sys/net/ipv4}{ip\_forward}] abilita l'inoltro dei
+ pacchetti da una interfaccia ad un altra, e può essere impostato anche per
+ la singola interfaccia. Prende un valore logico (0 disabilita, diverso da
+ zero abilita).
+
+\item[\procrelfile{/proc/sys/net/ipv4}{ip\_dynaddr}] Abilita la riscrittura
+ automatica degli indirizzi associati ad un socket quando una interfaccia
+ cambia indirizzo. Viene usato per le interfacce usate nei collegamenti in
+ dial-up, il cui indirizzo IP viene assegnato dinamicamente dal provider, e
+ può essere modificato. Un valore nullo disabilita la funzionalità, con 1 la
+ si abilita, con 2 la si abilità in modalità \textsl{prolissa}.
+
+\item[\procrelfile{/proc/sys/net/ipv4}{ip\_autoconfig}] Specifica se
+ l'indirizzo IP è stato configurato automaticamente via DHCP, BOOTP o RARP.
+
+\item[\procrelfile{/proc/sys/net/ipv4}{ip\_local\_port\_range}] imposta
+ l'intervallo dei valori usati per l'assegnazione delle porte effimere,
+ permette cioè di modificare i valori illustrati in
+ fig.~\ref{fig:TCP_port_alloc}; prende due valori numerici, che indicano gli
+ estremi dell'intervallo. Si abbia cura di non definire un intervallo che si
+ sovrappone a quello delle porte usate per il \itindex{masquerading}
+ \textit{masquerading}, il kernel può gestire la sovrapposizione, ma si avrà
+ una perdita di prestazioni. Si imposti sempre un valore iniziale maggiore di
+ 1024 (o meglio ancora di 4096) per evitare conflitti con le porte usate dai
+ servizi noti.
+
+\item[\procrelfile{/proc/sys/net/ipv4}{ip\_no\_pmtu\_disc}] imposta la
+ disciplina di ricerca della \itindex{Maximum~Transfer~Unit} \textit{Path
+ MTU} (vedi sez.~\ref{sec:net_lim_dim} e sez.~\ref{sec:sock_ipv4_options}).
+
+\item[\procrelfile{/proc/sys/net/ipv4}{ipfrag\_high\_thresh}] limite massimo
+ (espresso in numero di byte) sui pacchetti IP frammentati presenti in coda;
+ quando questo valore viene raggiunta la coda viene ripulita fino al valore
\texttt{ipfrag\_low\_thresh}.
-\item[\texttt{ipfrag\_low\_thresh}] soglia bassa (specificata in byte) cui
- viene riportata la coda dei pacchetti IP frammentati quando si raggiunge il
- valore \texttt{ipfrag\_high\_thresh}.
-
-\item[\texttt{ip\_always\_defrag}] se abilitato (prende un intero come valore
- logico) tutti i pacchetti IP frammentati saranno riassemblati, anche in caso
- in successivo immediato inoltro.\footnote{introdotto con il kernel 2.2.13,
- nelle versioni precedenti questo comportamento poteva essere solo in fase
- di compilazione del kernel con l'opzione
- \texttt{CONFIG\_IP\_ALWAYS\_DEFRAG}.}
-
-\item[\texttt{ip\_nonlocal\_bind}] se abilitato (prende un intero come valore
- logico) è possibile che una applicazione possa collegarsi (con \func{bind}
- su un indirizzo non locale. Questo può risultare utile per applicazioni
- particolari (come gli \textit{sniffer}) che hanno la necessità di ricevere
- pacchetti anche non diretti agli indirizzi presenti sulla macchina, ad
- esempio per intercettare il traffico per uno specifico indirizzo che si
- vuole tenere sotto controllo.
+\item[\procrelfile{/proc/sys/net/ipv4}{ipfrag\_low\_thresh}] soglia bassa
+ (specificata in byte) cui viene riportata la coda dei pacchetti IP
+ frammentati quando si raggiunge il valore \texttt{ipfrag\_high\_thresh}.
+
+\item[\procrelfile{/proc/sys/net/ipv4}{ip\_always\_defrag}] se abilitato
+ (prende un intero come valore logico) tutti i pacchetti IP frammentati
+ saranno riassemblati, anche in caso in successivo immediato
+ inoltro.\footnote{introdotto con il kernel 2.2.13, nelle versioni precedenti
+ questo comportamento poteva essere solo in fase di compilazione del kernel
+ con l'opzione \texttt{CONFIG\_IP\_ALWAYS\_DEFRAG}.}
+
+\item[\procrelfile{/proc/sys/net/ipv4}{ip\_nonlocal\_bind}] se abilitato
+ (prende un intero come valore logico) è possibile che una applicazione possa
+ collegarsi (con \func{bind} su un indirizzo non locale. Questo può risultare
+ utile per applicazioni particolari (come gli \textit{sniffer}) che hanno la
+ necessità di ricevere pacchetti anche non diretti agli indirizzi presenti
+ sulla macchina, ad esempio per intercettare il traffico per uno specifico
+ indirizzo che si vuole tenere sotto controllo.
% \item[\texttt{neigh/*}] La directory contiene i valori
% TODO trattare neigh/* nella parte su arp, da capire dove sarà.
pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
\begin{basedescript}{\desclabelwidth{3.9cm}\desclabelstyle{\nextlinelabel}}
-\item[\texttt{tcp\_abort\_on\_overflow}] è un valore logico (disabilitato di
- default) che indica di azzerare le connessioni quando il programma che le
- riceve è troppo lento ed incapace di accettarle. Questo consente di
- recuperare le connessioni se si è avuto un eccesso dovuto ad un qualche
- picco di traffico, ma ovviamente va a discapito dei client che interrogano
- il server. Pertanto è da abilitare soltanto quando si è sicuri che non è
- possibile ottimizzare il server in modo che sia in grado di accettare
- connessioni più rapidamente.
-
-\item[\texttt{tcp\_adv\_win\_scale}] questa variabile intera indica al kernel
- quanto spazio all'interno del buffer associato ad un socket (quello
- impostato con \texttt{tcp\_rmem}) deve essere utilizzato per la finestra del
- protocollo TCP (quello che costituisce la \itindex{advertised~window}
- \textit{advertised window} annunciata all'altro capo del socket) e quello
- che viene usato come buffer applicativo per isolare la rete dalle latenze
- dell'applicazione. Il valore viene calcolato secondo la formula
- $\texttt{buffer}/2^\texttt{tcp\_adv\_win\_scale}$ se positivo o con
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_abort\_on\_overflow}] è un valore
+ logico (disabilitato di default) che indica di azzerare le connessioni
+ quando il programma che le riceve è troppo lento ed incapace di accettarle.
+ Questo consente di recuperare le connessioni se si è avuto un eccesso dovuto
+ ad un qualche picco di traffico, ma ovviamente va a discapito dei client che
+ interrogano il server. Pertanto è da abilitare soltanto quando si è sicuri
+ che non è possibile ottimizzare il server in modo che sia in grado di
+ accettare connessioni più rapidamente.
+
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_adv\_win\_scale}] questa variabile
+ intera indica al kernel quanto spazio all'interno del buffer associato ad un
+ socket (quello impostato con \texttt{tcp\_rmem}) deve essere utilizzato per
+ la finestra del protocollo TCP (quello che costituisce la
+ \itindex{advertised~window} \textit{advertised window} annunciata all'altro
+ capo del socket) e quello che viene usato come buffer applicativo per
+ isolare la rete dalle latenze dell'applicazione. Il valore viene calcolato
+ secondo la formula $\texttt{buffer}/2^\texttt{tcp\_adv\_win\_scale}$ se
+ positivo o con
$\texttt{buffer}-\texttt{buffer}/2^\texttt{tcp\_adv\_win\_scale}$ se
negativo. Il valore di default è 2 che significa che al buffer
dell'applicazione viene riservato un quarto del totale.
-\item[\texttt{tcp\_app\_win}] il valore indica quanti byte della finestra TCP
- vengono riservati per la bufferizzazione, valore è il massimo fra la
- \itindex{Maximum~Segment~Size} MSS e
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_app\_win}] il valore indica quanti
+ byte della finestra TCP vengono riservati per la bufferizzazione, valore è
+ il massimo fra la \itindex{Maximum~Segment~Size} MSS e
$\texttt{window}/2^\texttt{tcp\_app\_win}$. Un valore nullo significa che
non viene riservato nessuno spazio; il default è 31.
% \item[\texttt{tcp\_bic\_low\_window}]
% \item[\texttt{tcp\_bic\_fast\_convergence}]
-\item[\texttt{tcp\_dsack}] Abilita il supporto definito
- nell'\href{http://www.ietf.org/rfc/rfc2884.txt}{RFC~2884} per il
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_dsack}] Abilita il supporto
+ definito nell'\href{http://www.ietf.org/rfc/rfc2884.txt}{RFC~2884} per il
\textit{Duplicate SACK}.\footnote{si indica con SACK (\textit{Selective
Acknowledgement}) un'opzione TCP, definita
nell'\href{http://www.ietf.org/rfc/rfc2018.txt}{RFC~2018}, usata per dare
un \textit{acknowledgement} unico su blocchi di pacchetti non contigui.}
-\item[\texttt{tcp\_ecn}] Abilita il meccanismo della \textit{Explicit
- Congestion Notification} (o ECN) definito
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_ecn}] Abilita il meccanismo della
+ \textit{Explicit Congestion Notification} (o ECN) definito
nell'\href{http://www.ietf.org/rfc/rfc2884.txt}{RFC~2884}. Si tenga presente
che se si abilita questa opzione si possono avere dei malfunzionamenti
apparentemente casuali dipendenti dalla destinazione, dovuti al fatto che
alcuni vecchi router non supportano il meccanismo ed alla sua attivazione
scartano i relativi pacchetti.\\
-\item[\texttt{tcp\_fack}] è un valore logico che abilita il supporto per il
- \textit{TCP Forward Acknowledgement}. Di default è abilitato.
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_fack}] è un valore logico che
+ abilita il supporto per il \textit{TCP Forward Acknowledgement}. Di default
+ è abilitato.
% TODO documentare o descrivere che cos'è il TCP Forward Acknowledgement
-\item[\texttt{tcp\_fin\_timeout}] specifica il numero di secondi (il default è
- 60\footnote{nei kernel della serie 2.2.x era invece di 120 secondi.}) da
- passare in stato \texttt{FIN\_WAIT2} nell'attesa delle ricezione del
- pacchetto FIN conclusivo, passati quali il socket viene comunque chiuso
- forzatamente. L'uso di questa opzione realizza quella che in sostanza è una
- violazione delle specifiche del protocollo TCP, ma è utile per fronteggiare
- alcuni attacchi di \itindex{Denial~of~Service~(DoS)} \textit{Denial of
- Service}.
-
-\item[\texttt{tcp\_frto}] è un valore logico che abilita il supporto per
- l'algoritmo F-RTO, un algoritmo usato per la ritrasmissione dei timeout del
- protocollo TCP, che diventa molto utile per le reti wireless dove la perdita
- di pacchetti è usualmente dovuta a delle interferenze radio, piuttosto che
- alla congestione dei router. Di default è disabilitato.
-
-
-\item[\texttt{tcp\_keepalive\_intvl}] il numero di secondi che deve
- trascorrere fra l'emissione di due successivi pacchetti di test quando è
- abilitata la funzionalità del \textit{keepalive} (vedi
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_fin\_timeout}] specifica il numero
+ di secondi (il default è 60\footnote{nei kernel della serie 2.2.x era invece
+ di 120 secondi.}) da passare in stato \texttt{FIN\_WAIT2} nell'attesa
+ delle ricezione del pacchetto FIN conclusivo, passati quali il socket viene
+ comunque chiuso forzatamente. L'uso di questa opzione realizza quella che
+ in sostanza è una violazione delle specifiche del protocollo TCP, ma è utile
+ per fronteggiare alcuni attacchi di \itindex{Denial~of~Service~(DoS)}
+ \textit{Denial of Service}.
+
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_frto}] è un valore logico che
+ abilita il supporto per l'algoritmo F-RTO, un algoritmo usato per la
+ ritrasmissione dei timeout del protocollo TCP, che diventa molto utile per
+ le reti wireless dove la perdita di pacchetti è usualmente dovuta a delle
+ interferenze radio, piuttosto che alla congestione dei router. Di default è
+ disabilitato.
+
+
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_keepalive\_intvl}] il numero di
+ secondi che deve trascorrere fra l'emissione di due successivi pacchetti di
+ test quando è abilitata la funzionalità del \textit{keepalive} (vedi
sez.~\ref{sec:sock_options_main}). Il valore di default è 75.
-\item[\texttt{tcp\_keepalive\_probes}] il massimo numero pacchetti di
- \textit{keepalive} (vedi sez.~\ref{sec:sock_options_main}) che devono essere
- inviati senza ricevere risposta prima che il kernel decida che la
- connessione è caduta e la termini. Il valore di default è 9.
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_keepalive\_probes}] il massimo
+ numero pacchetti di \textit{keepalive} (vedi
+ sez.~\ref{sec:sock_options_main}) che devono essere inviati senza ricevere
+ risposta prima che il kernel decida che la connessione è caduta e la
+ termini. Il valore di default è 9.
-\item[\texttt{tcp\_keepalive\_time}] il numero di secondi che devono passare
- senza traffico sulla connessione prima che il kernel, qualora si sia
- utilizzata l'opzione \const{SO\_KEEPALIVE} (vedi
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_keepalive\_time}] il numero di
+ secondi che devono passare senza traffico sulla connessione prima che il
+ kernel, qualora si sia utilizzata l'opzione \const{SO\_KEEPALIVE} (vedi
sez.~\ref{sec:sock_options_main}), inizi ad inviare pacchetti di pacchetti
di \textit{keepalive}. Il default è 7200, pari a due ore.
-\item[\texttt{tcp\_low\_latency}] un valore logico che indica allo stack TCP
- del kernel di ottimizzare il comportamento per ottenere tempi di latenza più
- bassi a scapito di valori più alti per l'utilizzo della banda. Di default è
- disabilitato in quanto un maggior utilizzo della banda è preferito, ma
- esistono applicazioni particolari in cui la riduzione della latenza è più
- importante (ad esempio i cluster di calcolo parallelo) in cui lo si può
- abilitare.
-
-\item[\texttt{tcp\_max\_orphans}] il numero massimo di socket TCP
- ``\textsl{orfani}'' (vale a dire non associati a nessun file descriptor)
- consentito nel sistema.\footnote{trattasi in genere delle connessioni
- relative a socket chiusi che non hanno completato il processo di
- chiusura.} Quando il limite viene ecceduto la connessione orfana viene
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_low\_latency}] un valore logico
+ che indica allo stack TCP del kernel di ottimizzare il comportamento per
+ ottenere tempi di latenza più bassi a scapito di valori più alti per
+ l'utilizzo della banda. Di default è disabilitato in quanto un maggior
+ utilizzo della banda è preferito, ma esistono applicazioni particolari in
+ cui la riduzione della latenza è più importante (ad esempio i cluster di
+ calcolo parallelo) in cui lo si può abilitare.
+
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_max\_orphans}] il numero massimo
+ di socket TCP ``\textsl{orfani}'' (vale a dire non associati a nessun file
+ descriptor) consentito nel sistema.\footnote{trattasi in genere delle
+ connessioni relative a socket chiusi che non hanno completato il processo
+ di chiusura.} Quando il limite viene ecceduto la connessione orfana viene
resettata e viene stampato un avvertimento. Questo limite viene usato per
contrastare alcuni elementari attacchi di \textit{denial of service}.
Diminuire il valore non è mai raccomandato, in certe condizioni di rete può
\texttt{NR\_FILE}, e viene aggiustato a seconda della memoria disponibile.
% TODO verificare la spiegazione di connessione orfana
-\item[\texttt{tcp\_max\_syn\_backlog}] un numero intero che indica la
- lunghezza della coda delle connessioni incomplete, cioè delle connessioni
- per le quali si è ricevuto un SYN di richiesta ma non l'ACK finale del
- \itindex{three~way~handshake} \textit{three way handshake} (si riveda quanto
- illustrato in sez.\ref{sec:TCP_func_listen}).
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_max\_syn\_backlog}] un numero
+ intero che indica la lunghezza della coda delle connessioni incomplete, cioè
+ delle connessioni per le quali si è ricevuto un SYN di richiesta ma non
+ l'ACK finale del \itindex{three~way~handshake} \textit{three way handshake}
+ (si riveda quanto illustrato in sez.~\ref{sec:TCP_func_listen}).
Quando questo valore è superato il kernel scarterà immediatamente ogni
ulteriore richiesta di connessione. Il valore di default (che è 256) viene
sia $\mathtt{tcp\_max\_syn\_backlog} \ge \mathtt{16*TCP\_SYNQ\_HSIZE}$,
per poi ricompilare il kernel.}
-\item[\texttt{tcp\_max\_tw\_buckets}] questo valore indica il numero massimo
- di socket in stato \texttt{TIME\_WAIT} consentito nel sistema; viene
- impostato per prevenire semplici attacchi di \textit{denial of service} ed
- inizializzato di default ad un valore del parametro \texttt{NR\_FILE}, per
- poi essere aggiustato a seconda della memoria presente. Se il valore viene
- superato il socket viene chiuso con la stampa di un avviso.
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_max\_tw\_buckets}] questo valore
+ indica il numero massimo di socket in stato \texttt{TIME\_WAIT} consentito
+ nel sistema; viene impostato per prevenire semplici attacchi di
+ \textit{denial of service} ed inizializzato di default ad un valore del
+ parametro \texttt{NR\_FILE}, per poi essere aggiustato a seconda della
+ memoria presente. Se il valore viene superato il socket viene chiuso con la
+ stampa di un avviso.
-\item[\texttt{tcp\_mem}] una tripletta di valori usati dallo stack TCP per
- controllare il proprio uso della memoria. Il primo valore, chiamato
- \textit{low} nelle pagine di manuale, indica il numero di pagine allocate
- sotto il quale non viene usato nessun meccanismo di regolazione dell'uso
- della memoria.
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_mem}] una tripletta di valori
+ usati dallo stack TCP per controllare il proprio uso della memoria. Il primo
+ valore, chiamato \textit{low} nelle pagine di manuale, indica il numero di
+ pagine allocate sotto il quale non viene usato nessun meccanismo di
+ regolazione dell'uso della memoria.
Il secondo valore, chiamato \textit{pressure} indica il numero di pagine
allocate passato il quale lo stack TCP inizia a moderare il suo consumo di
valore specificato dagli altri limiti del kernel.
-\item[\texttt{tcp\_orphan\_retries}] il numero massimo di volte che si esegue
- un tentativo di controllo sull'altro capo di una connessione che è stata già
- chiusa dalla nostra parte. Il valore di default è 8 volte.
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_orphan\_retries}] il numero
+ massimo di volte che si esegue un tentativo di controllo sull'altro capo di
+ una connessione che è stata già chiusa dalla nostra parte. Il valore di
+ default è 8 volte.
-\item[\texttt{tcp\_reordering}] il numero massimo di volte che un pacchetto
- può essere riordinato nel flusso di dati, prima che lo stack TCP assuma che
- è andato perso e si ponga nello stato di \textit{slow start} (si veda
- sez.~\ref{sez:tcp_protocol_xxx}) viene usata questa metrica di
- riconoscimento dei riordinamenti per evitare inutili ritrasmissioni
- provocate dal riordinamento. Non è opportuno modificare questo valore dal
- default che è 3.
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_reordering}] il numero massimo di
+ volte che un pacchetto può essere riordinato nel flusso di dati, prima che
+ lo stack TCP assuma che è andato perso e si ponga nello stato di
+ \textit{slow start} (si veda sez.~\ref{sez:tcp_protocol_xxx}) viene usata
+ questa metrica di riconoscimento dei riordinamenti per evitare inutili
+ ritrasmissioni provocate dal riordinamento. Non è opportuno modificare
+ questo valore dal default che è 3.
-\item[\texttt{tcp\_retrans\_collapse}]
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_retrans\_collapse}]
-\item[\texttt{tcp\_retries1}] imposta il massimo numero di volte che
- protocollo tenterà la ritrasmissione si un pacchetto su una connessione
- stabilita prima di fare ricorso ad ulteriori sforzi che coinvolgano anche il
- livello di rete. Passato questo numero di ritrasmissioni verrà fatto
- eseguire al livello di rete un tentativo di aggiornamento della rotta verso
- la destinazione prima di eseguire ogni successiva ritrasmissione.
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_retries1}] imposta il massimo
+ numero di volte che protocollo tenterà la ritrasmissione si un pacchetto su
+ una connessione stabilita prima di fare ricorso ad ulteriori sforzi che
+ coinvolgano anche il livello di rete. Passato questo numero di
+ ritrasmissioni verrà fatto eseguire al livello di rete un tentativo di
+ aggiornamento della rotta verso la destinazione prima di eseguire ogni
+ successiva ritrasmissione.
-\item[\texttt{tcp\_retries2}] imposta il numero di tentativi di ritrasmissione
- di un pacchetto inviato su una connessione già stabilita per il quale non si
- sia ricevuto una risposta di ACK (si veda anche quanto illustrato in
- sez.~\ref{sec:TCP_server_crash}). Il valore default è 15, che significa un
- tempo variabile fra 13 e 30 minuti; questo non corrisponde a quanto
- richiesto nell'\href{http://www.ietf.org/rfc/rfc1122.txt}{RFC~1122} dove è
- indicato un massimo di 100 secondi, che però è un valore considerato troppo
- basso.
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_retries2}] imposta il numero di
+ tentativi di ritrasmissione di un pacchetto inviato su una connessione già
+ stabilita per il quale non si sia ricevuto una risposta di ACK (si veda
+ anche quanto illustrato in sez.~\ref{sec:TCP_server_crash}). Il valore
+ default è 15, che significa un tempo variabile fra 13 e 30 minuti; questo
+ non corrisponde a quanto richiesto
+ nell'\href{http://www.ietf.org/rfc/rfc1122.txt}{RFC~1122} dove è indicato un
+ massimo di 100 secondi, che però è un valore considerato troppo basso.
-\item[\texttt{tcp\_rfc1337}]
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_rfc1337}]
-\item[\texttt{tcp\_rmem}]
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_rmem}]
-\item[\texttt{tcp\_sack}]
-\item[\texttt{tcp\_stdurg}]
-\item[\texttt{tcp\_synack\_retries}]
-\item[\texttt{tcp\_syncookies}]
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_sack}]
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_stdurg}]
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_synack\_retries}]
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_syncookies}]
-\item[\texttt{tcp\_syn\_retries}] imposta il numero di tentativi (il default è
- 5) di ritrasmissione dei pacchetti SYN di inizio connessione del
- \itindex{three~way~handshake} \textit{three way handshake} (si ricordi
- quanto illustrato in sez.\ref{sec:TCP_func_connect}). Il valore non deve
- superare 255.
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_syn\_retries}] imposta il numero
+ di tentativi (il default è 5) di ritrasmissione dei pacchetti SYN di inizio
+ connessione del \itindex{three~way~handshake} \textit{three way handshake}
+ (si ricordi quanto illustrato in sez.~\ref{sec:TCP_func_connect}). Il valore
+ non deve superare 255.
-\item[\texttt{tcp\_timestamps}]
-\item[\texttt{tcp\_tw\_recycle}]
-\item[\texttt{tcp\_tw\_reuse}]
-\item[\texttt{tcp\_window\_scaling}]
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_timestamps}]
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_tw\_recycle}]
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_tw\_reuse}]
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_window\_scaling}]
-\item[\texttt{tcp\_vegas\_cong\_avoid}]
-\item[\texttt{tcp\_westwood}]
-\item[\texttt{tcp\_wmem}]
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_vegas\_cong\_avoid}]
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_westwood}]
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_wmem}]
\end{basedescript}
% LocalWords: socket sez dotted decimal resolver Domain Name Service cap DNS
scrittura.
Il tipo di filesystem è specificato da \param{filesystemtype}, che deve essere
-una delle stringhe riportate nel file \file{/proc/filesystems}, che contiene
-l'elenco dei filesystem supportati dal kernel; nel caso si sia indicato uno
-dei filesystem virtuali, il contenuto di \param{source} viene ignorato.
+una delle stringhe riportate nel file \procfile{/proc/filesystems}, che
+contiene l'elenco dei filesystem supportati dal kernel; nel caso si sia
+indicato uno dei filesystem virtuali, il contenuto di \param{source} viene
+ignorato.
Dopo l'esecuzione della funzione il contenuto del filesystem viene resto
disponibile nella directory specificata come \textit{mount point}, il
Le \acr{glibc} provvedono infine una serie di funzioni per la gestione dei due
-file \file{/etc/fstab} ed \file{/etc/mtab}, che convenzionalmente sono usati
-in quasi tutti i sistemi unix-like per mantenere rispettivamente le
+file \conffile{/etc/fstab} ed \conffile{/etc/mtab}, che convenzionalmente sono
+usati in quasi tutti i sistemi unix-like per mantenere rispettivamente le
informazioni riguardo ai filesystem da montare e a quelli correntemente
montati. Le funzioni servono a leggere il contenuto di questi file in
opportune strutture \struct{fstab} e \struct{mntent}, e, per \file{/etc/mtab}
per inserire e rimuovere le voci presenti nel file.
In generale si dovrebbero usare queste funzioni (in particolare quelle
-relative a \file{/etc/mtab}), quando si debba scrivere un programma che
+relative a \conffile{/etc/mtab}), quando si debba scrivere un programma che
effettua il montaggio di un filesystem; in realtà in questi casi è molto più
semplice invocare direttamente il programma \cmd{mount}, per cui ne
tralasceremo la trattazione, rimandando al manuale delle \acr{glibc}
Tradizionalmente le informazioni utilizzate nella gestione di utenti e gruppi
(password, corrispondenze fra nomi simbolici e user-id, home directory, ecc.)
-venivano registrate all'interno dei due file di testo \file{/etc/passwd} ed
-\file{/etc/group},\footnote{in realtà oltre a questi nelle distribuzioni più
- recenti è stato introdotto il sistema delle \textit{shadow password} che
- prevede anche i due file \file{/etc/shadow} e \file{/etc/gshadow}, in cui
- sono state spostate le informazioni di autenticazione (ed inserite alcune
- estensioni) per toglierle dagli altri file che devono poter essere letti per
- poter effettuare l'associazione fra username e \acr{uid}.} il cui formato è
-descritto dalle relative pagine del manuale\footnote{nella quinta sezione,
- quella dei file di configurazione, occorre cioè usare \cmd{man 5 passwd}
- dato che altrimenti si avrebbe la pagina di manuale del comando
- \cmd{passwd}.} e tutte le funzioni che richiedevano l'accesso a queste
-informazione andavano a leggere direttamente il contenuto di questi file.
+venivano registrate all'interno dei due file di testo \conffile{/etc/passwd}
+ed \conffile{/etc/group},\footnote{in realtà oltre a questi nelle
+ distribuzioni più recenti è stato introdotto il sistema delle \textit{shadow
+ password} che prevede anche i due file \conffile{/etc/shadow} e
+ \conffile{/etc/gshadow}, in cui sono state spostate le informazioni di
+ autenticazione (ed inserite alcune estensioni) per toglierle dagli altri
+ file che devono poter essere letti per poter effettuare l'associazione fra
+ username e \acr{uid}.} il cui formato è descritto dalle relative pagine del
+manuale\footnote{nella quinta sezione, quella dei file di configurazione,
+ occorre cioè usare \cmd{man 5 passwd} dato che altrimenti si avrebbe la
+ pagina di manuale del comando \cmd{passwd}.} e tutte le funzioni che
+richiedevano l'accesso a queste informazione andavano a leggere direttamente
+il contenuto di questi file.
Col tempo però questa impostazione ha incominciato a mostrare dei limiti: da
una parte il meccanismo classico di autenticazione è stato ampliato, ed oggi
\end{figure}
Le funzioni viste finora sono in grado di leggere le informazioni sia
-direttamente dal file delle password in \file{/etc/passwd} che tramite il
-sistema del \itindex{Name~Service~Switch} \textit{Name Service Switch} e
-sono completamente generiche. Si noti però che non c'è una funzione che
-permetta di impostare direttamente una password.\footnote{in realtà questo può
- essere fatto ricorrendo a PAM, ma questo è un altro discorso.} Dato che
-POSIX non prevede questa possibilità esiste un'altra interfaccia che lo fa,
-derivata da SVID le cui funzioni sono riportate in
-tab.~\ref{tab:sys_passwd_func}. Questa però funziona soltanto quando le
-informazioni sono mantenute su un apposito file di \textsl{registro} di utenti
-e gruppi, con il formato classico di \file{/etc/passwd} e \file{/etc/group}.
+direttamente dal file delle password in \conffile{/etc/passwd} che tramite il
+sistema del \itindex{Name~Service~Switch} \textit{Name Service Switch} e sono
+completamente generiche. Si noti però che non c'è una funzione che permetta di
+impostare direttamente una password.\footnote{in realtà questo può essere
+ fatto ricorrendo a PAM, ma questo è un altro discorso.} Dato che POSIX non
+prevede questa possibilità esiste un'altra interfaccia che lo fa, derivata da
+SVID le cui funzioni sono riportate in tab.~\ref{tab:sys_passwd_func}. Questa
+però funziona soltanto quando le informazioni sono mantenute su un apposito
+file di \textsl{registro} di utenti e gruppi, con il formato classico di
+\conffile{/etc/passwd} e \conffile{/etc/group}.
\begin{table}[htb]
\footnotesize
\func{fgetpwent\_r}& Come la precedente, ma rientrante.\\
\func{putpwent} & Immette una voce in un file di registro degli
utenti.\\
- \func{getpwent} & Legge una voce da \file{/etc/passwd}.\\
+ \func{getpwent} & Legge una voce da \conffile{/etc/passwd}.\\
\func{getpwent\_r} & Come la precedente, ma rientrante.\\
- \func{setpwent} & Ritorna all'inizio di \file{/etc/passwd}.\\
- \func{endpwent} & Chiude \file{/etc/passwd}.\\
+ \func{setpwent} & Ritorna all'inizio di \conffile{/etc/passwd}.\\
+ \func{endpwent} & Chiude \conffile{/etc/passwd}.\\
\func{fgetgrent} & Legge una voce dal file di registro dei gruppi
specificato.\\
\func{fgetgrent\_r}& Come la precedente, ma rientrante.\\
\func{putgrent} & Immette una voce in un file di registro dei gruppi.\\
- \func{getgrent} & Legge una voce da \file{/etc/group}.\\
+ \func{getgrent} & Legge una voce da \conffile{/etc/group}.\\
\func{getgrent\_r} & Come la precedente, ma rientrante.\\
- \func{setgrent} & Ritorna all'inizio di \file{/etc/group}.\\
- \func{endgrent} & Chiude \file{/etc/group}.\\
+ \func{setgrent} & Ritorna all'inizio di \conffile{/etc/group}.\\
+ \func{endgrent} & Chiude \conffile{/etc/group}.\\
\hline
\end{tabular}
\caption{Funzioni per la manipolazione dei campi di un file usato come
- registro per utenti o gruppi nel formato di \file{/etc/passwd} e
- \file{/etc/groups}.}
+ registro per utenti o gruppi nel formato di \conffile{/etc/passwd} e
+ \conffile{/etc/group}.}
\label{tab:sys_passwd_func}
\end{table}
Dato che oramai la gran parte delle distribuzioni di GNU/Linux utilizzano
almeno le \textit{shadow password} (quindi con delle modifiche rispetto al
-formato classico del file \file{/etc/passwd}), si tenga presente che le
+formato classico del file \conffile{/etc/passwd}), si tenga presente che le
funzioni di questa interfaccia che permettono di scrivere delle voci in un
\textsl{registro} degli utenti (cioè \func{putpwent} e \func{putgrent}) non
hanno la capacità di farlo specificando tutti i contenuti necessari rispetto a
apposita struttura dati definita all'interno del kernel.
Il funzionamento di \func{acct} viene inoltre modificato da uno specifico
-parametro di sistema, modificabile attraverso \file{/proc/sys/kernel/acct} (o
-tramite la corrispondente \func{sysctl}). Esso contiene tre valori interi, il
-primo indica la percentuale di spazio disco libero sopra il quale viene
+parametro di sistema, modificabile attraverso \procfile{/proc/sys/kernel/acct}
+(o tramite la corrispondente \func{sysctl}). Esso contiene tre valori interi,
+il primo indica la percentuale di spazio disco libero sopra il quale viene
ripresa una registrazione che era stata sospesa per essere scesi sotto il
minimo indicato dal secondo valore (sempre in percentuale di spazio disco
libero). Infine l'ultimo valore indica la frequenza in secondi con cui deve
Di solito questo tempo viene convertito automaticamente dal valore in UTC al
tempo locale, utilizzando le opportune informazioni di localizzazione
-(specificate in \file{/etc/timezone}). E da tenere presente che questo tempo è
-mantenuto dal sistema e non è detto che corrisponda al tempo tenuto
+(specificate in \conffile{/etc/timezone}). E da tenere presente che questo
+tempo è mantenuto dal sistema e non è detto che corrisponda al tempo tenuto
dall'orologio hardware del calcolatore.
Anche il \itindex{process~time} \textit{process time} di solito si esprime in
La funzione inizializza le variabili di fig.~\ref{fig:sys_tzname} a partire dal
valore della variabile di ambiente \const{TZ}, se quest'ultima non è definita
-verrà usato il file \file{/etc/localtime}.
+verrà usato il file \conffile{/etc/localtime}.
\begin{figure}[!htb]
\footnotesize
Authority}) ma l'elenco viene costantemente aggiornato e pubblicato su
internet (una versione aggiornata si può trovare all'indirizzo
\href{http://www.iana.org/assignments/port-numbers}
-{\texttt{http://www.iana.org/assignments/port-numbers}}); inoltre
-in un sistema unix-like un analogo elenco viene mantenuto nel file
-\file{/etc/services}, con la corrispondenza fra i vari numeri di porta ed il
-nome simbolico del servizio. I numeri sono divisi in tre intervalli:
+{\texttt{http://www.iana.org/assignments/port-numbers}}); inoltre in un
+sistema unix-like un analogo elenco viene mantenuto nel file
+\conffile{/etc/services}, con la corrispondenza fra i vari numeri di porta ed
+il nome simbolico del servizio. I numeri sono divisi in tre intervalli:
\begin{enumerate*}
\item \textsl{le porte note}. I numeri da 0 a 1023. Queste sono controllate e
demone che deve essere contattato dai client per ottenere la porta effimera
su cui si trova il server.} che in genere viene identificato dalla porta su
cui risponde (l'elenco di queste porte, e dei relativi servizi, è in
-\file{/etc/services}).
+\conffile{/etc/services}).
Con \func{bind} si può assegnare un indirizzo IP specifico ad un socket,
purché questo appartenga ad una interfaccia della macchina. Per un client TCP
secondi per un numero di volte che può essere stabilito dall'utente. Questo
può essere fatto a livello globale con una opportuna
\func{sysctl},\footnote{o più semplicemente scrivendo il valore voluto in
- \file{/proc/sys/net/ipv4/tcp\_syn\_retries}, vedi
+ \procfile{/proc/sys/net/ipv4/tcp\_syn\_retries}, vedi
sez.~\ref{sec:sock_ipv4_sysctl}.} e a livello di singolo socket con
l'opzione \const{TCP\_SYNCNT} (vedi sez.~\ref{sec:sock_tcp_udp_options}). Il
valore predefinito per la ripetizione dell'invio è di 5 volte, che comporta
della coda delle connessioni incomplete può essere ancora controllata usando
la funzione \func{sysctl} con il parametro \const{NET\_TCP\_MAX\_SYN\_BACKLOG}
o scrivendola direttamente in
-\file{/proc/sys/net/ipv4/tcp\_max\_syn\_backlog}. Quando si attiva la
+\procfile{/proc/sys/net/ipv4/tcp\_max\_syn\_backlog}. Quando si attiva la
protezione dei syncookies però (con l'opzione da compilare nel kernel e da
-attivare usando \file{/proc/sys/net/ipv4/tcp\_syncookies}) questo valore viene
-ignorato e non esiste più un valore massimo. In ogni caso in Linux il valore
-di \param{backlog} viene troncato ad un massimo di \const{SOMAXCONN} se è
-superiore a detta costante (che di default vale 128).\footnote{il valore di
+attivare usando \procfile{/proc/sys/net/ipv4/tcp\_syncookies}) questo valore
+viene ignorato e non esiste più un valore massimo. In ogni caso in Linux il
+valore di \param{backlog} viene troncato ad un massimo di \const{SOMAXCONN} se
+è superiore a detta costante (che di default vale 128).\footnote{il valore di
questa costante può essere controllato con un altro parametro di
\func{sysctl}, vedi sez.~\ref{sec:sock_ioctl_IP}.}
Il risultato finale qui dipende dall'implementazione dello stack TCP, e nel
caso di Linux anche dall'impostazione di alcuni dei parametri di sistema che
si trovano in \file{/proc/sys/net/ipv4}, che ne controllano il comportamento:
-in questo caso in particolare da \file{tcp\_retries2} (vedi
+in questo caso in particolare da
+\procrelfile{/proc/sys/net/ipv4}{tcp\_retries2} (vedi
sez.~\ref{sec:sock_ipv4_sysctl}). Questo parametro infatti specifica il numero
di volte che deve essere ritentata la ritrasmissione di un pacchetto nel mezzo
di una connessione prima di riportare un errore di timeout. Il valore