\hline
\hline
\macro{MB\_LEN\_MAX}& 16 & massima dimensione di un
- carattere multibyte\\
+ carattere esteso\\
\macro{CHAR\_BIT} & 8 & bit di \type{char}\\
\macro{UCHAR\_MAX}& 255 & massimo di \type{unsigned char}\\
\macro{SCHAR\_MIN}& -128 & minimo di \type{signed char}\\
In generale ogni limite o caratteristica del sistema per cui è definita una
macro, sia dagli standard ANSI C e ISO C90, che da POSIX.1 e POSIX.2, può
essere ottenuto attraverso una chiamata a \func{sysconf}. Il valore si otterrà
-speficando come valore del parametro \param{name} il nome ottenuto aggiungendo
+specificando come valore del parametro \param{name} il nome ottenuto aggiungendo
\code{\_SC\_} ai nomi delle macro definite dai primi due, o sostituendolo a
\code{\_POSIX\_} per le macro definite dagli gli altri due.
\end{lstlisting}
e le informazioni memorizzate nei suoi membri indicano rispettivamente:
\begin{itemize*}
-\item il nome del systema operativo;
+\item il nome del sistema operativo;
\item il nome della release del kernel;
\item il nome della versione del kernel;
\item il tipo di macchina in uso;
meccanismo di settaggio, pure un meccanismo di lettura.
Affronteremo questi argomenti in questa sezione, insieme alle funzioni che si
-usano per la gestione ed il controllo dei filesystem.
+usano per il controllo di altre caratteristiche generali del sistema, come
+quelle per la gestione dei filesystem e di utenti e gruppi.
\subsection{La funzione \func{sysctl} ed il filesystem \file{/proc}}
corrente del kernel (ad esempio dai moduli che sono stati caricati nel
sistema) e in genere i loro nomi possono variare da una versione di kernel
all'altra; per questo è sempre il caso di evitare l'uso di \func{sysctl}
-quando esistono modalità alternative per ottenere le stesse informazioni,
-alcuni esempi di parametri ottenibili sono:
+quando esistono modalità alternative per ottenere le stesse informazioni.
+Alcuni esempi di parametri ottenibili sono:
\begin{itemize*}
\item il nome di dominio
\item i parametri del meccanismo di \textit{paging}.
\end{itemize*}
Come accennato in Linux si ha una modalità alternativa per accedere alle
-stesse informazioni di \func{sysctl} attaverso l'uso del filesystem
+stesse informazioni di \func{sysctl} attraverso l'uso del filesystem
\file{/proc}. Questo è un filesystem virtuale, generato direttamente dal
kernel, che non fa riferimento a nessun dispositivo fisico, ma presenta in
forma di file alcune delle strutture interne del kernel stesso.
In particolare l'albero dei valori di \func{sysctl} viene presentato in forma
di file nella directory \file{/proc/sys}, cosicché è possibile accedervi
-speficando un pathname e leggendo e scrivendo sul file corrispondente al
+specificando un pathname e leggendo e scrivendo sul file corrispondente al
parametro scelto. Il kernel si occupa di generare al volo il contenuto ed i
nomi dei file corrispondenti, e questo ha il grande vantaggio di rendere
accessibili i vari parametri a qualunque comando di shell e di permettere la
del kernel, nella directory \file{Documentation/sysctl}.
-\subsection{La configurazione dei filesystem}
+\subsection{La gestione delle proprietà dei filesystem}
\label{sec:sys_file_config}
Come accennato in \secref{sec:file_organization} per poter accedere ai file
fallimento, nel qual caso gli errori comuni a tutti i filesystem che possono
essere restituiti in \var{errno} sono:
\begin{errlist}
- \item[\macro{EPERM}] il processo non ha i provilegi di amministratore.
+ \item[\macro{EPERM}] il processo non ha i privilegi di amministratore.
\item[\macro{ENODEV}] \param{filesystemtype} non esiste o non è configurato
nel kernel.
\item[\macro{ENOTBLK}] non si è usato un \textit{block device} per
\macro{ENAMETOOLONG}, \macro{ENOENT} o \macro{ELOOP}.}
\end{prototype}
+
La funzione monta sulla directory \param{target}, detta \textit{mount point},
-il filesystem contenuto in \param{source}. Di norma questo è un file di
-dispositivo che fa riferimento al disco (o al device a blocchi) che deve
-essere montato, ma può anche essere un file normale che contiene un
-filesystem, (che può essere montato \textit{in loopback}) o anche una
-directory. Dal kernel 2.4.x infatti è divenuto possibile sia spostare
-atomicamente un \textit{mount point} da una directory ad un'altra, che montare
-in più punti lo stesso filesystem.
-
-Con \param{filesystemtype} si indica il tipo di filesystem (che
-deve essere supportato dal kernel) indicato dalla stringa che lo identifica
-(che per quelli supportati è mantenuta in \file{/proc/filesystems}).
-
-Il parametro \param{mountflags} serve invece per specificare le opzioni di
-montaggio, esso è passato come intero a 32 bit i cui 16 più significativi
-devono essere \code{0xC0ED} mentre i 16 meno significativi costituiscono una
-maschera specificabile con un and binario dei valori riportati in \ntab.
+il filesystem contenuto in \param{source}. In generale un filesystem è
+contenuto su un disco, e l'operazione di montaggio corrisponde a rendere
+visibile al sistema il contenuto del suddetto disco, identificato attraverso
+il file di dispositivo ad esso associato.
+
+Ma la struttura del virtual filesystem vista in \secref{sec:file_vfs} è molto
+più flessibile e può essere usata anche per oggetti diversi da un disco. Ad
+esempio usando il \textit{loop device} si può montare un file qualunque (come
+l'immagine di un CD-ROM o di un floppy) che contiene un filesystem, inoltre
+alcuni filesystem, come \file{proc} o \file{devfs} sono del tutto virtuali, i
+loro dati sono generati al volo ad ogni lettura, e passati al kernel ad ogni
+scrittura.
+
+Il tipo di filesystem è specificato da \param{filesystemtype}, che deve essere
+una delle stringhe riportate in \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.
+
+Dopo l'esecuzione della funzione il contenuto del filesystem viene resto
+disponibile nella directory specificata come \textit{mount point}, il
+precedente contenuto di detta directory viene mascherato dal contenuto della
+directory radice del filesystem montato.
+
+Dal kernel 2.4.x inoltre è divenuto possibile sia spostare atomicamente un
+\textit{mount point} da una directory ad un'altra, che montare in diversi
+\textit{mount point} lo stesso filesystem, che montare più filesystem sullo
+stesso \textit{mount point} (nel qual caso vale quanto appena detto, e solo il
+contenuto dell'ultimo filesystem montato sarà visibile).
+
+Ciascun filesystem è dotato di caratteristiche specifiche che possono essere
+attivate o meno, alcune di queste sono generali (anche se non è detto siano
+disponibili in ogni filesystem), e vengono specificate come opzioni di
+montaggio con l'argomento \param{mountflags}.
+
+In Linux \param{mountflags} deve essere un intero a 32 bit i cui 16 più
+significativi sono un \textit{magic number}\footnote{cioè un numero speciale
+ usato come identificativo, che nel caso è \code{0xC0ED}; si può usare la
+ costante \macro{MS\_MGC\_MSK} per ottenere la parte di \param{mountflags}
+ riservata al \textit{magic number}.} mentre i 16 meno significativi sono
+usati per specificare le opzioni; essi sono usati come maschera binaria e
+vanno settati con un OR aritmetico della costante \macro{MS\_MGC\_VAL} con i
+valori riportati in \ntab.
\begin{table}[htb]
\centering
\textbf{Parametro} & \textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \macro{MS\_RDONLY} & 1 & montain sola lettura\\
- \macro{MS\_NOSUID} & 2 & ignora i bit \acr{suig} e \acr{sgid}\\
+ \macro{MS\_RDONLY} & 1 & monta in sola lettura\\
+ \macro{MS\_NOSUID} & 2 & ignora i bit \acr{suid} e \acr{sgid}\\
\macro{MS\_NODEV} & 4 & impedisce l'accesso ai file di dispositivo\\
\macro{MS\_NOEXEC} & 8 & impedisce di eseguire programmi \\
\macro{MS\_SYNCHRONOUS}& 16 & abilita la scrittura sincrona \\
\macro{MS\_REMOUNT} & 32 & rimonta il filesystem cambiando i flag\\
\macro{MS\_MANDLOCK} & 64 & consente il \textit{mandatory locking} (vedi
- \secref{sec:file_mand_locking})\\
+ \secref{sec:file_mand_locking})\\
+ \macro{S\_WRITE} & 128 & scrive normalmente \\
+ \macro{S\_APPEND} & 256 & consente la scrittura solo in \textit{append
+ mode} (vedi \secref{sec:file_sharing})\\
+ \macro{S\_IMMUTABLE} & 512 & impedisce che si possano modificare i file \\
\macro{MS\_NOATIME} &1024 & non aggiorna gli \textit{access time} (vedi
- \secref{sec:file_file_times})\\
+ \secref{sec:file_file_times})\\
\macro{MS\_NODIRATIME}&2048 & non aggiorna gli \textit{access time} delle
- directory\\
+ directory\\
\macro{MS\_BIND} &4096 & monta il filesystem altrove\\
\macro{MS\_MOVE} &8192 & sposta atomicamente il punto di montaggio \\
\hline
\label{tab:sys_mount_flags}
\end{table}
-Infine l'aromento \param{data} serve per passare ulteriori informazioni che
-possono essere necessarie ai vari filesystem e che variano da filesystem a
-filesystem.
+Per il settaggio delle caratteristiche particolari di ciascun filesystem si
+usa invece l'argomento \param{data} che serve per passare le ulteriori
+informazioni necessarie, che ovviamente variano da filesystem a filesystem.
+
+La funzione \func{mount} può essere utilizzata anche per effettuare il
+\textsl{rimontaggio} di un filesystem, cosa che permette di cambiarne al volo
+alcune delle caratteristiche di funzionamento (ad esempio passare da sola
+lettura a lettura/scrittura). Questa operazione è attivata attraverso uno dei
+bit di \param{mountflags}, \macro{MS\_REMOUNT}, che se settato specifica che
+deve essere effettuato il rimontaggio del filesystem (con le opzioni
+specificate dagli altri bit), anche in questo caso il valore di \param{source}
+viene ignorato.
-Si tenga presente inoltre che, sempre a partire dal kernel 2.4.x, è possibile
-sovrapporre più montaggi su una stessa directory, nel qual caso si vedrà
-sempre l'ultimo filesystem che è stato montato.
Una volta che non si voglia più utilizzare un certo filesystem è possibile
\textsl{smontarlo} usando la funzione \func{umount}, il cui prototipo è:
\bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di
fallimento, nel qual caso \var{errno} viene settata a:
\begin{errlist}
- \item[\macro{EPERM}] il processo non ha i provilegi di amministratore.
+ \item[\macro{EPERM}] il processo non ha i privilegi di amministratore.
\item[\macro{EBUSY}] \param{target} è la directory di lavoro di qualche
processo, o contiene dei file aperti, o un altro mount point.
\end{errlist}
\macro{ENAMETOOLONG}, \macro{ENOENT} o \macro{ELOOP}.}
\end{prototype}
\noindent la funzione prende il nome della directory su cui il filesystem è
-montato e non il file che è stato montato, in quanto con il kernel 2.4.x è
-possibile montare lo stesso dispositivo in più punti; inoltre nel caso più di
-un filesystem sia stato montato sullo stesso \textit{mount point} viene
-smontato quello che è stato montato per ultimo.
+montato e non il file o il dispositivo che è stato montato\footnote{questo è
+ vero a partire dal kernel 2.3.99-pre7, prima esistevano due chiamate
+ separate e la funzione poteva essere usata anche specificando il file di
+ dispositivo.}, in quanto con il kernel 2.4.x è possibile montare lo stesso
+dispositivo in più punti. Nel caso più di un filesystem sia stato montato
+sullo stesso \textit{mount point} viene smontato quello che è stato montato
+per ultimo.
+
+Linux provvede inoltre una seconda funzione \func{umount2}, che, in alcuni
+casi, permette di forzare lo smontaggio di un filesystem nei casi in cui mount
+fallirebbe; il suo prototipo è:
+
+
Due funzioni, utili per ottenere in maniera diretta informazioni riguardo al
filesystem su cui si trova un certo file, sono \func{statfs} e \func{fstatfs},