Note kernel 3.2 + prototipi delle funzioni
authorSimone Piccardi <piccardi@gnulinux.it>
Mon, 23 Jan 2012 18:16:00 +0000 (18:16 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Mon, 23 Jan 2012 18:16:00 +0000 (18:16 +0000)
filedir.tex
ipc.tex

index d2cd284994c8f6d4c90ddbed964876d28932268b..9eff764846c3b3ba271369bc92c0cfc786dda395 100644 (file)
@@ -629,7 +629,7 @@ memorizzati. L'operazione di attivazione del filesystem è chiamata
   specifica di Linux che usa la omonima \textit{system call} e non è
   portabile.}
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/mount.h} 
 \fdecl{mount(const char *source, const char *target, const char
   *filesystemtype, \\ 
@@ -1076,7 +1076,7 @@ Una volta che non si voglia più utilizzare un certo filesystem è possibile
 ``\textsl{smontarlo}'' usando la funzione di sistema \funcd{umount}, il cui
 prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/mount.h}
 \fdecl{umount(const char *target)}
 \fdesc{Smonta un filesystem.} 
@@ -1113,7 +1113,7 @@ Linux provvede inoltre una seconda funzione di sistema, \funcd{umount2}, che
 consente un maggior controllo delle operazioni, come forzare lo smontaggio di
 un filesystem anche quando questo risulti occupato; il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/mount.h}
 \fdecl{umount2(const char *target, int flags)}
 \fdesc{Smonta un filesystem.} 
@@ -1212,7 +1212,7 @@ Altre due funzioni di sistema specifiche di Linux,\footnote{esse si trovano
 diretta informazioni riguardo al filesystem su cui si trova un certo file,
 sono \funcd{statfs} e \funcd{fstatfs}, i cui prototipi sono:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/vfs.h}
 \fdecl{int statfs(const char *path, struct statfs *buf)}
 \fdecl{int fstatfs(int fd, struct statfs *buf)}
@@ -1336,7 +1336,7 @@ un file già esistente nella modalità appena descritta, per ottenere quello che
 viene denominato ``\textsl{collegamento diretto}'' (o \textit{hard link}), si
 deve usare la funzione di sistema \funcd{link}, il cui prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{unistd.h}
 \fdecl{int link(const char *oldpath, const char *newpath)}
 \fdesc{Crea un nuovo collegamento diretto (\textit{hard link}).} 
@@ -1468,7 +1468,7 @@ automaticamente ad operare sul file da esso specificato. La funzione di
 sistema che permette di creare un nuovo collegamento simbolico è
 \funcd{symlink}, ed il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{unistd.h}
 \fdecl{int symlink(const char *oldpath, const char *newpath)}
 \fdesc{Crea un nuovo collegamento simbolico (\textit{symbolic link}).} 
@@ -1554,7 +1554,7 @@ accedere alle informazioni del collegamento invece che a quelle del file a cui
 esso fa riferimento. Quando si vuole leggere il contenuto di un collegamento
 simbolico si usa la funzione di sistema \funcd{readlink}, il cui prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{unistd.h}
 \fdecl{int readlink(const char *path, char *buff, size\_t size)}
 \fdesc{Legge il contenuto di un collegamento simbolico.} 
@@ -1663,7 +1663,7 @@ La funzione di sistema che consente di effettuare questa operazione, il cui
 nome come si può notare ha poco a che fare con il concetto di rimozione, è
 \funcd{unlink}, ed il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{unistd.h}
 \fdecl{int unlink(const char *pathname)}
 \fdesc{Cancella un file.} 
@@ -1748,7 +1748,7 @@ sistemi operativo che non supportano gli \textit{hard link}. Nei sistemi
 unix-like \funcd{remove} è equivalente ad usare in maniera trasparente
 \func{unlink} per i file ed \func{rmdir} per le directory; il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{stdio.h}
 \fdecl{int remove(const char *pathname)}
 \fdesc{Cancella un file o una directory.} 
@@ -1772,7 +1772,7 @@ sistema \funcd{rename},\footnote{la funzione è definita dallo standard ANSI C,
   ma si applica solo per i file, lo standard POSIX estende la funzione anche
   alle directory.} il cui prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{stdio.h}
 \fdecl{int rename(const char *oldpath, const char *newpath)}
 \fdesc{Rinomina un file o una directory.} 
@@ -1886,7 +1886,7 @@ direttamente dal kernel attraverso una opportuna \textit{system
   numero di file è molto grande.}  La funzione di sistema usata per creare una
 directory è \funcd{mkdir}, ed il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/stat.h}
 \fhead{sys/types.h}
 \fdecl{int mkdir(const char *dirname, mode\_t mode)}
