From 286141fde547952a89ec485ce6b85948167ee0ed Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Fri, 31 Aug 2018 21:56:20 +0200 Subject: [PATCH] Correzioni --- filedir.tex | 128 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 78 insertions(+), 50 deletions(-) diff --git a/filedir.tex b/filedir.tex index 622a716..cdbb7c1 100644 --- a/filedir.tex +++ b/filedir.tex @@ -2700,7 +2700,7 @@ A partire dal kernel Linux 2.6.36 il nome può avere come prefisso la stringa \texttt{(unreachable)} se la directory di lavoro resta fuori dalla directory radice del processo dopo un \func{chroot} (torneremo su questi argomenti in sez.~\ref{sec:file_chroot}); pertanto è sempre opportuno controllare il primo -carattere della stringa restituita dalla funzione per evitare di interpreare +carattere della stringa restituita dalla funzione per evitare di interpretare mare un \textit{pathname} irraggiungibile. Come estensione allo standard POSIX.1, supportata da Linux e dalla @@ -3174,7 +3174,7 @@ specificamente dalla \acr{glibc},\footnote{la funzione è stata introdotta vedremo in sez.~\ref{sec:file_open_close}) da passare ad \func{open} nell'apertura del file.\footnote{si tenga presente che \func{mkostemp} utilizza già \const{O\_CREAT}, \const{O\_EXCL} e \const{O\_RDWR}, che non è - il caso di reindicare, dato che ciò potrebbe portare ad errori in altri + il caso di riindicare, dato che ciò potrebbe portare ad errori in altri sistemi operativi.} Di queste due funzioni sono state poi introdotte, a partire dalla \acr{glibc} @@ -3342,20 +3342,22 @@ struttura \struct{stat},\footnote{questo ha significato l'utilizzo a basso in particolare a riguardo ai tempi dei file, di cui è stata aumentata la precisione (torneremo su questo in sez.~\ref{sec:file_file_times}) ma anche per gli aggiornamenti fatti ai campi \var{st\_ino}, \var{st\_uid} e -\var{st\_gid}. Sulle piattaforme a 32 bit questi cambiamenti, che han visto un -aumento delle dimensioni dei campi della struttura per adattarli alle nuove -esigenze, sono mascherati dalla \acr{glibc} che attraverso \func{stat} invoca -la versione più recente della \textit{system call} e reimpacchetta i dati se -questo è necessario per eseguire dei vecchi programmi. Nelle piattaforme a 64 -bit invece è presente un'unica versione della \textit{system call} e la -struttura \struct{stat} ha campi di dimensione sufficiente. - -Infine a partire dal kernel 2.6.16 è stata introdutta una ulteriore funzione +\var{st\_gid}. + +Sulle piattaforme a 32 bit questi cambiamenti, che han visto un aumento delle +dimensioni dei campi della struttura per adattarli alle nuove esigenze, sono +mascherati dalla \acr{glibc} che attraverso \func{stat} invoca la versione più +recente della \textit{system call} e rimpacchetta i dati se questo è +necessario per eseguire dei vecchi programmi. Nelle piattaforme a 64 bit +invece è presente un'unica versione della \textit{system call} e la struttura +\struct{stat} ha campi di dimensione sufficiente. + +Infine a partire dal kernel 2.6.16 è stata introdotta una ulteriore funzione della famiglia, \func{fstatat} che consente di trattare con sicurezza i \textit{pathname} relativi, la tratteremo in sez.~\ref{sec:file_openat}, insieme alla nuova \textit{system call} \func{statx}, introdotta dal kernel 4.11 per estendere l'interfaccia di \func{stat} e le informazioni che essa può -restituire. +restituire. \subsection{I tipi di file} @@ -3512,9 +3514,9 @@ l'argomento in sez.~\ref{sec:file_lseek}). In questo caso si avranno risultati differenti a seconda del modo in cui si calcola la lunghezza del file, ad esempio il comando \cmd{du}, (che riporta il numero di blocchi occupati) potrà dare una dimensione inferiore, mentre se si -legge dal file (ad esempio usando il comando \cmd{wc -c}), dato che in tal -caso per i ``\textsl{buchi}'' vengono restituiti degli zeri, si avrà lo stesso -risultato di \cmd{ls}. +legge il contenuto del file (ad esempio usando il comando \cmd{wc -c}), dato +che in tal caso per i ``\textsl{buchi}'' vengono restituiti degli zeri, si +avrà lo stesso risultato di \cmd{ls}. Se è sempre possibile allargare un file, scrivendoci sopra o usando la funzione \func{lseek} (vedi sez.~\ref{sec:file_lseek}) per spostarsi oltre la @@ -3633,10 +3635,15 @@ Il sistema non tiene mai conto dell'ultimo accesso all'\textit{inode}, pertanto funzioni come \func{access} o \func{stat} non hanno alcuna influenza sui tre tempi. Il comando \cmd{ls} (quando usato con le opzioni \cmd{-l} o \cmd{-t}) mostra i tempi dei file secondo lo schema riportato nell'ultima -colonna di tab.~\ref{tab:file_file_times}. Si noti anche come non esista, a -differenza di altri sistemi operativi, un \textsl{tempo di creazione} di un -file, anche se vari filesystem lo supportano e dal kernel 4.11 è ottenibile -con la funzione \func{statx} (vedi sez.~\ref{sec:file_openat}). +colonna di tab.~\ref{tab:file_file_times}. Si noti anche come in +tab.~\ref{tab:file_file_times} non venga riportato il \textsl{tempo di + creazione} di un file. In un sistema unix-like infatti questo tempo +tradizionalmente non esiste, e non è previsto dall'interfaccia classica, ma è +usato da altri sistemi operativi (in particolare Windows) per cui in tutti i +filesystem più recenti ne viene supportata la registrazione, ed a partire dal +kernel 4.11 è divento possibile anche ottenerne la lettura con la nuova +\textit{system call} \func{statx} (che tratteremo in +sez.~\ref{sec:file_openat}). L'aggiornamento del tempo di ultimo accesso è stato a lungo considerato un difetto progettuale di Unix, questo infatti comporta la necessità di @@ -3646,24 +3653,26 @@ accesso in lettura sui dati bufferizzati. Questo comporta un ovvio costo sia in termini di prestazioni, che di consumo di risorse come la batteria per i portatili, o i cicli di riscrittura per i dischi su memorie riscrivibili. -Per questo motivo abbiamo visto in sez.~\ref{sec:filesystem_mounting} come -nello sviluppo del siano stati introdotti degli opportuni \textit{mount flag} -che consentono di evitare di aggiornare continuamente una informazione che -nella maggior parte dei casi non interessa. Per questo i valori -dell'\textit{access time} possono dipendere dalle opzioni di montaggio, ed -anche, essendo stato cambiato il comportamento di default a partire dalla -versione 2.6.30, dal kernel che si sta usando. - -In generale quello che si ha con i kernel più recenti è che il tempo di ultimo -accesso viene aggiornato solo se è precedente al tempo di ultima modifica o -cambiamento, o se è passato più di un giorno dall'ultimo accesso. Così si può -rendere evidente che vi è stato un accesso dopo una modifica e che il file -viene comunque osservato regolarmente, conservando le informazioni veramente -utili senza consumare risorse in scritture continue per mantenere -costantemente aggiornata una informazione che a questo punto non ha più -nessuna rilevanza pratica.\footnote{qualora ce ne fosse la necessità è - comunque possibile, tramite l'opzione di montaggio \texttt{strictatime}, - richiedere in ogni caso il comportamento tradizionale.} +Per questo motivo abbiamo visto in sez.~\ref{sec:filesystem_mounting} come nel +corso dello sviluppo del kernel siano stati introdotti degli opportuni +\textit{mount flag} che consentono di evitare di aggiornare continuamente una +informazione che nella maggior parte dei casi non ha un interesse +rilevante. Per questo motivo i valori dell'\textit{access time} possono +dipendere dalle opzioni di montaggio, ed anche, essendo stato cambiato il +comportamento di default a partire dalla versione 2.6.30, dal kernel che si +sta usando. + +In generale quello che avviene con i kernel più recenti è che il tempo di +ultimo accesso viene aggiornato solo se è precedente al tempo di ultima +modifica o cambiamento, o se è cambiato ed passato più di un giorno +dall'ultimo aggiornamento. Così si può rendere evidente che vi è stato un +accesso dopo una modifica, e che il file viene comunque osservato a cadenza +regolare, conservando le informazioni veramente utili senza consumare +inutilmente risorse in continue scritture per mantenere costantemente +aggiornata una informazione che a questo punto non ha più nessuna rilevanza +pratica.\footnote{qualora ce ne fosse la necessità è comunque possibile, + tramite l'opzione di montaggio \texttt{strictatime}, richiedere in ogni caso + il comportamento tradizionale.} \begin{table}[htb] \centering @@ -3883,30 +3892,47 @@ puntatore nullo di nuovo verrà utilizzato il tempo corrente. \label{fig:sys_timeval_struct} \end{figure} -Oltre ad \func{utimes} su Linux sono presenti altre due funzioni,\footnote{le - due funzioni non sono definite in nessuno standard, ma sono presenti, oltre - che su Linux, anche su BSD.} \funcd{futimes} e \funcd{lutimes}, che -consentono rispettivamente di effettuare la modifica utilizzando un file già -aperto o di eseguirla direttamente su un collegamento simbolico. I relativi -prototipi sono: + + + +Oltre ad \func{utimes} su Linux sono presenti altre due funzioni per la +manipolazione dei tempi dei file,\footnote{le due funzioni non sono definite + in nessuno standard, ma sono presenti, oltre che su Linux, anche su BSD; + sono accessibili definendo \macro{\_DEFAULT\_SOURCE} dalla \acr{glibc} 2.19 + o \macro{\_GNU\_SOURCE} prima.} la prima è \funcd{futimes} e consente di +effettuare la modifica utilizzando un file già aperto, il suo prototipo è: \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.} -\fdecl{int lutimes(const char *filename, const struct timeval tv[2])} -\fdesc{Cambia i tempi di un collegamento simbolico.} } -{Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual - caso \var{errno} assumerà uno gli stessi valori di \func{utimes}, con in più - per \func{futimes}: +{La funzione ritornano $0$ in caso di successo e $-1$ per un errore, nel qual + caso \var{errno} assumerà uno gli stessi valori di \func{utimes} ed inoltre: \begin{errlist} \item[\errcode{EBADF}] \param{fd} non è un file descriptor. \item[\errcode{ENOSYS}] il filesystem \texttt{/proc} non è accessibile. \end{errlist}} \end{funcproto} +La seconda funzione, introdotta a partire dal kernel 2.6.22, è +\funcd{lutimes}, e consente rispettivamente di modificare i tempi di un +collegamento simbolico; il suo prototipo è: + +\begin{funcproto}{ +\fhead{sys/time.h} +\fdecl{int lutimes(const char *filename, const struct timeval tv[2])} +\fdesc{Cambia i tempi di un collegamento simbolico.} +} + +{La funzione ritornano $0$ in caso di successo e $-1$ per un errore, nel qual + caso \var{errno} assumerà uno gli stessi valori di \func{utimes}, con in più: + \begin{errlist} + \item[\errcode{ENOSYS}] la funzione non è supportata. + \end{errlist}} +\end{funcproto} + Le due funzioni hanno lo stesso comportamento di \texttt{utimes} e richiedono gli stessi privilegi per poter operare, la differenza è che con \func{futimes} si può indicare il file su cui operare se questo è già aperto facendo @@ -6737,10 +6763,12 @@ librerie) di cui il server potrebbe avere bisogno. % LocalWords: setmntent getmntent addmntent endmntent hasmntopt such offsetof % LocalWords: member scan attack EOVERFLOW BITS blkcnt rdev FDCWD functions % LocalWords: faccessat grpid lacl AppArmor capsetp mygetfacl table Tb MSK -% LocalWords: LAZYTIME submount peer protected hardlink symlinks silly +% LocalWords: LAZYTIME submount peer protected hardlink symlinks silly RDWR %%% Local Variables: %%% mode: latex %%% TeX-master: "gapil" %%% End: -% LocalWords: renames +% LocalWords: renames unreachable CLOEXEC mkstemps mkostemps suffixlen Aug +% LocalWords: prefissoXXXXXXsuffisso nell'I fstatat statx sull' drwxrwxrwt +% LocalWords: Disalloca -- 2.30.2