From: Simone Piccardi Date: Wed, 18 Jan 2012 00:04:51 +0000 (+0000) Subject: Trattazione unont 2 e correzione varie indicizzazioni e X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=b3593007c4edd76ecbf7386967c1b25d27eed828 Trattazione unont 2 e correzione varie indicizzazioni e uniformizzazione della scrittura di pathname --- diff --git a/errors.tex b/errors.tex index 7cf46fc..60b4bde 100644 --- a/errors.tex +++ b/errors.tex @@ -41,10 +41,9 @@ gestione dei file. permessa: solo il proprietario del file o un processo con sufficienti privilegi può eseguire l'operazione. \item[\errcode{ENOENT} \textit{No such file or directory}.] Il file indicato - dal \itindex{pathname} \textit{pathname} non esiste: o una delle componenti - non esiste o il \textit{pathname} contiene un link simbolico spezzato. - Errore tipico di un riferimento ad un file che si suppone erroneamente - essere esistente. + dal \textit{pathname} non esiste: o una delle componenti non esiste o il + \textit{pathname} contiene un link simbolico spezzato. Errore tipico di un + riferimento ad un file che si suppone erroneamente essere esistente. \item[\errcode{EIO} \textit{Input/output error}.] Errore di input/output: usato per riportare errori hardware in lettura/scrittura su un dispositivo. \item[\errcode{ENXIO} \textit{No such device or address}.] Dispositivo @@ -63,11 +62,9 @@ gestione dei file. al file o alla directory non è consentito: i permessi del file o della directory non consentono l'operazione richiesta. \item[\errcode{ELOOP} \textit{Too many symbolic links encountered}.] Ci sono - troppi link simbolici nella risoluzione di un - \itindex{pathname} \textit{pathname}. + troppi link simbolici nella risoluzione di un \textit{pathname}. \item[\errcode{ENAMETOOLONG} \textit{File name too long}.] Si è indicato un - \itindex{pathname} \textit{pathname} troppo lungo per un file o una - directory. + \textit{pathname} troppo lungo per un file o una directory. \item[\errcode{ENOTBLK} \textit{Block device required}.] Si è specificato un file che non è un \textit{block device} in un contesto in cui era necessario specificare un \textit{block device} (ad esempio si è tentato di montare un @@ -106,15 +103,15 @@ gestione dei file. \item[\errcode{ENOSPC} \textit{No space left on device}.] La directory in cui si vuole creare il link non ha spazio per ulteriori voci, o si è cercato di scrivere o di creare un nuovo file su un dispositivo che è già pieno. -\item[\errcode{ESPIPE} \textit{Invalid seek operation}.] Si cercato di eseguire - una \func{seek} su un file che non supporta questa operazione (ad esempio su - una pipe). +\item[\errcode{ESPIPE} \textit{Invalid seek operation}.] Si cercato di + eseguire una \func{lseek} su un file che non supporta questa operazione (ad + esempio su una \textit{pipe}, da cui il nome). \item[\errcode{EROFS} \textit{Read-only file system}.] Si è cercato di eseguire una operazione di scrittura su un file o una directory che risiede su un filesystem montato un sola lettura. -\item[\errcode{EMLINK} \textit{Too many links}]. Ci sono già troppi link al - file (il numero massimo è specificato dalla variabile \const{LINK\_MAX}, - vedi sez.~\ref{sec:sys_limits}). +\item[\errcode{EMLINK} \textit{Too many links}.] Ci sono già troppi link al + file, il numero massimo è specificato dalla variabile \const{LINK\_MAX}, + vedi sez.~\ref{sec:sys_limits}. \item[\errcode{EPIPE} \textit{Broken pipe}.] Non c'è un processo che stia leggendo l'altro capo della pipe. Ogni funzione che restituisce questo errore genera anche un segnale \signal{SIGPIPE}, la cui azione predefinita è diff --git a/fileadv.tex b/fileadv.tex index b35d14c..8d62772 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1714,12 +1714,14 @@ l'insieme dei file descriptor da tenere sotto controllo tramite un certo chiamate devono essere ripetute per ciascun file descriptor, incorrendo in una perdita di prestazioni qualora il numero di file descriptor sia molto grande; per questo è stato proposto di introdurre come estensione una - funzione \func{epoll\_ctlv} che consenta di effettuare con una sola chiamata + funzione \code{epoll\_ctlv} che consenta di effettuare con una sola chiamata le impostazioni per un blocco di file descriptor.} L'uso di \const{EPOLL\_CTL\_MOD} consente in seguito di modificare le modalità di osservazione di un file descriptor che sia già stato aggiunto alla lista di osservazione. +% TODO verificare se prima o poi epoll_ctlv verrà introdotta + Le impostazioni di default prevedono che la notifica degli eventi richiesti sia effettuata in modalità \textit{level triggered}, a meno che sul file descriptor non si sia impostata la modalità \textit{edge triggered}, @@ -3167,15 +3169,15 @@ così all'applicazione di collegare la corrispondente coppia di eventi Infine due campi \var{name} e \var{len} sono utilizzati soltanto quando l'evento è relativo ad un file presente in una directory posta sotto osservazione, in tal caso essi contengono rispettivamente il nome del file -(come pathname relativo alla directory osservata) e la relativa dimensione in -byte. Il campo \var{name} viene sempre restituito come stringa terminata da -NUL, con uno o più zeri di terminazione, a seconda di eventuali necessità di -allineamento del risultato, ed il valore di \var{len} corrisponde al totale -della dimensione di \var{name}, zeri aggiuntivi compresi. La stringa con il -nome del file viene restituita nella lettura subito dopo la struttura -\struct{inotify\_event}; questo significa che le dimensioni di ciascun evento -di \textit{inotify} saranno pari a \code{sizeof(\struct{inotify\_event}) + - len}. +(come \itindsub{pathname}{relativo} \textit{pathname} relativo alla directory +osservata) e la relativa dimensione in byte. Il campo \var{name} viene sempre +restituito come stringa terminata da NUL, con uno o più zeri di terminazione, +a seconda di eventuali necessità di allineamento del risultato, ed il valore +di \var{len} corrisponde al totale della dimensione di \var{name}, zeri +aggiuntivi compresi. La stringa con il nome del file viene restituita nella +lettura subito dopo la struttura \struct{inotify\_event}; questo significa che +le dimensioni di ciascun evento di \textit{inotify} saranno pari a +\code{sizeof(\struct{inotify\_event}) + len}. Vediamo allora un esempio dell'uso dell'interfaccia di \textit{inotify} con un semplice programma che permette di mettere sotto osservazione uno o più file e @@ -4737,7 +4739,7 @@ definito la macro \macro{\_GNU\_SOURCE},\footnote{si ricordi che questa \func{splice}, oppure nessuno dei file descriptor è una pipe, oppure si è dato un valore a \param{off\_in} o \param{off\_out} ma il corrispondente file è un dispositivo che non supporta la funzione - \func{seek}. + \func{lseek}. \item[\errcode{ENOMEM}] non c'è memoria sufficiente per l'operazione richiesta. \item[\errcode{ESPIPE}] o \param{off\_in} o \param{off\_out} non sono diff --git a/filedir.tex b/filedir.tex index ac07597..2fbda9f 100644 --- a/filedir.tex +++ b/filedir.tex @@ -100,6 +100,7 @@ relativi campi con i dati specifici di quel filesystem, ed in particolare si dovrà creare anche la relativa versione della funzione \code{mount}. \itindbeg{pathname} +\itindbeg{pathname!resolution} Come illustrato in fig.~\ref{fig:kstruct_file_system_type} questa funzione restituisce una \textit{dentry}, abbreviazione che sta per \textit{directory @@ -145,6 +146,7 @@ filesystem, e come vedremo questo farà sì che venga eseguita una filesystem. \itindend{pathname} +\itindend{pathname!resolution} % Un secondo effetto della chiamata funzione \texttt{mount} di % \kstruct{file\_system\_type} è quello di allocare una struttura @@ -608,9 +610,10 @@ indicizzazione tramite hash al posto delle \textit{linked list} che abbiamo illustrato, ottenendo un forte guadagno di prestazioni in caso di directory contenenti un gran numero di file. -% TODO portare a ext3, ext4 e btrfs ed illustrare le problematiche che si -% possono incontrare (in particolare quelle relative alla perdita di contenuti -% in caso di crash del sistema) +% TODO (bassa priorità) portare a ext3, ext4 e btrfs ed illustrare le +% problematiche che si possono incontrare (in particolare quelle relative alla +% perdita di contenuti in caso di crash del sistema) +% TODO (media priorità) trattare btrfs quando sarà usato come stabile \subsection{La gestione dell'uso dei filesystem} @@ -635,10 +638,10 @@ il cui prototipo è:\footnote{la funzione è una versione specifica di Linux che caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{EACCES}] non si ha il permesso di accesso su uno dei - componenti del \itindex{pathname} \textit{pathname}, o si è cercato di - montare un filesystem disponibile in sola lettura senza aver specificato - \const{MS\_RDONLY} o il device \param{source} è su un filesystem montato - con l'opzione \const{MS\_NODEV}. + componenti del \textit{pathname}, o si è cercato di montare un filesystem + disponibile in sola lettura senza aver specificato \const{MS\_RDONLY} o il + device \param{source} è su un filesystem montato con l'opzione + \const{MS\_NODEV}. \item[\errcode{EBUSY}] \param{source} è già montato, o non può essere rimontato in sola lettura perché ci sono ancora file aperti in scrittura, o non può essere montato su \param{target} perché la directory è ancora in @@ -651,7 +654,7 @@ il cui prototipo è:\footnote{la funzione è una versione specifica di Linux che \textit{mount point} o è la radice. \item[\errcode{ELOOP}] si è cercato di spostare un \itindex{mount~point} \textit{mount point} su una sottodirectory di \param{source} o si sono - incontrati troppi link simolici nella risoluzione di un nome. + incontrati troppi link simbolici nella risoluzione di un nome. \item[\errcode{EMFILE}] in caso di filesystem virtuale, la tabella dei dispositivi fittizi (chiamati \textit{dummy} nella documentazione inglese) è piena. @@ -672,8 +675,7 @@ La funzione monta sulla directory indicata da \param{target}, detta di dispositivo indicato da \param{source}. In entrambi i casi, come daremo per assunto da qui in avanti tutte le volte che si parla di directory o file nel passaggio di un argomento di una funzione, si intende che questi devono essere -indicati con la stringa contenente il loro \itindex{pathname} -\textit{pathname}. +indicati con la stringa contenente il loro \textit{pathname}. Normalmente un filesystem è contenuto su un disco o una partizione, ma come illustrato in sez.~\ref{sec:file_vfs_work} la struttura del @@ -707,7 +709,7 @@ Dopo l'esecuzione della funzione il contenuto del filesystem viene resto disponibile nella directory specificata come \itindex{mount~point} \textit{mount point}, il precedente contenuto di detta directory viene mascherato dal contenuto della directory radice del filesystem montato. Fino -ai kernel della serie 2.2.x non era possibile montare un filesytem se un +ai kernel della serie 2.2.x non era possibile montare un filesystem se un \textit{mount point} era già in uso. A partire dal kernel 2.4.x inoltre è divenuto possibile sia spostare @@ -751,9 +753,9 @@ identificati dalle costanti riportate nell'elenco seguente: effettuato il \textit{bind mount}. Gli argomenti \param{filesystemtype} e \param{data} vengono ignorati. - In sostanza quello che avviene è che in corrispondenza del \index{pathname} - \textit{pathname} indicato da \param{target} viene montato l'\textit{inode} - di \param{source}, così che la porzione di albero dei file presente sotto + In sostanza quello che avviene è che in corrispondenza del \textit{pathname} + indicato da \param{target} viene montato l'\textit{inode} di \param{source}, + così che la porzione di albero dei file presente sotto \param{source} diventi visibile allo stesso modo sotto \param{target}. Trattandosi esattamente dei dati dello stesso filesystem, ogni modifica fatta in uno qualunque dei due rami di albero sarà visibile @@ -762,7 +764,7 @@ identificati dalle costanti riportate nell'elenco seguente: Dal punto di vista del \itindex{Virtual~File~System} VFS l'operazione è analoga al montaggio di un filesystem proprio nel fatto che anche in questo - caso si inserisce in corripondenza della \textit{dentry} di \texttt{target} + caso si inserisce in corrispondenza della \textit{dentry} di \texttt{target} un diverso \textit{inode}, che stavolta, invece di essere quello della radice del filesystem indicato da un file di dispositivo, è quello di una directory già montata. @@ -829,10 +831,11 @@ identificati dalle costanti riportate nell'elenco seguente: vengono ignorati. Lo spostamento avviene atomicamente, ed il ramo di albero presente - sotto \param{source} sarà immediatamante visibile sotto \param{target}. Non + sotto \param{source} sarà immediatamente visibile sotto \param{target}. Non esiste cioè nessun momento in cui il filesystem non risulti montato in una o nell'altra directory e pertanto è garantito che la risoluzione di - \textit{pathname} relativi all'interno del filesystem non possa fallire. + \itindsub{pathname}{relativo} \textit{pathname} relativi all'interno del + filesystem non possa fallire. \item[\const{MS\_NOATIME}] Viene disabilitato sul filesystem l'aggiornamento degli \textit{access time} (vedi sez.~\ref{sec:file_file_times}) per @@ -935,7 +938,7 @@ identificati dalle costanti riportate nell'elenco seguente: \item[\const{MS\_RELATIME}] Indica di effettuare l'aggiornamento degli \textit{access time} sul filesystem soltanto quando questo risulti - antecendente il valore corrente del \textit{modification time} o del + antecedente il valore corrente del \textit{modification time} o del \textit{change time} (per i tempi dei file si veda sez.~\ref{sec:file_file_times}). L'opzione è disponibile a partire dal kernel 2.6.20, mentre dal 2.6.30 questo è diventato il comportamento di @@ -1066,7 +1069,7 @@ identificati dalle costanti riportate nell'elenco seguente: Una volta che non si voglia più utilizzare un certo filesystem è possibile -\textsl{smontarlo} usando la funzione \funcd{umount}, il cui prototipo è: +``\textsl{smontarlo}'' usando la funzione \funcd{umount}, il cui prototipo è: \begin{funcproto}{ \fhead{sys/mount.h} @@ -1076,16 +1079,18 @@ Una volta che non si voglia più utilizzare un certo filesystem è possibile {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{EBUSY}] \param{target} è la \index{directory~di~lavoro} - directory di lavoro di qualche processo, o contiene dei file aperti, o un - altro mount point. + \item[\errcode{EBUSY}] il filesystem è occupato. \item[\errcode{EINVAL}] \param{target} non è un \textit{mount point}. - \item[\errcode{EPERM}] il processo non ha i privilegi di amministratore. + \item[\errcode{EPERM}] il processo non ha i privilegi di + amministratore.\footnotemark \end{errlist} ed inoltre \errval{EFAULT}, \errval{ELOOP}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM} nel loro significato generico. } \end{funcproto} +\footnotetext{più precisamente la \itindex{capabilities} capacità + \texttt{CAP\_SYS\_ADMIN}.} + La funzione prende il nome della directory su cui il filesystem è 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 @@ -1094,10 +1099,10 @@ quanto a partire dai kernel della serie 2.4.x è possibile montare lo stesso dispositivo in più punti. Nel caso più di un filesystem sia stato montato sullo stesso \itindex{mount~point} \textit{mount point} viene smontato quello che è stato montato per ultimo. Si tenga presente che la funzione fallisce se -il filesystem è \textsl{occupato}, cioè quando se ci sono ancora dei file +il filesystem è ``\textsl{occupato}'', cioè quando ci sono ancora dei file aperti sul filesystem, se questo contiene la \index{directory~di~lavoro} -directory di lavoro corrente di un qualunque processo o il -\itindex{mount~point} \textit{mount point} di un altro filesystem. +directory di lavoro di un qualunque processo o il \itindex{mount~point} +\textit{mount point} di un altro filesystem. Linux provvede inoltre una seconda funzione, \funcd{umount2}, che consente un maggior controllo delle operazioni, come forzare lo smontaggio di un @@ -1111,20 +1116,27 @@ filesystem anche quando questo risulti occupato; il suo prototipo è: {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{EAGAIN}] - \item[\errcode{EINVAL}] + \item[\errcode{BUSY}] \param{target} è la \index{directory~di~lavoro} + directory di lavoro di qualche processo, o contiene dei file aperti, o un + altro mount point. + \item[\errcode{EAGAIN}] si è chiamata la funzione con \const{MNT\_EXPIRE} + ed il filesystem non era occupato. + \item[\errcode{EINVAL}] \param{target} non è un \itindex{mount~point} + \textit{mount point} o si è usato \const{MNT\_EXPIRE} con + \const{MNT\_FORCE} o \const{MNT\_DETACH} o si è specificato un flag non + esistente. \end{errlist} - e gli altri valori visti per \func{umount} con lo stesso signigicato. -} + e tutti gli altri valori visti per \func{umount} con lo stesso significato.} \end{funcproto} -Il valore di \param{flags} è una maschera binaria, che deve essere specificato -con un OR aritmetico dei valori illustrate in tab.~\ref{tab:umount2_flags}. -Specificando \const{MNT\_FORCE} la funzione cercherà di liberare il filesystem -anche se è occupato per via di una delle condizioni descritte in precedenza. A -seconda del tipo di filesystem alcune (o tutte) possono essere superate, -evitando l'errore di \errcode{EBUSY}. In tutti i casi prima dello smontaggio -viene eseguita una sincronizzazione dei dati. +Il valore di \param{flags} è una maschera binaria dei flag che controllano le +modalità di smontaggio, che deve essere specificato con un OR aritmetico delle +costanti illustrate in tab.~\ref{tab:umount2_flags}. Specificando +\const{MNT\_FORCE} la funzione cercherà di liberare il filesystem anche se è +occupato per via di una delle condizioni descritte in precedenza. A seconda +del tipo di filesystem alcune (o tutte) possono essere superate, evitando +l'errore di \errcode{EBUSY}. In tutti i casi prima dello smontaggio viene +eseguita una sincronizzazione dei dati. \begin{table}[!htb] \centering @@ -1134,10 +1146,21 @@ viene eseguita una sincronizzazione dei dati. \textbf{Costante} & \textbf{Descrizione}\\ \hline \hline - \const{MNT\_FORCE} & (dal kernel 2.2).\\ - \const{MNT\_DETACH} & (dal kernel 2.4.11 e dalla \acr{glibc} 2.11).\\ - \const{MNT\_EXPIRE} & (dal kernel 2.6.8 e dalla \acr{glibc} 2.11).\\ - \const{UMOUNT\_NOFOLLOW}& (dal kernel 2.6.34).\\ + \const{MNT\_FORCE} & forza lo smontaggio del filesystem anche se questo è + occupato (presente dai kernel della serie 2.2).\\ + \const{MNT\_DETACH} & esegue uno smontaggio ``\textsl{pigro}'', in cui si + blocca l'accesso ma si aspetta che il filesystem si + liberi (presente dal kernel 2.4.11 e dalla + \acr{glibc} 2.11).\\ + \const{MNT\_EXPIRE} & se non occupato marca un \itindex{mount~point} + \textit{mount point} come ``\textsl{in scadenza}'' in + modo che ad una successiva chiamata senza utilizzo + del filesystem questo venga smontato (presente dal + kernel 2.6.8 e dalla \acr{glibc} 2.11).\\ + \const{UMOUNT\_NOFOLLOW}& non dereferenzia \param{target} se questo è un + link simbolico (vedi sez.~\ref{sec:file_symlink}) + evitando problemi di sicurezza (presente dal kernel + 2.6.34).\\ \hline \end{tabular} \caption{Costanti che identificano i bit dell'argomento \param{flags} @@ -1145,7 +1168,26 @@ viene eseguita una sincronizzazione dei dati. \label{tab:umount2_flags} \end{table} - +Con l'opzione \const{MNT\_DETACH} si richiede invece uno smontaggio +``\textsl{pigro}'' (o \textit{lazy umount}) in cui il filesystem diventa +inaccessibile per i nuovi processi subito dopo la chiamata della funzione, ma +resta accessibile per quelli che lo hanno ancora in uso e non viene smontato +fintanto che resta occupato. + +Con \const{MNT\_EXPIRE}, che non può essere specificato insieme agli altri +due, si marca il \itindex{mount~point} \textit{mount point} di un filesystem +non occupato come ``\textsl{in scadenza}'', in tal caso \func{umount2} ritorna +con un errore di \errcode{EAGAIN}, mentre in caso di filesystem occupato si +sarebbe ricevuto \errcode{BUSY}. Una volta marcato, se nel frattempo non +viene fatto nessun uso del filesystem, ad una successiva chiamata con +\const{MNT\_EXPIRE} questo verrà smontato. Questo flag consente di realizzare +un meccanismo che smonti automaticamente i filesystem che restano inutilizzato +per un certo periodo di tempo. + +% Infine il flag \const{UMOUNT\_NOFOLLOW} impedisce l'uso di un link simbolico +% per \param{target} evitando così che si possano passare ai programmi che +% effettuano lo smontaggio dei filesystem per i quali è previsto la possibilità +% di gestione da parte degli utenti con uno programma \acr{sgid} Altre due funzioni specifiche di Linux,\footnote{esse si trovano anche su BSD, ma con una struttura diversa.} utili per ottenere in maniera diretta @@ -1170,7 +1212,7 @@ informazioni riguardo al filesystem su cui si trova un certo file, sono \end{funcproto} Queste funzioni permettono di ottenere una serie di informazioni generali -riguardo al filesystem su cui si trova il file specificato; queste vengono +riguardo al filesystem su cui si trova il file specificato con un ; queste vengono restituite all'indirizzo \param{buf} di una struttura \struct{statfs} definita come in fig.~\ref{fig:sys_statfs}, ed i campi che sono indefiniti per il filesystem in esame sono impostati a zero. I valori del campo \var{f\_type} @@ -1203,10 +1245,8 @@ semplice invocare direttamente il programma \cmd{mount}, per cui ne tralasceremo la trattazione, rimandando al manuale delle \acr{glibc} \cite{glibc} per la documentazione completa. -% TODO scrivere relativamente alle varie funzioni (getfsent e getmntent &C) -% TODO documentare swapon e swapoff (man 2 ...) - - +% TODO (bassa priorità) scrivere delle funzioni (getfsent e getmntent &C) +% TODO (bassa priorità) documentare ? swapon e swapoff (man 2 ...) \section{La gestione di file e directory} \label{sec:file_dir} @@ -1281,25 +1321,25 @@ diretto, o \textit{hard link}. Il prototipo della funzione è il seguente: \end{funcproto} -La funzione crea sul \itindex{pathname} \textit{pathname} \param{newpath} un -collegamento diretto al file indicato da \param{oldpath}. Per quanto detto la -creazione di un nuovo collegamento diretto non copia il contenuto del file, ma -si limita a creare una voce nella directory specificata da \param{newpath} e -ad aumentare di uno il numero di riferimenti al file (riportato nel campo -\var{st\_nlink} della struttura \struct{stat}, vedi sez.~\ref{sec:file_stat}) -aggiungendo il nuovo nome ai precedenti. Si noti che uno stesso file può -essere così chiamato con vari nomi in diverse directory. +La funzione crea sul \textit{pathname} \param{newpath} un collegamento diretto +al file indicato da \param{oldpath}. Per quanto detto la creazione di un +nuovo collegamento diretto non copia il contenuto del file, ma si limita a +creare una voce nella directory specificata da \param{newpath} e ad aumentare +di uno il numero di riferimenti al file (riportato nel campo \var{st\_nlink} +della struttura \struct{stat}, vedi sez.~\ref{sec:file_stat}) aggiungendo il +nuovo nome ai precedenti. Si noti che uno stesso file può essere così chiamato +con vari nomi in diverse directory. Per quanto dicevamo in sez.~\ref{sec:file_filesystem} la creazione di un -collegamento diretto è possibile solo se entrambi i \itindex{pathname} -\textit{pathname} sono nello stesso filesystem; inoltre il filesystem deve -supportare i collegamenti diretti (il meccanismo non è disponibile ad esempio -con il filesystem \acr{vfat} di Windows). In realtà la funzione ha un -ulteriore requisito, e cioè che non solo che i due file siano sullo stesso -filesystem, ma anche che si faccia riferimento ad essi sullo stesso -\itindex{mount~point} \textit{mount point}.\footnote{si tenga presente infatti - (vedi sez.~\ref{sec:sys_file_config}) che a partire dal kernel 2.4 uno - stesso filesystem può essere montato più volte su directory diverse.} +collegamento diretto è possibile solo se entrambi i \textit{pathname} sono +nello stesso filesystem; inoltre il filesystem deve supportare i collegamenti +diretti (il meccanismo non è disponibile ad esempio con il filesystem +\acr{vfat} di Windows). In realtà la funzione ha un ulteriore requisito, e +cioè che non solo che i due file siano sullo stesso filesystem, ma anche che +si faccia riferimento ad essi sullo stesso \itindex{mount~point} \textit{mount + point}.\footnote{si tenga presente infatti (vedi + sez.~\ref{sec:sys_file_config}) che a partire dal kernel 2.4 uno stesso + filesystem può essere montato più volte su directory diverse.} La funzione inoltre opera sia sui file ordinari che sugli altri oggetti del filesystem, con l'eccezione delle directory. In alcune versioni di Unix solo @@ -1443,7 +1483,7 @@ a \func{rmdir}; il suo prototipo è: \fdesc{Cancella un nome dal filesystem.} } {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual - caso \var{errno} assumerà uno dei valori relativi alla chimata utilizzata, + caso \var{errno} assumerà uno dei valori relativi alla chiamata utilizzata, pertanto si può fare riferimento a quanto illustrato nelle descrizioni di \func{unlink} e \func{rmdir}.} \end{funcproto} @@ -1483,8 +1523,8 @@ nello stesso filesystem) si usa invece la funzione \funcd{rename},\footnote{la \item[\errcode{EINVAL}] \param{newpath} contiene un prefisso di \param{oldpath} o più in generale si è cercato di creare una directory come sotto-directory di se stessa. - \item[\errcode{ENOTDIR}] uno dei componenti dei \itindex{pathname} - \textit{pathname} non è una directory o \param{oldpath} è una directory e + \item[\errcode{ENOTDIR}] uno dei componenti dei \textit{pathname} non è una + directory o \param{oldpath} è una directory e \param{newpath} esiste e non è una directory. \end{errlist} ed inoltre \errval{EACCES}, \errval{EPERM}, \errval{EMLINK}, \errval{ENOENT}, \errval{ENOMEM}, \errval{EROFS}, \errval{ELOOP} e @@ -1577,13 +1617,12 @@ esso specificato. La funzione che permette di creare un nuovo link simbolico \errval{ENOSPC} e \errval{EIO} nel loro significato generico.} \end{funcproto} -La funzione crea un nuovo link simbolico con \itindex{pathname} -\textit{pathname} \param{newpath} che fa riferimento ad \param{oldpath}. Si -tenga presente che la funzione non effettua nessun controllo sull'esistenza di -un file di nome \param{oldpath}, ma si limita ad inserire il -\itindex{pathname} \textit{pathname} nel link simbolico. Pertanto un link -simbolico può anche riferirsi ad un file che non esiste: in questo caso si ha -quello che viene chiamato un \textit{dangling link}, letteralmente un +La funzione crea un nuovo link simbolico con \textit{pathname} \param{newpath} +che fa riferimento ad \param{oldpath}. Si tenga presente che la funzione non +effettua nessun controllo sull'esistenza di un file di nome \param{oldpath}, +ma si limita ad inserire il \textit{pathname} nel link simbolico. Pertanto un +link simbolico può anche riferirsi ad un file che non esiste: in questo caso +si ha quello che viene chiamato un \textit{dangling link}, letteralmente un \textsl{link ciondolante}. Come accennato i link simbolici sono risolti automaticamente dal kernel @@ -1689,8 +1728,8 @@ directory porterebbe il comando ad esaminare \file{/boot}, \file{/boot/boot}, \file{/boot/boot/boot} e così via. Per questo motivo il kernel e le librerie prevedono che nella risoluzione di -un \itindex{pathname} \textit{pathname} possano essere seguiti un numero -limitato di link simbolici, il cui valore limite è specificato dalla costante +un \textit{pathname} possano essere seguiti un numero limitato di link +simbolici, il cui valore limite è specificato dalla costante \const{MAXSYMLINKS}. Qualora questo limite venga superato viene generato un errore ed \var{errno} viene impostata al valore \errcode{ELOOP}. @@ -1756,8 +1795,8 @@ una opportuna system call.\footnote{questo è quello che permette anche, La funzione crea una nuova directory vuota, che contiene cioè solo le due voci standard presenti in ogni directory (cioè ``\file{.}'' e ``\file{..}''), con il nome indicato dall'argomento \param{dirname}. Il nome può essere indicato -sia come \itindex{pathname} \textit{pathname} assoluto che come -\itindex{pathname} \textit{pathname} relativo. +sia come \itindsub{pathname}{assoluto} \textit{pathname} assoluto che come +\itindsub{pathname}{relativo} \textit{pathname} relativo. I permessi di accesso (vedi sez.~\ref{sec:file_access_control}) con cui la directory viene creata sono specificati dall'argomento \param{mode}, i cui @@ -1794,8 +1833,8 @@ La funzione che permette la cancellazione di una directory è invece La funzione cancella la directory \param{dirname}, che deve essere vuota (la directory deve cioè contenere soltanto le due voci standard ``\file{.}'' e -``\file{..}''). Il nome può essere indicato con il \itindex{pathname} -\textit{pathname} assoluto o relativo. +``\file{..}''). Il nome può essere indicato con il \textit{pathname} assoluto +o relativo. La modalità con cui avviene la cancellazione è analoga a quella di \func{unlink}: fintanto che il numero di link \itindex{inode} @@ -2440,8 +2479,8 @@ chiusura (\texttt{\small 32}) dello stream\footnote{nel nostro caso, uscendo \subsection{La directory di lavoro} \label{sec:file_work_dir} -\itindbeg{pathname} \index{directory~di~lavoro|(} + Come accennato in sez.~\ref{sec:proc_fork} a ciascun processo è associata una directory nel filesystem,\footnote{questa viene mantenuta all'interno dei dati della sua \struct{task\_struct} (vedi fig.~\ref{fig:proc_task_struct}), più @@ -2561,7 +2600,6 @@ possibile (tutti gli altri sarebbero occorsi all'apertura di \param{fd}), è quello in cui il processo non ha il permesso di accesso alla directory specificata da \param{fd}. -\itindend{pathname} \index{directory~di~lavoro|)} @@ -2792,13 +2830,13 @@ funzioni \funcd{stat}, \funcd{fstat} e \funcd{lstat}, i cui prototipi sono: \errval{EACCES}, \errval{ENOMEM}, \errval{ENAMETOOLONG}.} \end{functions} -La funzione \func{stat} legge le informazioni del file il cui pathname è -specificato dalla stringa puntata da \param{file\_name} e le inserisce nel -buffer puntato dall'argomento \param{buf}; la funzione \func{lstat} è identica -a \func{stat} eccetto che se \param{file\_name} è un link simbolico vengono -lette le informazioni relative ad esso e non al file a cui fa -riferimento. Infine \func{fstat} esegue la stessa operazione su un file già -aperto, specificato tramite il suo file descriptor \param{filedes}. +La funzione \func{stat} legge le informazioni del file il cui +\textit{pathname} è specificato dalla stringa puntata da \param{file\_name} e +le inserisce nel buffer puntato dall'argomento \param{buf}; la funzione +\func{lstat} è identica a \func{stat} eccetto che se \param{file\_name} è un +link simbolico vengono lette le informazioni relative ad esso e non al file a +cui fa riferimento. Infine \func{fstat} esegue la stessa operazione su un file +già aperto, specificato tramite il suo file descriptor \param{filedes}. La struttura \struct{stat} usata da queste funzioni è definita nell'header \headfile{sys/stat.h} e in generale dipende dall'implementazione; la versione @@ -2927,8 +2965,8 @@ poi si effettua il confronto con la combinazione di tipi scelta. Il campo \var{st\_size} di una struttura \struct{stat} contiene la dimensione del file in byte, se si tratta di un file regolare. Nel caso di un link -simbolico la dimensione è quella del \itindex{pathname} \textit{pathname} che -il link stesso contiene; per le fifo questo campo è sempre nullo. +simbolico la dimensione è quella del \textit{pathname} che il link stesso +contiene; per le fifo questo campo è sempre nullo. Il campo \var{st\_blocks} definisce la lunghezza del file in blocchi di 512 byte. Il campo \var{st\_blksize} infine definisce la dimensione preferita per @@ -2980,8 +3018,7 @@ dimensione si possono usare le due funzioni \funcd{truncate} e per \func{truncate} si hanno: \begin{errlist} \item[\errcode{EACCES}] il file non ha permesso di scrittura o non si ha il - permesso di esecuzione una delle directory del \itindex{pathname} - \textit{pathname}. + permesso di esecuzione una delle directory del \textit{pathname}. \item[\errcode{ETXTBSY}] il file è un programma in esecuzione. \end{errlist} ed anche \errval{ENOTDIR}, \errval{ENAMETOOLONG}, \errval{ENOENT}, @@ -2990,9 +3027,9 @@ dimensione si possono usare le due funzioni \funcd{truncate} e Entrambe le funzioni fan sì che la dimensione del file sia troncata ad un valore massimo specificato da \param{length}, e si distinguono solo per il -fatto che il file viene indicato con il pathname \param{file\_name} per -\func{truncate} e con il file descriptor \param{fd} per \funcd{ftruncate}; se -il file è più lungo della lunghezza specificata i dati in eccesso saranno +fatto che il file viene indicato con il \textit{pathname} \param{file\_name} +per \func{truncate} e con il file descriptor \param{fd} per \funcd{ftruncate}; +se il file è più lungo della lunghezza specificata i dati in eccesso saranno perduti. Il comportamento in caso di lunghezza inferiore non è specificato e dipende @@ -3380,12 +3417,12 @@ sostanzialmente una estensione di \func{futimes} che consente di specificare i tempi con precisione maggiore, la seconda supporta invece, rispetto ad \func{utimes}, una sintassi più complessa che, come vedremo in sez.~\ref{sec:file_openat} consente una indicazione sicura dei -\textit{pathname relativi} specificando la directory da usare come riferimento -in \param{dirfd} e la possibilità di usare \param{flags} per indicare alla -funzione di dereferenziare o meno i link simbolici; si rimanda pertanto la -spiegazione del significato degli argomenti aggiuntivi alla trattazione -generica delle varie funzioni che usano la stessa sintassi, effettuata in -sez.~\ref{sec:file_openat}. +\itindsub{pathname}{relativo} \textit{pathname relativi} specificando la +directory da usare come riferimento in \param{dirfd} e la possibilità di +usare \param{flags} per indicare alla funzione di dereferenziare o meno i link +simbolici; si rimanda pertanto la spiegazione del significato degli argomenti +aggiuntivi alla trattazione generica delle varie funzioni che usano la stessa +sintassi, effettuata in sez.~\ref{sec:file_openat}. \section{Il controllo di accesso ai file} @@ -3506,15 +3543,15 @@ limiteremo ad un riassunto delle regole generali, entrando nei dettagli più avanti. La prima regola è che per poter accedere ad un file attraverso il suo -\itindex{pathname} \textit{pathname} occorre il permesso di esecuzione in -ciascuna delle directory che compongono il \textit{pathname}; lo stesso vale -per aprire un file nella directory corrente (per la quale appunto serve il -diritto di esecuzione). +\textit{pathname} occorre il permesso di esecuzione in ciascuna delle +directory che compongono il \textit{pathname}; lo stesso vale per aprire un +file nella directory corrente (per la quale appunto serve il diritto di +esecuzione). Per una directory infatti il permesso di esecuzione significa che essa può -essere attraversata nella risoluzione del \itindex{pathname} -\textit{pathname}, ed è distinto dal permesso di lettura che invece implica -che si può leggere il contenuto della directory. +essere attraversata nella risoluzione del \textit{pathname}, ed è distinto dal +permesso di lettura che invece implica che si può leggere il contenuto della +directory. Questo significa che se si ha il permesso di esecuzione senza permesso di lettura si potrà lo stesso aprire un file in una directory (se si hanno i @@ -4300,7 +4337,7 @@ tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi: sicurezza che si sta utilizzando al momento (ciascuno avrà le sue). Se non è stato caricato nessun modulo di sicurezza l'accesso in lettura sarà consentito a tutti i processi, mentre quello in scrittura solo ai processi - con privilegi amministrativi dotati della \index{capabilities} + con privilegi amministrativi dotati della \itindex{capabilities} \textit{capability} \const{CAP\_SYS\_ADMIN}. \item[\texttt{system}] Anche l'accesso agli \textit{extended system @@ -4310,13 +4347,13 @@ tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi: lettura ai processi che hanno la capacità di eseguire una ricerca sul file (cioè hanno il permesso di lettura sulla directory che contiene il file) ed in scrittura al proprietario del file o ai processi dotati della - \textit{capability} \index{capabilities} \const{CAP\_FOWNER}.\footnote{vale - a dire una politica di accesso analoga a quella impiegata per gli ordinari - permessi dei file.} + \textit{capability} \itindex{capabilities} + \const{CAP\_FOWNER}.\footnote{vale a dire una politica di accesso analoga a + quella impiegata per gli ordinari permessi dei file.} \item[\texttt{trusted}] L'accesso ai \textit{trusted extended attributes}, sia per la lettura che per la scrittura, è consentito soltanto ai processi con - privilegi amministrativi dotati della \index{capabilities} + privilegi amministrativi dotati della \itindex{capabilities} \textit{capability} \const{CAP\_SYS\_ADMIN}. In questo modo si possono utilizzare questi attributi per realizzare in user space dei meccanismi di controllo che accedono ad informazioni non disponibili ai processi ordinari. @@ -4358,7 +4395,7 @@ tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi: per evitare eventuali abusi, se una directory ha lo \itindex{sticky~bit} \textit{sticky bit} attivo sarà consentito scrivere i suoi \textit{extended user attributes} soltanto se si è proprietari della stessa, o si hanno i - privilegi amministrativi della capability \index{capabilities} + privilegi amministrativi della capability \itindex{capabilities} \const{CAP\_FOWNER}. \end{basedescript} @@ -4404,12 +4441,12 @@ simbolico e ad un file descriptor; i rispettivi prototipi sono: \end{functions} Le funzioni \func{getxattr} e \func{lgetxattr} prendono come primo argomento -un pathname che indica il file di cui si vuole richiedere un attributo, la -sola differenza è che la seconda, se il pathname indica un link simbolico, -restituisce gli attributi di quest'ultimo e non quelli del file a cui esso fa -riferimento. La funzione \func{fgetxattr} prende invece come primo argomento -un numero di file descriptor, e richiede gli attributi del file ad esso -associato. +un \textit{pathname} che indica il file di cui si vuole richiedere un +attributo, la sola differenza è che la seconda, se il \textit{pathname} indica +un link simbolico, restituisce gli attributi di quest'ultimo e non quelli del +file a cui esso fa riferimento. La funzione \func{fgetxattr} prende invece +come primo argomento un numero di file descriptor, e richiede gli attributi +del file ad esso associato. Tutte e tre le funzioni richiedono di specificare nell'argomento \param{name} il nome dell'attributo di cui si vuole ottenere il valore. Il nome deve essere @@ -4632,7 +4669,7 @@ può impostare una ACL aggiuntiva, detta \textit{default ACL}, che serve ad indicare quale dovrà essere la ACL assegnata di default nella creazione di un file all'interno della directory stessa. Come avviene per i permessi le ACL possono essere impostate solo del proprietario del file, o da un processo con -la capability \index{capabilities} \const{CAP\_FOWNER}. +la capability \itindex{capabilities} \const{CAP\_FOWNER}. \begin{table}[htb] \centering @@ -4940,12 +4977,13 @@ sono: Le due funzioni ritornano, con un oggetto di tipo \type{acl\_t}, il valore della ACL correntemente associata ad un file, che può essere identificato -tramite un file descriptor usando \func{acl\_get\_fd} o con un pathname usando -\func{acl\_get\_file}. Nel caso di quest'ultima funzione, che può richiedere -anche la ACL relativa ad una directory, il secondo argomento \param{type} -consente di specificare se si vuole ottenere la ACL di default o quella di -accesso. Questo argomento deve essere di tipo \type{acl\_type\_t} e può -assumere solo i due valori riportati in tab.~\ref{tab:acl_type}. +tramite un file descriptor usando \func{acl\_get\_fd} o con un +\textit{pathname} usando \func{acl\_get\_file}. Nel caso di quest'ultima +funzione, che può richiedere anche la ACL relativa ad una directory, il +secondo argomento \param{type} consente di specificare se si vuole ottenere la +ACL di default o quella di accesso. Questo argomento deve essere di tipo +\type{acl\_type\_t} e può assumere solo i due valori riportati in +tab.~\ref{tab:acl_type}. \begin{table}[htb] \centering @@ -5272,19 +5310,20 @@ directory, ed il cui prototipo è: \end{functions} La funzione consente di assegnare la ACL contenuta in \param{acl} al file o -alla directory indicate dal pathname \param{path}, mentre con \param{type} si -indica il tipo di ACL utilizzando le costanti di tab.~\ref{tab:acl_type}, ma -si tenga presente che le ACL di default possono essere solo impostate -qualora \param{path} indichi una directory. Inoltre perché la funzione abbia -successo la ACL dovrà essere valida, e contenere tutti le voci necessarie, -unica eccezione è quella in cui si specifica una ACL vuota per cancellare la -ACL di default associata a \func{path}.\footnote{questo però è una estensione - della implementazione delle ACL di Linux, la bozza di standard POSIX.1e - prevedeva l'uso della apposita funzione \funcd{acl\_delete\_def\_file}, che - prende come unico argomento il pathname della directory di cui si vuole - cancellare l'ACL di default, per i dettagli si ricorra alla pagina di - manuale.} La seconda funzione che consente di impostare una ACL è -\funcd{acl\_set\_fd}, ed il suo prototipo è: +alla directory indicate dal \textit{pathname} \param{path}, mentre +con \param{type} si indica il tipo di ACL utilizzando le costanti di +tab.~\ref{tab:acl_type}, ma si tenga presente che le ACL di default possono +essere solo impostate qualora \param{path} indichi una directory. Inoltre +perché la funzione abbia successo la ACL dovrà essere valida, e contenere +tutti le voci necessarie, unica eccezione è quella in cui si specifica una ACL +vuota per cancellare la ACL di default associata a +\func{path}.\footnote{questo però è una estensione della implementazione delle + ACL di Linux, la bozza di standard POSIX.1e prevedeva l'uso della apposita + funzione \funcd{acl\_delete\_def\_file}, che prende come unico argomento il + \textit{pathname} della directory di cui si vuole cancellare l'ACL di + default, per i dettagli si ricorra alla pagina di manuale.} La seconda +funzione che consente di impostare una ACL è \funcd{acl\_set\_fd}, ed il suo +prototipo è: \begin{functions} \headdecl{sys/types.h} \headdecl{sys/acl.h} @@ -5464,11 +5503,12 @@ caso \param{type} deve essere rispettivamente \const{USRQUOTA} o \hline \const{Q\_QUOTAON} & Attiva l'applicazione delle quote disco per il filesystem indicato da \param{dev}, si deve passare - in \param{addr} il pathname al file che mantiene le - quote, che deve esistere, e \param{id} deve indicare - la versione del formato con uno dei valori di - tab.~\ref{tab:quotactl_id_format}; l'operazione - richiede i privilegi di amministratore.\\ + in \param{addr} il \textit{pathname} al file che + mantiene le quote, che deve esistere, e \param{id} + deve indicare la versione del formato con uno dei + valori di tab.~\ref{tab:quotactl_id_format}; + l'operazione richiede i privilegi di + amministratore.\\ \const{Q\_QUOTAOFF} & Disattiva l'applicazione delle quote disco per il filesystem indicato da \param{dev}, \param{id} e \param{addr} vengono ignorati; l'operazione @@ -6837,7 +6877,7 @@ con \func{cap\_free}. Alle due funzioni citate se ne aggiungono altre due che consentono di convertire i valori delle costanti di tab.~\ref{tab:proc_capabilities} nelle stringhe usate nelle rispettive rappresentazioni e viceversa. Le due funzioni, -\func{cap\_to\_name} e \func{cap\_from\_name}, sono estensioni specifiche di +\funcd{cap\_to\_name} e \funcd{cap\_from\_name}, sono estensioni specifiche di Linux ed i rispettivi prototipi sono: \begin{functions} \headdecl{sys/capability.h} @@ -7018,8 +7058,8 @@ specifico di directory rispetto alla quale vengono risolti i sia specificato per ogni processo apre allora la possibilità di modificare le modalità di risoluzione dei \textit{pathname} assoluti da parte di un processo cambiando questa directory, così come si fa coi -\itindsub{pathname}{relativo}\textit{pathname} relativi cambiando la \index{directory~di~lavoro} directory -di lavoro. +\itindsub{pathname}{relativo}\textit{pathname} relativi cambiando la +\index{directory~di~lavoro} directory di lavoro. Normalmente la directory radice di un processo coincide anche con la radice del filesystem usata dal kernel, e dato che il suo valore viene ereditato dal @@ -7152,8 +7192,8 @@ programmi e librerie) di cui il server potrebbe avere bisogno. % LocalWords: Python Truelite Srl quotamodule Repository who nell' dall' KEEP % LocalWords: SECURE KEEPCAPS prctl FIXUP NOROOT LOCKED dell'IPC dell'I IOPRIO % LocalWords: CAPBSET CLASS IDLE dcookie overflow DIFFERS Virtual everything -% LocalWords: dentry register resolution cache dcache operation llseek poll -% LocalWords: multiplexing fsync fasync seek block superblock gapil tex img +% LocalWords: dentry register resolution cache dcache operation llseek poll ln +% LocalWords: multiplexing fsync fasync seek block superblock gapil tex img du % LocalWords: second linked journaled source filesystemtype unsigned device % LocalWords: mountflags NODEV ENXIO dummy devfs magic MGC RDONLY NOSUID MOVE % LocalWords: NOEXEC SYNCHRONOUS REMOUNT MANDLOCK NODIRATIME umount MNT statfs @@ -7163,3 +7203,6 @@ programmi e librerie) di cui il server potrebbe avere bisogno. %%% mode: latex %%% TeX-master: "gapil" %%% End: +% LocalWords: bind DIRSYNC lsattr Hierarchy FHS SHARED UNBINDABLE shared REC +% LocalWords: subtree SILENT log unbindable BUSY EAGAIN EXPIRE DETACH NOFOLLOW +% LocalWords: lazy diff --git a/filestd.tex b/filestd.tex index 214fb20..d5772ed 100644 --- a/filestd.tex +++ b/filestd.tex @@ -460,7 +460,7 @@ effettuato ogni volta che si chiama una funzione di libreria. Entrambi i flag (di errore e di end-of-file) possono essere cancellati usando la funzione \funcd{clearerr}, il cui prototipo è: \begin{prototype}{stdio.h}{void clearerr(FILE *stream)} - Cancella i flag di errore ed end-of-file di \param{stream}. + Cancella i flag di errore ed \textit{end-of-file} di \param{stream}. \end{prototype} \noindent in genere si usa questa funzione una volta che si sia identificata e corretta la causa di un errore per evitare di mantenere i flag attivi, così da @@ -1166,6 +1166,8 @@ inoltre ricordarsi di invocare \func{free} per liberare detto puntatore quando la stringa non serve più, onde evitare \itindex{memory~leak} \textit{memory leak}. +% TODO verificare se mettere prototipi di \func{dprintf} e \func{vdprintf} + Infine una ulteriore estensione GNU definisce le due funzioni \func{dprintf} e \func{vdprintf}, che prendono un file descriptor al posto dello \textit{stream}. Altre estensioni permettono di scrivere con caratteri @@ -1644,6 +1646,9 @@ con \param{type}, che può essere uno dei seguenti: di blocco dello \textit{stream}. \end{basedescript} +% TODO trattare \func{clearerr\_unlocked} + + \itindend{thread} diff --git a/fileunix.tex b/fileunix.tex index 796f052..3f4d4bb 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -189,8 +189,8 @@ usando direttamente le system call del kernel. \label{sec:file_open} La funzione \funcd{open} è la funzione fondamentale per accedere ai file, ed è -quella che crea l'associazione fra un \itindex{pathname} \textit{pathname} ed -un \itindex{file~descriptor} file descriptor, il suo prototipo è: +quella che crea l'associazione fra un \textit{pathname} ed un +\itindex{file~descriptor} file descriptor, il suo prototipo è: \begin{functions} \headdecl{sys/types.h} \headdecl{sys/stat.h} @@ -1127,12 +1127,12 @@ file descriptor libero di valore uguale o maggiore di \param{newfd} (e se \label{sec:file_openat} Un problema che si pone con l'uso della funzione \func{open}, così come per -molte altre funzioni che accettano come argomenti dei pathname relativi, è -che, quando un pathname relativo non fa riferimento alla -\index{directory~di~lavoro} directory di lavoro corrente, è possibile che -alcuni dei suoi componenti vengano modificati in parallelo alla chiamata a -\func{open}, e questo lascia aperta la possibilità di una -\itindex{race~condition} \textit{race condition}. +molte altre funzioni che accettano come argomenti dei +\itindsub{pathname}{relativo} \textit{pathname} relativi, è che, quando un +\textit{pathname} relativo non fa riferimento alla \index{directory~di~lavoro} +directory di lavoro corrente, è possibile che alcuni dei suoi componenti +vengano modificati in parallelo alla chiamata a \func{open}, e questo lascia +aperta la possibilità di una \itindex{race~condition} \textit{race condition}. Inoltre come già accennato, la \index{directory~di~lavoro} directory di lavoro corrente è una proprietà del singolo processo; questo significa che quando si @@ -1146,13 +1146,14 @@ Solaris, a fianco delle normali funzioni che operano sui file (come \func{open}, \func{mkdir}, ecc.) sono state introdotte delle ulteriori funzioni, dette anche funzioni ``\textit{at}'' in quanto contraddistinte dal suffisso \texttt{at}, che permettono l'apertura di un file (o le rispettive -altre operazioni) usando un pathname relativo ad una directory -specificata.\footnote{l'introduzione è avvenuta su proposta dello sviluppatore - principale delle \acr{glibc} Urlich Drepper; le corrispondenti system call - sono state inserite nel kernel ufficiale a partire dalla versione 2.6.16, in - precedenza era disponibile una emulazione che, sia pure con prestazioni - inferiori, funzionava facendo ricorso all'uso del filesystem \textit{proc} - con l'apertura del file attraverso il riferimento a pathname del tipo di +altre operazioni) usando un \itindsub{pathname}{relativo} \textit{pathname} +relativo ad una directory specificata.\footnote{l'introduzione è avvenuta su + proposta dello sviluppatore principale delle \acr{glibc} Urlich Drepper; le + corrispondenti system call sono state inserite nel kernel ufficiale a + partire dalla versione 2.6.16, in precedenza era disponibile una emulazione + che, sia pure con prestazioni inferiori, funzionava facendo ricorso all'uso + del filesystem \textit{proc} con l'apertura del file attraverso il + riferimento a \textit{pathname} del tipo di \texttt{/proc/self/fd/dirfd/relative\_path}.} Benché queste funzioni non siano presenti negli standard tradizionali esse sono state adottate da vari Unix\footnote{oltre a Linux e Solaris sono presenti in vari BSD.} fino ad @@ -1161,21 +1162,22 @@ POSIX.1; con le \acr{glibc} per l'accesso a queste funzioni è necessario definire la macro \macro{\_ATFILE\_SOURCE}. L'uso di queste funzioni prevede una apertura iniziale della directory che -sarà la base della risoluzione dei pathname relativi che verranno usati in -seguito, dopo di che si dovrà passare il relativo file descriptor alle varie -funzioni che useranno quella directory come punto di partenza per la -risoluzione.\footnote{in questo modo, anche quando si lavora con i - \itindex{thread} \textit{thread}, si può mantenere una - \index{directory~di~lavoro} directory di lavoro diversa per ciascuno di - essi.} +sarà la base della risoluzione dei \itindsub{pathname}{relativo} +\textit{pathname} relativi che verranno usati in seguito, dopo di che si dovrà +passare il relativo file descriptor alle varie funzioni che useranno quella +directory come punto di partenza per la risoluzione.\footnote{in questo modo, + anche quando si lavora con i \itindex{thread} \textit{thread}, si può + mantenere una \index{directory~di~lavoro} directory di lavoro diversa per + ciascuno di essi.} Questo metodo, oltre a risolvere i problemi di \itindex{race~condition} \textit{race condition}, consente anche di ottenere aumenti di prestazioni significativi quando si devono eseguire molte operazioni su sezioni dell'albero dei file che prevedono delle gerarchie di sottodirectory molto -profonde; infatti in questo caso basta eseguire la risoluzione del pathname -della directory di partenza una sola volta (nell'apertura iniziale) e non -tutte le volte che si deve accedere a ciascun file che essa contiene. +profonde; infatti in questo caso basta eseguire la risoluzione del +\textit{pathname} della directory di partenza una sola volta (nell'apertura +iniziale) e non tutte le volte che si deve accedere a ciascun file che essa +contiene. La sintassi generale di queste nuove funzioni è che esse prevedono come primo argomento il file descriptor della directory da usare come base, mentre gli @@ -1195,16 +1197,19 @@ come: errore di \func{open}, ed in più: \begin{errlist} \item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido. - \item[\errcode{ENOTDIR}] \param{pathname} è un pathname relativo, ma + \item[\errcode{ENOTDIR}] \param{pathname} è un \itindsub{pathname}{relativo} + \textit{pathname} relativo, ma \param{dirfd} fa riferimento ad un file. \end{errlist}} \end{functions} Il comportamento delle nuove funzioni è del tutto analogo a quello delle corrispettive classiche, con la sola eccezione del fatto che se fra i loro -argomenti si utilizza un pathname relativo questo sarà risolto rispetto alla -directory indicata da \param{dirfd}; qualora invece si usi un pathname -assoluto \param{dirfd} verrà semplicemente ignorato. Infine se per +argomenti si utilizza un \itindsub{pathname}{relativo} \textit{pathname} +relativo questo sarà risolto rispetto alla directory indicata +da \param{dirfd}; qualora invece si usi un \itindsub{pathname}{assoluto} +\textit{pathname} assoluto \param{dirfd} verrà semplicemente ignorato. Infine +se per \param{dirfd} si usa il valore speciale \const{AT\_FDCWD},\footnote{questa, come le altre costanti \texttt{AT\_*}, è definita in \headfile{fcntl.h}, pertanto se la si vuole usare occorrerà includere comunque questo file, @@ -1216,10 +1221,11 @@ Così come il comportamento, anche i valori di ritorno e le condizioni di errore delle nuove funzioni sono gli stessi delle funzioni classiche, agli errori si aggiungono però quelli dovuti a valori errati per \param{dirfd}; in particolare si avrà un errore di \errcode{EBADF} se esso non è un file -descriptor valido, ed un errore di \errcode{ENOTDIR} se esso non fa riferimento -ad una directory.\footnote{tranne il caso in cui si sia specificato un - pathname assoluto, nel qual caso, come detto, il valore di \param{dirfd} - sarà completamente ignorato.} +descriptor valido, ed un errore di \errcode{ENOTDIR} se esso non fa +riferimento ad una directory.\footnote{tranne il caso in cui si sia + specificato un \itindsub{pathname}{assoluto} \textit{pathname} assoluto, nel + qual caso, come detto, il valore di \param{dirfd} sarà completamente + ignorato.} In tab.~\ref{tab:file_atfunc_corr} si sono riportate le funzioni introdotte con questa nuova interfaccia, con a fianco la corrispondente funzione @@ -1266,6 +1272,8 @@ prevista anche l'aggiunta di un ulteriore argomento finale, \param{flags}. \footnotetext{in questo caso l'argomento \param{flags} è disponibile ed utilizzabile solo a partire dal kernel 2.6.18.} +% TODO manca prototipo di fchmodat + Per tutte le funzioni che lo prevedono, a parte \func{unlinkat} e \funcd{faccessat}, l'ulteriore argomento è stato introdotto solo per fornire un meccanismo con cui modificarne il comportamento nel caso si stia operando @@ -1292,8 +1300,8 @@ che \func{lchown}; il suo prototipo è: \begin{errlist} \item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido. \item[\errcode{EINVAL}] \param{flags} non ha un valore valido. - \item[\errcode{ENOTDIR}] \param{pathname} è un pathname relativo, ma - \param{dirfd} fa riferimento ad un file. + \item[\errcode{ENOTDIR}] \param{pathname} è un \itindsub{pathname}{relativo} + \textit{pathname} relativo, ma \param{dirfd} fa riferimento ad un file. \end{errlist}} \end{functions} @@ -1322,8 +1330,8 @@ il suo prototipo è: \begin{errlist} \item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido. \item[\errcode{EINVAL}] \param{flags} non ha un valore valido. - \item[\errcode{ENOTDIR}] \param{pathname} è un pathname relativo, ma - \param{dirfd} fa riferimento ad un file. + \item[\errcode{ENOTDIR}] \param{pathname} è un \itindsub{pathname}{relativo} + \textit{pathname} relativo, ma \param{dirfd} fa riferimento ad un file. \end{errlist}} \end{functions} @@ -1356,8 +1364,8 @@ prototipo è: \begin{errlist} \item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido. \item[\errcode{EINVAL}] \param{flags} non ha un valore valido. - \item[\errcode{ENOTDIR}] \param{pathname} è un pathname relativo, ma - \param{dirfd} fa riferimento ad un file. + \item[\errcode{ENOTDIR}] \param{pathname} è un \itindsub{pathname}{relativo} + \textit{pathname} relativo, ma \param{dirfd} fa riferimento ad un file. \end{errlist}} \end{functions} diff --git a/intro.tex b/intro.tex index 24e301d..117bebd 100644 --- a/intro.tex +++ b/intro.tex @@ -515,6 +515,8 @@ nomi che indicano le directory che lo compongono. Dato che la directory radice sta in cima all'albero, essa viene indicata semplicemente con il \textit{pathname} \file{/}. +\itindbeg{pathname!resolution} + Un file può essere indicato rispetto ad una directory semplicemente specificandone il nome, il manuale della \acr{glibc} chiama i nomi contenuti nelle directory \textsl{componenti} (in inglese \textit{file name @@ -550,14 +552,15 @@ corrente e il secondo alla directory \textsl{genitrice} (o \textit{parent directory}) cioè la directory che contiene il riferimento alla directory corrente. -In questo modo con ``\file{..}'' si può usare un \textsl{pathname relativo} -per indicare un file posto al di sopra della directory corrente, tornando -all'indietro nell'albero dei file. Questa retromarcia però su fermerà una -volta raggiunta la directory radice, perché non esistendo in questo caso una -directory superiore, il nome ``\file{..}'' farà riferimento alla radice -stessa. +In questo modo con ``\file{..}'' si può usare un \itindsub{pathname}{relativo} +pathname relativo per indicare un file posto al di sopra della directory +corrente, tornando all'indietro nell'albero dei file. Questa retromarcia però +su fermerà una volta raggiunta la directory radice, perché non esistendo in +questo caso una directory superiore, il nome ``\file{..}'' farà riferimento +alla radice stessa. \itindend{pathname} +\itindend{pathname!resolution} \subsection{I tipi di file} @@ -1376,9 +1379,9 @@ una opportuna macro; queste estensioni sono illustrate nel seguente elenco: \item[\macro{\_ATFILE\_SOURCE}] definendo questa macro si rendono disponibili le estensioni delle funzioni di creazione, accesso e modifica di file e - directory che risolvono i problemi di sicurezza insiti nell'uso di pathname - relativi con programmi \itindex{thread} \textit{multi-thread} illustrate in - sez.~\ref{sec:file_openat}. + directory che risolvono i problemi di sicurezza insiti nell'uso di + \textit{pathname} relativi con programmi \itindex{thread} + \textit{multi-thread} illustrate in sez.~\ref{sec:file_openat}. \item[\macro{\_REENTRANT}] definendo questa macro, o la equivalente \macro{\_THREAD\_SAFE} (fornita per compatibilità) si rendono disponibili le diff --git a/ipc.tex b/ipc.tex index 81ad3cf..e22736f 100644 --- a/ipc.tex +++ b/ipc.tex @@ -649,12 +649,12 @@ state raccolte nella libreria \file{libgapil.so}, per poter usare quest'ultima occorrerà definire la variabile di ambiente \envvar{LD\_LIBRARY\_PATH} in modo che il linker dinamico possa accedervi. -In generale questa variabile indica il \itindex{pathname} \textit{pathname} -della directory contenente la libreria. Nell'ipotesi (che daremo sempre per -verificata) che si facciano le prove direttamente nella directory dei sorgenti -(dove di norma vengono creati sia i programmi che la libreria), il comando da -dare sarà \code{export LD\_LIBRARY\_PATH=./}; a questo punto potremo lanciare -il server, facendogli leggere una decina di frasi, con: +In generale questa variabile indica il \textit{pathname} della directory +contenente la libreria. Nell'ipotesi (che daremo sempre per verificata) che si +facciano le prove direttamente nella directory dei sorgenti (dove di norma +vengono creati sia i programmi che la libreria), il comando da dare sarà +\code{export LD\_LIBRARY\_PATH=./}; a questo punto potremo lanciare il server, +facendogli leggere una decina di frasi, con: \begin{Verbatim} [piccardi@gont sources]$ ./fortuned -n10 \end{Verbatim} @@ -882,13 +882,13 @@ nome di un file ed un numero di versione; il suo prototipo è: \end{functions} La funzione determina un valore della chiave sulla base di \param{pathname}, -che deve specificare il \itindex{pathname} \textit{pathname} di un file -effettivamente esistente e di un numero di progetto \param{proj\_id)}, che di -norma viene specificato come carattere, dato che ne vengono utilizzati solo -gli 8 bit meno significativi.\footnote{nelle libc4 e libc5, come avviene in - SunOS, l'argomento \param{proj\_id} è dichiarato tipo \ctyp{char}, la - \acr{glibc} usa il prototipo specificato da XPG4, ma vengono lo stesso - utilizzati gli 8 bit meno significativi.} +che deve specificare il \textit{pathname} di un file effettivamente esistente +e di un numero di progetto \param{proj\_id)}, che di norma viene specificato +come carattere, dato che ne vengono utilizzati solo gli 8 bit meno +significativi.\footnote{nelle libc4 e libc5, come avviene in SunOS, + l'argomento \param{proj\_id} è dichiarato tipo \ctyp{char}, la \acr{glibc} + usa il prototipo specificato da XPG4, ma vengono lo stesso utilizzati gli 8 + bit meno significativi.} Il problema è che anche così non c'è la sicurezza che il valore della chiave sia univoco, infatti esso è costruito combinando il byte di \param{proj\_id)} @@ -3284,8 +3284,8 @@ possono avere o meno una corrispondenza sul filesystem; tutto quello che è richiesto è che: \begin{itemize*} \item i nomi devono essere conformi alle regole che caratterizzano i - \itindex{pathname} \textit{pathname}, in particolare non essere più lunghi di - \const{PATH\_MAX} byte e terminati da un carattere nullo. + \textit{pathname}, in particolare non essere più lunghi di \const{PATH\_MAX} + byte e terminati da un carattere nullo. \item se il nome inizia per una \texttt{/} chiamate differenti allo stesso nome fanno riferimento allo stesso oggetto, altrimenti l'interpretazione del nome dipende dall'implementazione. @@ -4018,12 +4018,12 @@ esistente o per crearne uno nuovi, i relativi prototipi sono: L'argomento \param{name} definisce il nome del semaforo che si vuole utilizzare, ed è quello che permette a processi diversi di accedere allo -stesso semaforo. Questo deve essere specificato con un pathname nella forma -\texttt{/qualchenome}, che non ha una corrispondenza diretta con un pathname -reale; con Linux infatti i file associati ai semafori sono mantenuti nel -filesystem virtuale \texttt{/dev/shm}, e gli viene assegnato automaticamente -un nome nella forma \texttt{sem.qualchenome}.\footnote{si ha cioè una - corrispondenza per cui \texttt{/qualchenome} viene rimappato, nella +stesso semaforo. Questo deve essere specificato con un \textit{pathname} nella +forma \texttt{/qualchenome}, che non ha una corrispondenza diretta con un +\textit{pathname} reale; con Linux infatti i file associati ai semafori sono +mantenuti nel filesystem virtuale \texttt{/dev/shm}, e gli viene assegnato +automaticamente un nome nella forma \texttt{sem.qualchenome}.\footnote{si ha + cioè una corrispondenza per cui \texttt{/qualchenome} viene rimappato, nella creazione tramite \func{sem\_open}, su \texttt{/dev/shm/sem.qualchenome}.} L'argomento \param{oflag} è quello che controlla le modalità con cui opera la diff --git a/macro.tex b/macro.tex index a952fca..3899480 100644 --- a/macro.tex +++ b/macro.tex @@ -220,6 +220,7 @@ \newcommand{\ids}[1]{\textsl{#1}} % Identifier (PID, GID, UID, TID, ecc.) \newcommand{\envvar}[1]{\texttt{#1}} % environment variable +\newcommand{\samplefunc}[1]{\texttt{#1}} % funzione degli esempi \newcommand{\itindex}[1]{% \index{#1@{\textit{#1}}}% diff --git a/process.tex b/process.tex index c7bbfb7..9f52a42 100644 --- a/process.tex +++ b/process.tex @@ -249,7 +249,7 @@ di quelli installati con il sistema,\footnote{in un sistema GNU/Linux che \textit{Filesystem Hierarchy Standard} (per maggiori informazioni si consulti sez.~1.2.3 di \cite{AGL}) si trovano sotto \texttt{/usr/include}.} o fra virgolette, nel qual caso si fa riferimento ad una versione locale, da -indicare con un pathname relativo: +indicare con un \itindsub{pathname}{relativo} \textit{pathname} relativo: \includecodesnip{listati/main_include.c} Si tenga presente che oltre ai nomi riservati a livello generale di cui si è @@ -2762,7 +2762,7 @@ permetterebbe di eseguire questi cambiamenti. \includecodesample{listati/endian.c} \end{minipage} \normalsize - \caption{La funzione \func{endian}, usata per controllare il tipo di + \caption{La funzione \samplefunc{endian}, usata per controllare il tipo di architettura della macchina.} \label{fig:sock_endian_code} \end{figure} diff --git a/prochand.tex b/prochand.tex index abe6f47..cb4c115 100644 --- a/prochand.tex +++ b/prochand.tex @@ -238,12 +238,12 @@ Il fatto che il \ids{PID} sia un numero univoco per il sistema lo rende un candidato per generare ulteriori indicatori associati al processo di cui diventa possibile garantire l'unicità: ad esempio in alcune implementazioni la funzione \func{tempnam} (si veda sez.~\ref{sec:file_temp_file}) usa il -\ids{PID} per generare un \itindex{pathname} \textit{pathname} univoco, che -non potrà essere replicato da un altro processo che usi la stessa -funzione. Questo utilizzo però può risultare pericoloso, un \ids{PID} infatti -è univoco solo fintanto che un processo è attivo, una volta terminato esso -potrà essere riutilizzato da un processo completamente diverso, e di questo -bisogna essere ben consapevoli. +\ids{PID} per generare un \textit{pathname} univoco, che non potrà essere +replicato da un altro processo che usi la stessa funzione. Questo utilizzo +però può risultare pericoloso, un \ids{PID} infatti è univoco solo fintanto +che un processo è attivo, una volta terminato esso potrà essere riutilizzato +da un processo completamente diverso, e di questo bisogna essere ben +consapevoli. Tutti i processi figli dello stesso processo padre sono detti \textit{sibling}, questa è una delle relazioni usate nel \textsl{controllo di @@ -1392,7 +1392,7 @@ prototipo è: \item[\errcode{EACCES}] il file o l'interprete non file ordinari, o non sono eseguibili, o il file è su un filesystem montato con l'opzione \cmd{noexec}, o manca il permesso di attraversamento di una delle - directory del pathname. + directory del \textit{pathname}. \item[\errcode{EINVAL}] l'eseguibile ELF ha più di un segmento \const{PF\_INTERP}, cioè chiede di essere eseguito da più di un interprete. @@ -1415,7 +1415,7 @@ prototipo è: \end{funcproto} La funzione \func{execve} esegue il programma o lo script indicato dal -pathname \param{filename}, passandogli la lista di argomenti indicata +\textit{pathname} \param{filename}, passandogli la lista di argomenti indicata da \param{argv} e come ambiente la lista di stringhe indicata da \param{envp}. Entrambe le liste devono essere terminate da un puntatore nullo. I vettori degli argomenti e dell'ambiente possono essere acceduti dal @@ -1522,7 +1522,7 @@ proseguita nelle eventuali ulteriori directory indicate in \envvar{PATH}; solo se non viene trovato nessun altro file viene finalmente restituito \errcode{EACCES}. Le altre quattro funzioni si limitano invece a cercare di eseguire il file indicato dall'argomento \param{path}, che viene interpretato -come il \itindex{pathname} \textit{pathname} del programma. +come il \textit{pathname} del programma. La terza differenza è come viene passata la lista delle variabili di ambiente. Con lo mnemonico ``\texttt{e}'' vengono indicate quelle funzioni che @@ -2211,7 +2211,7 @@ chiamata con un vettore di dimensioni adeguate. Infine per impostare i gruppi supplementari di un processo ci sono due funzioni, che possono essere usate solo se si hanno i privilegi di -amministratore.\footnote{e più precisamente se si ha la \itindex{capability} +amministratore.\footnote{e più precisamente se si ha la \itindex{capabilities} \textit{capability} \macro{CAP\_SETGID}.} La prima delle due è \funcd{setgroups},\footnote{la funzione è definita in BSD e SRv4, ma a differenza di \func{getgroups} non è stata inclusa in POSIX.1-2001, per diff --git a/session.tex b/session.tex index ced82eb..cf880e5 100644 --- a/session.tex +++ b/session.tex @@ -1380,10 +1380,10 @@ deve essere di almeno \const{L\_ctermid}\footnote{\const{L\_ctermid} è una sez.~\ref{sec:sys_characteristics} che indica la dimensione che deve avere una stringa per poter contenere il nome di un terminale.} caratteri. -Si tenga presente che il \itindex{pathname} \textit{pathname} restituito dalla -funzione potrebbe non identificare univocamente il terminale (ad esempio -potrebbe essere \file{/dev/tty}), inoltre non è detto che il processo possa -effettivamente essere in grado di aprire il terminale. +Si tenga presente che il \textit{pathname} restituito dalla funzione potrebbe +non identificare univocamente il terminale (ad esempio potrebbe essere +\file{/dev/tty}), inoltre non è detto che il processo possa effettivamente +essere in grado di aprire il terminale. I vari attributi associati ad un terminale vengono mantenuti per ciascuno di essi in una struttura \struct{termios} che viene usata dalle varie funzioni diff --git a/signal.tex b/signal.tex index 456c4a2..75bcbac 100644 --- a/signal.tex +++ b/signal.tex @@ -2881,8 +2881,8 @@ l'orologio associato ad un \textit{thread} invece che a un processo, è } \end{functions} - % TODO, dal 2.6.39 aggiunta clock_adjtime +% TODO manca clock_nanosleep Con l'introduzione degli orologi ad alta risoluzione è divenuto possibile ottenere anche una gestione più avanzata degli allarmi; abbiamo già visto in diff --git a/socket.tex b/socket.tex index 58a18a5..9f1feb6 100644 --- a/socket.tex +++ b/socket.tex @@ -561,9 +561,9 @@ il campo \var{sun\_path} deve specificare un indirizzo. Questo ha due forme; può essere un file (di tipo socket) nel filesystem o una stringa univoca (mantenuta in uno spazio di nomi astratto). Nel primo caso l'indirizzo viene specificato come una stringa (terminata da uno zero) corrispondente al -\itindex{pathname} \textit{pathname} del file; nel secondo invece -\var{sun\_path} inizia con uno zero e vengono usati come nome i restanti byte -come stringa, senza terminazione. +\textit{pathname} del file; nel secondo invece \var{sun\_path} inizia con uno +zero e vengono usati come nome i restanti byte come stringa, senza +terminazione. \subsection{La struttura degli indirizzi AppleTalk} diff --git a/system.tex b/system.tex index 77a866a..7589160 100644 --- a/system.tex +++ b/system.tex @@ -403,8 +403,7 @@ riportate in tab.~\ref{tab:sys_file_macro}. \hline \const{LINK\_MAX} &8 & Numero massimo di link a un file.\\ \const{NAME\_MAX}& 14 & Lunghezza in byte di un nome di file. \\ - \const{PATH\_MAX}& 256 & Lunghezza in byte di un - \itindex{pathname} \textit{pathname}.\\ + \const{PATH\_MAX}& 256 & Lunghezza in byte di un \textit{pathname}.\\ \const{PIPE\_BUF}&4096 & Byte scrivibili atomicamente in una pipe (vedi sez.~\ref{sec:ipc_pipes}).\\ \const{MAX\_CANON}&255 & Dimensione di una riga di terminale in modo @@ -435,7 +434,7 @@ le analoghe di tab.~\ref{tab:sys_posix1_general}. \const{\_POSIX\_LINK\_MAX} &8 & Numero massimo di link a un file.\\ \const{\_POSIX\_NAME\_MAX}& 14 & Lunghezza in byte di un nome di file.\\ \const{\_POSIX\_PATH\_MAX}& 256 & Lunghezza in byte di un - \itindex{pathname} \textit{pathname}.\\ + \textit{pathname}.\\ \const{\_POSIX\_PIPE\_BUF}& 512 & Byte scrivibili atomicamente in una pipe.\\ \const{\_POSIX\_MAX\_CANON}&255 & Dimensione di una riga di @@ -478,13 +477,13 @@ E si noti come la funzione in questo caso richieda un argomento che specifichi a quale file si fa riferimento, dato che il valore del limite cercato può variare a seconda del filesystem. Una seconda versione della funzione, \funcd{fpathconf}, opera su un file descriptor invece che su un -\itindex{pathname} \textit{pathname}. Il suo prototipo è: +\textit{pathname}. Il suo prototipo è: \begin{prototype}{unistd.h}{long fpathconf(int fd, int name)} Restituisce il valore del parametro \param{name} per il file \param{fd}. \bodydesc{È identica a \func{pathconf} solo che utilizza un file descriptor - invece di un \itindex{pathname} \textit{pathname}; pertanto gli errori - restituiti cambiano di conseguenza.} + invece di un \textit{pathname}; pertanto gli errori restituiti cambiano di + conseguenza.} \end{prototype} \noindent ed il suo comportamento è identico a quello di \func{pathconf}. @@ -603,8 +602,8 @@ maniera gerarchica all'interno di un albero;\footnote{si tenga presente che di Linux occorrerà includere anche i file \file{linux/unistd.h} e \file{linux/sysctl.h}.} per accedere ad uno di essi occorre specificare un cammino attraverso i vari nodi dell'albero, in maniera analoga a come avviene -per la risoluzione di un \itindex{pathname} \textit{pathname} (da cui l'uso -alternativo del filesystem \file{/proc}, che vedremo dopo). +per la risoluzione di un \textit{pathname} (da cui l'uso alternativo del +filesystem \file{/proc}, che vedremo dopo). Ciascun nodo dell'albero è identificato da un valore intero, ed il cammino che arriva ad identificare un parametro specifico è passato alla funzione @@ -647,9 +646,9 @@ 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 -specificando un \itindex{pathname} \textit{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 +specificando un \textit{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 navigazione dell'albero dei valori. @@ -898,6 +897,8 @@ file di \textsl{registro} di utenti e gruppi, con il formato classico di \label{tab:sys_passwd_func} \end{table} +% TODO mancano i prototipi di alcune delle funzioni + 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 \conffile{/etc/passwd}), si tenga presente che le @@ -1548,10 +1549,10 @@ prototipo è: \errval{ENOTDIR}, \errval{EROFS}.} \end{prototype} -La funzione attiva il salvataggio dei dati sul file indicato dal pathname -contenuti nella stringa puntata da \param{filename}; la funzione richiede che -il processo abbia i privilegi di amministratore (è necessaria la -\itindex{capabilities} capability \const{CAP\_SYS\_PACCT}, vedi +La funzione attiva il salvataggio dei dati sul file indicato dal +\textit{pathname} contenuti nella stringa puntata da \param{filename}; la +funzione richiede che il processo abbia i privilegi di amministratore (è +necessaria la \itindex{capabilities} capability \const{CAP\_SYS\_PACCT}, vedi sez.~\ref{sec:proc_capabilities}). Se si specifica il valore \val{NULL} per \param{filename} il \textit{BSD accounting} viene invece disabilitato. Un semplice esempio per l'uso di questa funzione è riportato nel programma diff --git a/tcpsock.tex b/tcpsock.tex index 3786c86..9961dd7 100644 --- a/tcpsock.tex +++ b/tcpsock.tex @@ -3576,7 +3576,7 @@ sez.~\ref{sec:TCP_serv_select}. -\subsection{I/O multiplexing con \func{epoll}} +\subsection{I/O multiplexing con \textit{epoll}} \label{sec:TCP_serv_epoll} Da fare.