@@ -1930,7 +1930,7 @@ Come accennato in precedenza per eseguire la cancellazione di una directory è
 necessaria una specifica funzione di sistema, \funcd{rmdir}, il suo prototipo
 è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/stat.h}
 \fdecl{int rmdir(const char *dirname)}
 \fdesc{Cancella una directory.} 
@@ -2003,7 +2003,7 @@ con i \textit{file stream} dell'interfaccia standard ANSI C che vedremo in
 cap.~\ref{cha:files_std_interface}. La prima funzione di questa interfaccia è
 \funcd{opendir}, il cui prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/types.h}
 \fhead{dirent.h}
 \fdecl{DIR *opendir(const char *dirname)}
@@ -2041,7 +2041,7 @@ ad un \textit{directory stream} si può usare la funzione
   \texttt{\macro{\_POSIX\_C\_SOURCE} >= 200809L} o
   \texttt{\macro{\_XOPEN\_SOURCE} >= 700}.}  il cui prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/types.h}
 \fhead{dirent.h}
 \fdecl{int dirfd(DIR *dir)}
@@ -2076,7 +2076,7 @@ possibile associarvi un \textit{directory stream} con la funzione
   \texttt{\macro{\_POSIX\_C\_SOURCE} >= 200809L} o \texttt{\_XOPEN\_SOURCE >=
     700} .}  il cui prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/types.h}
 \fhead{dirent.h}
 \fdecl{DIR *fdopendir(int fd)}
@@ -2107,7 +2107,7 @@ Una volta che si sia aperto un \textit{directory stream} la lettura del
 contenuto della directory viene effettuata attraverso la funzione
 \funcd{readdir}, il cui prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/types.h}
 \fhead{dirent.h}
 \fdecl{struct dirent *readdir(DIR *dir)}
@@ -2145,7 +2145,7 @@ rientrante, \funcd{readdir\_r},\footnote{per usarla è necessario definire una
 può essere utilizzata anche con i \itindex{thread} \textit{thread}, il suo
 prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/types.h}
 \fhead{dirent.h}
 \fdecl{int readdir\_r(DIR *dir, struct dirent *entry, struct dirent **result)}
@@ -2289,7 +2289,7 @@ varie voci, spostarsi all'interno dello \textit{stream} usando la funzione
   una delle macro \macro{\_XOPEN\_SOURCE}, \macro{\_BSD\_SOURCE} o
   \macro{\_SVID\_SOURCE}.} il cui prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{dirent.h}
 \fdecl{void seekdir(DIR *dir, off\_t offset)}
 \fdesc{Cambia la posizione all'interno di un \textit{directory stream}.} 
@@ -2306,7 +2306,7 @@ funzione \funcd{telldir}, che legge la posizione corrente; il cui prototipo
   tipo \type{off\_t}, sostituito a partire dalla versione 2.1.2 da \ctyp{long}
   per conformità a POSIX.1-2001.}
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{dirent.h}
 \fdecl{long telldir(DIR *dir)}
 \fdesc{Ritorna la posizione corrente in un \textit{directory stream}.} 
@@ -2334,7 +2334,7 @@ Una volta completate le operazioni si può chiudere il \textit{directory
   stream}, ed il file descriptor ad esso associato, con la funzione
 \funcd{closedir}, il cui prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/types.h}
 \fhead{dirent.h}
 \fdecl{int closedir(DIR *dir)}
