\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
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}
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}
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
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
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
\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
% 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