From 46a0b60524792834439820af5e8267ce8ff9dc39 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 23 Jan 2012 18:16:00 +0000 Subject: [PATCH] Note kernel 3.2 + prototipi delle funzioni --- filedir.tex | 375 ++++++++++++++++++++++++++-------------------------- ipc.tex | 7 +- 2 files changed, 195 insertions(+), 187 deletions(-) diff --git a/filedir.tex b/filedir.tex index d2cd284..9eff764 100644 --- a/filedir.tex +++ b/filedir.tex @@ -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 be507a5..49f342f 100644 --- 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} -- 2.30.2