@@ -2351,7 +2351,7 @@ ordinamento, del contenuto di una directory; la funzione è
   \acr{libc4} e richiede siano definite le macro \macro{\_BSD\_SOURCE} o
   \macro{\_SVID\_SOURCE}.} ed il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{dirent.h}
 \fdecl{int scandir(const char *dir, struct dirent ***namelist, \\
 \phantom{int scandir(}int(*filter)(const struct dirent *), \\
@@ -2396,7 +2396,7 @@ Per l'ordinamento, vale a dire come valori possibili per l'argomento
 \param{compar}, sono disponibili due funzioni predefinite, \funcd{alphasort} e
 \funcd{versionsort}, i cui prototipi sono:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{dirent.h}
 \fdecl{int alphasort(const void *a, const void *b)}
 \fdecl{int versionsort(const void *a, const void *b)}
@@ -2539,7 +2539,7 @@ dell'\textit{inode} della directory di lavoro, per ottenerne il
   il filesystem \texttt{/proc} da \procfile{/proc/self/cwd}.} il cui prototipo
 è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{unistd.h}
 \fdecl{char *getcwd(char *buffer, size\_t size)}
 \fdesc{Legge il \textit{pathname} della directory di lavoro corrente.} 
@@ -2606,7 +2606,7 @@ Per cambiare la directory di lavoro si può usare la funzione di sistema
 \funcd{chdir}, equivalente del comando di shell \cmd{cd}, il cui nome sta
 appunto per \textit{change directory}, il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{unistd.h}
 \fdecl{int chdir(const char *pathname)}
 \fdesc{Cambia la directory di lavoro per \textit{pathname}.} 
@@ -2669,7 +2669,7 @@ che operano sugli altri file, ma quando li si devono creare sono necessarie,
 come per le directory, delle funzioni apposite. La prima di queste è la
 funzione di sistema \funcd{mknod}, il cui prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/types.h}
 \fhead{sys/stat.h}
 \fhead{fcntl.h}
@@ -2863,7 +2863,7 @@ la prima di queste funzioni create a questo scopo era
 \funcd{tmpnam},\footnote{la funzione è stata deprecata nella revisione
   POSIX.1-2008 dello standard POSIX.} il cui prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{stdio.h}
 \fdecl{char *tmpnam(char *string)}
 \fdesc{Genera un nome univoco per un file temporaneo.} 
@@ -2890,7 +2890,7 @@ Di questa funzione esiste una versione \index{funzioni!rientranti} rientrante,
 Una funzione simile, \funcd{tempnam}, permette di specificare un prefisso per
 il file esplicitamente, il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{stdio.h}
 \fdecl{char *tempnam(const char *dir, const char *pfx)}
 \fdesc{Genera un nome univoco per un file temporaneo.} 
@@ -2930,7 +2930,7 @@ Per evitare di dovere effettuare a mano tutti questi controlli, lo standard
 POSIX definisce la funzione \funcd{tmpfile}, che permette di ottenere in
 maniera sicura l'accesso ad un file temporaneo, il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{stdio.h}
 \fdecl{FILE *tmpfile(void)}
 \fdesc{Apre un file temporaneo in lettura/scrittura.} 
@@ -2963,7 +2963,7 @@ conclusa da 6 caratteri ``\texttt{X}'' che verranno sostituiti da un codice
 unico. La prima delle due è analoga a \func{tmpnam} e genera un nome casuale,
 il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{stlib.h}
 \fdecl{char *mktemp(char *template)}
 \fdesc{Genera un nome univoco per un file temporaneo.} 
@@ -2990,7 +2990,7 @@ La seconda funzione, \funcd{mkstemp} è sostanzialmente equivalente a
 \func{tmpfile}, ma restituisce un file descriptor invece di un nome; il suo
 prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{stlib.h}
 \fdecl{int mkstemp(char *template)}
 \fdesc{Apre un file temporaneo.} 
@@ -3022,7 +3022,7 @@ specificamente dalla \acr{glibc},\footnote{la funzione è stata introdotta
   nella versione 2.7 delle librerie e richiede che sia definita la macro
   \macro{\_GNU\_SOURCE}.} il cui prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{stlib.h}
 \fdecl{int mkostemp(char *template, int flags)}
 \fdesc{Apre un file temporaneo.} 
@@ -3041,7 +3041,7 @@ In OpenBSD è stata introdotta un'altra funzione simile alle precedenti,
   funzione è stata introdotta nella \acr{glibc} a partire dalla versione
   2.1.91 ed inserita nello standard POSIX.1-2008.}  il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{stlib.h}
 \fdecl{char *mkdtemp(char *template)}
 \fdesc{Crea una directory temporanea.} 
@@ -3344,7 +3344,7 @@ Un file può sempre essere troncato a zero aprendolo con il flag
 dimensione si possono usare le due funzioni di sistema \funcd{truncate} e
 \funcd{ftruncate}, i cui prototipi sono:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{unistd.h}
 \fdecl{int ftruncate(int fd, off\_t length))}
 \fdecl{int truncate(const char *file\_name, off\_t length)}
@@ -3598,7 +3598,7 @@ I tempi di ultimo accesso ed ultima modifica possono essere modificati
 esplicitamente usando la funzione di sistema \funcd{utime}, il cui prototipo
 è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{utime.h}
 \fdecl{int utime(const char *filename, struct utimbuf *times)}
 \fdesc{Modifica i tempi di ultimo accesso ed ultima modifica di un file.} 
@@ -3673,7 +3673,7 @@ Per la gestione di questi nuovi valori è stata definita una seconda funzione
 di sistema, \funcd{utimes}, che consente di specificare tempi con maggior
 precisione; il suo prototipo è:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/time.h}
 \fdecl{int utimes(const char *filename, struct timeval times[2])}
 \fdesc{Modifica i tempi di ultimo accesso e ultima modifica di un file.} 
@@ -3708,7 +3708,7 @@ consentono rispettivamente di effettuare la modifica utilizzando un file già
 aperto o di eseguirla direttamente su un collegamento simbolico. I relativi
 prototipi sono:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/time.h}
 \fdecl{int futimes(int fd, const struct timeval tv[2])}
 \fdesc{Cambia i tempi di un file già aperto.} 
@@ -3738,7 +3738,7 @@ valori con questa precisione. Per questo sono state introdotte due nuove
 funzioni, \funcd{futimens} e \func{utimensat}, in grado di eseguire questo
 compito; i rispettivi prototipi sono:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sys/time.h}
 \fdecl{futimens(int fd, const struct timespec times[2])}
 \fdesc{Cambia i tempi di un file già aperto.} 
@@ -3829,13 +3829,14 @@ mantenuti nei campi \var{st\_uid} e \var{st\_gid} della struttura
 
 Il controllo di accesso ai file segue un modello abbastanza semplice che
 prevede tre permessi fondamentali strutturati su tre livelli di accesso.
-Esistono varie estensioni a questo modello,\footnote{come le \textit{Access
-    Control List} che sono state aggiunte ai filesystem standard con opportune
-  estensioni (vedi sez.~\ref{sec:file_ACL}) per arrivare a meccanismi di
-  controllo ancora più sofisticati come il \textit{mandatory access control}
-  di SE-Linux.} ma nella maggior parte dei casi il meccanismo standard è più
-che sufficiente a soddisfare tutte le necessità più comuni.  I tre permessi di
-base associati ad ogni file sono:
+Esistono varie estensioni a questo modello,\footnote{come le
+  \itindex{Access~Control~List~(ACL)} \textit{Access Control List} che sono
+  state aggiunte ai filesystem standard con opportune estensioni (vedi
+  sez.~\ref{sec:file_ACL}) per arrivare a meccanismi di controllo ancora più
+  sofisticati come il \textit{mandatory access control} di SE-Linux.} ma nella
+maggior parte dei casi il meccanismo standard è più che sufficiente a
+soddisfare tutte le necessità più comuni.  I tre permessi di base associati ad
+ogni file sono:
 \begin{itemize*}
 \item il permesso di lettura (indicato con la lettera \texttt{r}, dall'inglese
   \textit{read}).
@@ -3878,14 +3879,15 @@ contenuti in alcuni bit del campo \var{st\_mode} della struttura \struct{stat}
 (si veda di nuovo fig.~\ref{fig:file_stat_struct}).
 
 In genere ci si riferisce ai tre livelli dei privilegi usando le lettere
-\cmd{u} (per \textit{user}), \cmd{g} (per \textit{group}) e \cmd{o} (per
-\textit{other}), inoltre se si vuole indicare tutti i raggruppamenti insieme
-si usa la lettera \cmd{a} (per \textit{all}). Si tenga ben presente questa
-distinzione dato che in certi casi, mutuando la terminologia in uso nel VMS,
-si parla dei permessi base come di permessi per \textit{owner}, \textit{group}
-ed \textit{all}, le cui iniziali possono dar luogo a confusione.  Le costanti
-che permettono di accedere al valore numerico di questi bit nel campo
-\var{st\_mode} sono riportate in tab.~\ref{tab:file_bit_perm}.
+\texttt{u} (per \textit{user}), \texttt{g} (per \textit{group}) e \texttt{o}
+(per \textit{other}), inoltre se si vuole indicare tutti i raggruppamenti
+insieme si usa la lettera \texttt{a} (per \textit{all}). Si tenga ben presente
+questa distinzione dato che in certi casi, mutuando la terminologia in uso nel
+VMS, si parla dei permessi base come di permessi per \textit{owner},
+\textit{group} ed \textit{all}, le cui iniziali possono dar luogo a
+confusione.  Le costanti che permettono di accedere al valore numerico di
+questi bit nel campo \var{st\_mode} sono riportate in
+tab.~\ref{tab:file_bit_perm}.
 
 \begin{table}[htb]
   \centering
@@ -3982,7 +3984,7 @@ cui l'utente appartiene.
 
 I passi attraverso i quali viene stabilito se il processo possiede il diritto
 di accesso sono i seguenti:
-\begin{enumerate}
+\begin{enumerate*}
 \item Se l'\ids{UID} effettivo del processo è zero (corrispondente
   all'amministratore) l'accesso è sempre garantito senza nessun ulteriore
   controllo. Per questo motivo \textsl{root} ha piena libertà di accesso a
@@ -4006,7 +4008,7 @@ di accesso sono i seguenti:
   \end{itemize*}
 \item Se il bit dei permessi d'accesso per tutti gli altri è impostato,
   l'accesso è consentito, altrimenti l'accesso è negato.
-\end{enumerate}
+\end{enumerate*}
 
 Si tenga presente che questi passi vengono eseguiti esattamente in
 quest'ordine. Questo vuol dire che se un processo è il proprietario di un file,
@@ -4146,14 +4148,15 @@ accennato in sez.~\ref{sec:file_special_perm} e spiegato in dettaglio in
 sez.~\ref{sec:proc_perms}, non è detto siano uguali a quelli effettivi.
 
 Per far questo si può usare la funzione \funcd{access}, il cui prototipo è:
-\begin{prototype}{unistd.h}
-{int access(const char *pathname, int mode)}
 
-Verifica i permessi di accesso.
-  
-\bodydesc{La funzione ritorna 0 se l'accesso è consentito, -1 se l'accesso non
-  è consentito ed in caso di errore; nel qual caso la variabile \var{errno}
-  assumerà i valori:
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{int access(const char *pathname, int mode)}
+\fdesc{Verifica i permessi di accesso.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
   \item[\errcode{EINVAL}] il valore di \param{mode} non è valido.
   \item[\errcode{EACCES}] l'accesso al file non è consentito, o non si ha il
@@ -4162,8 +4165,9 @@ Verifica i permessi di accesso.
     un filesystem montato in sola lettura.
   \end{errlist}
   ed inoltre \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT},
-  \errval{ENOTDIR}, \errval{ELOOP}, \errval{EIO}.}
-\end{prototype}
+  \errval{ENOTDIR}, \errval{ELOOP}, \errval{EIO}
+ nel loro significato generico.}
+\end{funcproto}
 
 La funzione verifica i permessi di accesso, indicati da \param{mode}, per il
 file indicato da \param{pathname}. I valori possibili per l'argomento
@@ -4218,27 +4222,32 @@ codici di errore.
 Per cambiare i permessi di un file il sistema mette ad disposizione due
 funzioni \funcd{chmod} e \funcd{fchmod}, che operano rispettivamente su un
 filename e su un file descriptor, i loro prototipi sono:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/stat.h} 
-  
-  \funcdecl{int chmod(const char *path, mode\_t mode)} Cambia i permessi del
-  file indicato da \param{path} al valore indicato da \param{mode}.
-  
-  \funcdecl{int fchmod(int fd, mode\_t mode)} Analoga alla precedente, ma usa
-  il file descriptor \param{fd} per indicare il file.
-  
-  \bodydesc{Le funzioni restituiscono zero in caso di successo e -1 per
-    un errore, in caso di errore \var{errno} può assumere i valori:
+
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/stat.h}
+\fdecl{int chmod(const char *path, mode\_t mode)}
+\fdesc{Cambia i permessi del file indicato da \param{path} al valore indicato
+  da \param{mode}.} 
+\fdecl{int fchmod(int fd, mode\_t mode)}
+\fdesc{Analoga alla precedente, ma usa il file descriptor \param{fd} per
+  indicare il file.}  
+
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
   \item[\errcode{EPERM}] l'\ids{UID} effettivo non corrisponde a quello del
     proprietario del file o non è zero.
-    \item[\errcode{EROFS}] il file è su un filesystem in sola lettura.
+  \item[\errcode{EROFS}] il file è su un filesystem in sola lettura.
   \end{errlist}
-  ed inoltre \errval{EIO}; \func{chmod} restituisce anche \errval{EFAULT},
+  ed inoltre per entrambe \errval{EIO}, per  \func{chmod} \errval{EFAULT},
   \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR},
-  \errval{EACCES}, \errval{ELOOP}; \func{fchmod} anche \errval{EBADF}.}
-\end{functions}
+  \errval{EACCES}, \errval{ELOOP}, per \func{fchmod} \errval{EBADF}
+ nel loro significato generico.}
+\end{funcproto}
+
 
 Entrambe le funzioni utilizzano come secondo argomento \param{mode}, una
 variabile dell'apposito tipo primitivo \type{mode\_t} (vedi
@@ -4358,22 +4367,25 @@ nuovo file viene creato.\footnote{l'operazione viene fatta sempre: anche
 
 La funzione che permette di impostare il valore di questa maschera di
 controllo è \funcd{umask}, ed il suo prototipo è:
-\begin{prototype}{stat.h}
-{mode\_t umask(mode\_t mask)}
 
-Imposta la maschera dei permessi dei bit al valore specificato da \param{mask}
-(di cui vengono presi solo i 9 bit meno significativi).
-  
-  \bodydesc{La funzione ritorna il precedente valore della maschera. È una
-    delle poche funzioni che non restituisce codici di errore.}
-\end{prototype}
+\begin{funcproto}{
+\fhead{stat.h}
+\fdecl{mode\_t umask(mode\_t mask)}
+\fdesc{Imposta la maschera dei permessi.} 
+}
 
-In genere si usa questa maschera per impostare un valore predefinito che
-escluda preventivamente alcuni permessi (usualmente quello di scrittura per il
-gruppo e gli altri, corrispondente ad un valore per \param{mask} pari a
-$022$).  In questo modo è possibile cancellare automaticamente i permessi non
-voluti.  Di norma questo valore viene impostato una volta per tutte al login a
-$022$, e gli utenti non hanno motivi per modificarlo.
+{La funzione ritorna ritorna il precedente valore della maschera, non sono
+  previste condizioni di errore.}
+\end{funcproto}
+
+La funzione imposta maschera dei permessi dei bit al valore specificato
+da \param{mask} (di cui vengono presi solo i 9 bit meno significativi).  In
+genere si usa questa maschera per impostare un valore predefinito che escluda
+preventivamente alcuni permessi (usualmente quello di scrittura per il gruppo
+e gli altri, corrispondente ad un valore per \param{mask} pari a $022$).  In
+questo modo è possibile cancellare automaticamente i permessi non voluti.  Di
+norma questo valore viene impostato una volta per tutte al login a $022$, e
+gli utenti non hanno motivi per modificarlo.
 
 \itindend{umask} 
 
@@ -4429,30 +4441,31 @@ sufficienti; in tal caso si deve aver cura di usare un valore di
 Come avviene nel caso dei permessi il sistema fornisce anche delle funzioni,
 \funcd{chown}, \funcd{fchown} e \funcd{lchown}, che permettono di cambiare sia
 l'utente che il gruppo a cui un file appartiene; i rispettivi prototipi sono:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{sys/stat.h} 
-  
-  \funcdecl{int chown(const char *path, uid\_t owner, gid\_t group)}
-  \funcdecl{int fchown(int fd, uid\_t owner, gid\_t group)}
-  \funcdecl{int lchown(const char *path, uid\_t owner, gid\_t group)}
 
-  Le funzioni cambiano utente e gruppo di appartenenza di un file ai valori
-  specificati dalle variabili \param{owner} e \param{group}. 
-  
-  \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 per un
-    errore, nel qual caso caso \var{errno} assumerà i valori:
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{sys/stat.h}
+\fdecl{int chown(const char *path, uid\_t owner, gid\_t group)}
+\fdecl{int fchown(int fd, uid\_t owner, gid\_t group)}
+\fdecl{int lchown(const char *path, uid\_t owner, gid\_t group)}
+\fdesc{Cambiano proprietario e gruppo proprietario di un file.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
   \item[\errcode{EPERM}] l'\ids{UID} effettivo non corrisponde a quello del
     proprietario del file o non è zero, o utente e gruppo non sono validi
   \end{errlist}
-  Oltre a questi entrambe restituiscono gli errori \errval{EROFS} e
-  \errval{EIO}; \func{chown} restituisce anche \errval{EFAULT},
-  \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR},
-  \errval{EACCES}, \errval{ELOOP}; \func{fchown} anche \errval{EBADF}.}
-\end{functions}
+  ed inoltre per tutte \errval{EROFS} e \errval{EIO}, per \func{chown}
+  \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM},
+  \errval{ENOTDIR}, \errval{EACCES}, \errval{ELOOP}, per \func{fchown}
+  \errval{EBADF} nel loro significato generico.}
+\end{funcproto}
 
-Con Linux solo l'amministratore\footnote{o in generale un processo con la
+Le funzioni cambiano utente e gruppo di appartenenza di un file ai valori
+specificati dalle variabili \param{owner} e \param{group}. Con Linux solo
+l'amministratore\footnote{o in generale un processo con la
   \itindex{capabilities} capacità \const{CAP\_CHOWN}, vedi
   sez.~\ref{sec:proc_capabilities}.} può cambiare il proprietario di un file;
 in questo viene seguita la semantica usata da BSD che non consente agli utenti
@@ -4790,24 +4803,22 @@ Per poter leggere gli attributi estesi sono disponibili tre diverse funzioni,
 \funcd{getxattr}, \funcd{lgetxattr} e \funcd{fgetxattr}, che consentono
 rispettivamente di richiedere gli attributi relativi a un file, a un
 collegamento simbolico e ad un file descriptor; i rispettivi prototipi sono:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{attr/xattr.h} 
-  
-  \funcdecl{ssize\_t getxattr(const char *path, const char *name, void
-    *value, size\_t size)} 
 
-  \funcdecl{ssize\_t lgetxattr(const char *path, const char *name, void
-    *value, size\_t size)} 
-
-  \funcdecl{ssize\_t fgetxattr(int filedes, const char *name, void *value,
-    size\_t size)}
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{attr/xattr.h}
+\fdecl{ssize\_t getxattr(const char *path, const char *name, void *value,
+  size\_t size)}
+\fdecl{ssize\_t lgetxattr(const char *path, const char *name, void *value,
+  size\_t size)}
+\fdecl{ssize\_t fgetxattr(int filedes, const char *name, void *value,
+  size\_t size)}
+\fdesc{Leggono il valore di un attributo esteso.} 
+}
 
-  Le funzioni leggono il valore di un attributo esteso.
-  
-  \bodydesc{Le funzioni restituiscono un intero positivo che indica la
-    dimensione dell'attributo richiesto in caso di successo, e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà i valori:
+{Le funzioni ritornano un intero positivo che indica la dimensione
+  dell'attributo richiesto in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{ENOATTR}] l'attributo richiesto non esiste.
   \item[\errcode{ERANGE}] la dimensione \param{size} del buffer \param{value}
@@ -4815,9 +4826,10 @@ collegamento simbolico e ad un file descriptor; i rispettivi prototipi sono:
   \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal
     filesystem o sono disabilitati.
   \end{errlist}
-  e tutti gli errori di \func{stat}, come \errcode{EPERM} se non si hanno i
-  permessi di accesso all'attributo. }
-\end{functions}
+  ed inoltre tutti gli errori delle analoghe della famiglia \func{stat} con lo
+  stesso significato ed in particolare \errcode{EPERM} se non si hanno i
+  permessi di accesso all'attributo.}
+\end{funcproto}
 
 Le funzioni \func{getxattr} e \func{lgetxattr} prendono come primo argomento
 un \textit{pathname} che indica il file di cui si vuole richiedere un
@@ -4851,23 +4863,21 @@ Un secondo gruppo di funzioni è quello che consente di impostare il valore di
 un attributo esteso, queste sono \funcd{setxattr}, \funcd{lsetxattr} e
 \funcd{fsetxattr}, e consentono di operare rispettivamente su un file, su un
 collegamento simbolico o specificando un file descriptor; i loro prototipi sono:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{attr/xattr.h} 
-  
-  \funcdecl{int setxattr(const char *path, const char *name, const void
-    *value, size\_t size, int flags)}
-
-  \funcdecl{int lsetxattr(const char *path, const char *name, const void
-    *value, size\_t size, int flags)}
 
-  \funcdecl{int fsetxattr(int filedes, const char *name, const void *value,
-    size\_t size, int flags)}
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{attr/xattr.h}
+\fdecl{int setxattr(const char *path, const char *name, const void *value,
+  size\_t size, int flags)} 
+\fdecl{int lsetxattr(const char *path, const char *name, const void *value,
+  size\_t size, int flags)} 
+\fdecl{int fsetxattr(int filedes, const char *name, const void *value, size\_t
+  size, int flags)} 
+\fdesc{Impostano il valore di un attributo esteso.} 
+}
 
-  Impostano il valore di un attributo esteso.
-  
-  \bodydesc{Le funzioni restituiscono 0 in caso di successo, e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà i valori:
+{Le funzioni ritornano un $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{ENOATTR}] si è usato il flag \const{XATTR\_REPLACE} e
     l'attributo richiesto non esiste.
@@ -4876,11 +4886,10 @@ collegamento simbolico o specificando un file descriptor; i loro prototipi sono:
   \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal
     filesystem o sono disabilitati.
   \end{errlist}
-  Oltre a questi potranno essere restituiti tutti gli errori di \func{stat},
-  ed in particolare \errcode{EPERM} se non si hanno i permessi di accesso
-  all'attributo.  
-}
-\end{functions}
+  ed inoltre tutti gli errori delle analoghe della famiglia \func{stat} con lo
+  stesso significato ed in particolare \errcode{EPERM} se non si hanno i
+  permessi di accesso all'attributo.}
+\end{funcproto}
 
 Le tre funzioni prendono come primo argomento un valore adeguato al loro
 scopo, usato in maniera del tutto identica a quanto visto in precedenza per le
@@ -4904,32 +4913,29 @@ Le funzioni finora illustrate permettono di leggere o scrivere gli attributi
 estesi, ma sarebbe altrettanto utile poter vedere quali sono gli attributi
 presenti; a questo provvedono le funzioni \funcd{listxattr},
 \funcd{llistxattr} e \funcd{flistxattr} i cui prototipi sono:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{attr/xattr.h} 
-  
-  \funcdecl{ssize\_t listxattr(const char *path, char *list, size\_t size)}
 
-  \funcdecl{ssize\_t llistxattr(const char *path, char *list, size\_t size)}
-
-  \funcdecl{ssize\_t flistxattr(int filedes, char *list, size\_t size)}
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{attr/xattr.h}
+\fdecl{ssize\_t listxattr(const char *path, char *list, size\_t size)} 
+\fdecl{ssize\_t llistxattr(const char *path, char *list, size\_t size)} 
+\fdecl{ssize\_t flistxattr(int filedes, char *list, size\_t size)} 
+\fdesc{Leggono la lista degli attributi estesi di un file.} 
+}
 
-  Leggono la lista degli attributi estesi di un file.
-  
-  \bodydesc{Le funzioni restituiscono un intero positivo che indica la
-    dimensione della lista in caso di successo, e $-1$ in caso di errore, nel
-    qual caso \var{errno} assumerà i valori:
+{Le funzioni ritornano un intero positivo che indica la dimensione della lista
+  in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà
+  uno dei valori:
   \begin{errlist}
   \item[\errcode{ERANGE}] la dimensione \param{size} del buffer \param{value}
     non è sufficiente per contenere il risultato.
   \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal
     filesystem o sono disabilitati.
   \end{errlist}
-  Oltre a questi potranno essere restituiti tutti gli errori di \func{stat},
-  ed in particolare \errcode{EPERM} se non si hanno i permessi di accesso
-  all'attributo.  
-}
-\end{functions}
+  ed inoltre tutti gli errori delle analoghe della famiglia \func{stat} con lo
+  stesso significato ed in particolare \errcode{EPERM} se non si hanno i
+  permessi di accesso all'attributo.}
+\end{funcproto}
 
 Come per le precedenti le tre funzioni leggono gli attributi rispettivamente
 di un file, un collegamento simbolico o specificando un file descriptor, da
@@ -4951,29 +4957,27 @@ usando per \param{size} un valore nullo.
 Infine per rimuovere semplicemente un attributo esteso, si ha a disposizione
 un ultimo gruppo di funzioni: \funcd{removexattr}, \funcd{lremovexattr} e
 \funcd{fremovexattr}; i rispettivi prototipi sono:
-\begin{functions}
-  \headdecl{sys/types.h} 
-  \headdecl{attr/xattr.h} 
-  
-  \funcdecl{int removexattr(const char *path, const char *name)}
-
-  \funcdecl{int lremovexattr(const char *path, const char *name)}
-
-  \funcdecl{int fremovexattr(int filedes, const char *name)}
 
+\begin{funcproto}{
+\fhead{sys/types.h}
+\fhead{attr/xattr.h}
+\fdecl{int removexattr(const char *path, const char *name)} 
+\fdecl{int lremovexattr(const char *path, const char *name)} 
+\fdecl{int fremovexattr(int filedes, const char *name)} 
+\fdesc{Rimuovono un attributo esteso di un file.} 
+}
 
-  Rimuovono un attributo esteso di un file.
-  
-  \bodydesc{Le funzioni restituiscono 0 in caso di successo, e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà i valori:
+{Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{ENOATTR}] l'attributo richiesto non esiste.
   \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal
     filesystem o sono disabilitati.
   \end{errlist}
-  ed inoltre tutti gli errori di \func{stat}.  
-}
-\end{functions}
+  ed inoltre tutti gli errori delle analoghe della famiglia \func{stat} con lo
+  stesso significato ed in particolare \errcode{EPERM} se non si hanno i
+  permessi di accesso all'attributo.}
+\end{funcproto}
 
 Le tre funzioni rimuovono l'attributo esteso indicato dall'argomento
 \param{name} rispettivamente di un file, un collegamento simbolico o
@@ -7505,7 +7509,6 @@ programmi e librerie) di cui il server potrebbe avere bisogno.
 
 
 
-
 % TODO: trattare la funzione setns e i namespace file descriptors (vedi
 % http://lwn.net/Articles/407495/) introdotti con il kernel 3.0
 
@@ -7583,9 +7586,9 @@ programmi e librerie) di cui il server potrebbe avere bisogno.
 % LocalWords:  subtree SILENT log unbindable BUSY EAGAIN EXPIRE DETACH NOFOLLOW
 % LocalWords:  lazy encfs sshfs setfsent getfsent getfsfile getfsspec endfsent
 % LocalWords:  setmntent getmntent addmntent endmntent hasmntopt such offsetof
+% LocalWords:  member scan attack EOVERFLOW BITS blkcnt rdev
 
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
-% LocalWords:  member scan attack EOVERFLOW BITS blkcnt rdev
diff --git a/ipc.tex b/ipc.tex
index be507a5b1c3b9fe4828e1f95977b76eeffed730e..49f342f4f42264c5cb266203acbe2c4d91be28f2 100644 (file)
--- a/ipc.tex
+++ b/ipc.tex
@@ -3255,7 +3255,12 @@ più avanti, quando realizzeremo una nuova versione del monitor visto in
 sez.~\ref{sec:ipc_sysv_shm} che possa restituisca i risultati via rete.
 \itindend{memory~mapping}
 
-% TODO fare esempio di mmap anonima
+% TODO: fare esempio di mmap anonima
+
+% TODO: con il kernel 3.2 è stata introdotta un nuovo meccanismo di
+% intercomunicazione veloce chiamato Cross Memory Attach, da capire se e come
+% trattarlo qui, vedi http://lwn.net/Articles/405346/
+% https://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=fcf634098c00dd9cd247447368495f0b79be12d1
 
 \section{L'intercomunicazione fra processi di POSIX}
 \label{sec:ipc_posix}