X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileio.tex;h=3d16c0758073faecb3707c10019370ccb82aa6c3;hp=b1e84f8e7b8f86ef64064010f142fd9d5492ae8b;hb=d44259cffb0d41ed62ec80f7d653bd7606894866;hpb=5d7fe3ee9e2509853d2d06902b6b503680135641 diff --git a/fileio.tex b/fileio.tex index b1e84f8..3d16c07 100644 --- a/fileio.tex +++ b/fileio.tex @@ -12,7 +12,7 @@ \chapter{La gestione dell'I/O su file} \label{cha:file_IO_interface} -Esamineremo in questo capitol le due interfacce di programmazione che +Esamineremo in questo capitolo le due interfacce di programmazione che consentono di gestire i dati mantenuti nei file. Cominceremo con quella nativa del sistema, detta dei \textit{file descriptor}, che viene fornita direttamente dalle \textit{system call} e che non prevede funzionalità evolute @@ -1694,6 +1694,13 @@ tab.~\ref{tab:file_atfunc_corr}, oltre al nuovo argomento iniziale, è prevista anche l'aggiunta di un ulteriore argomento finale, \param{flags}. + + +% TODO trattare fstatat e con essa +% TODO trattare anche statx, aggiunta con il kernel 4.11 (vedi +% https://lwn.net/Articles/707602/ e +% https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a528d35e8bfcc521d7cb70aaf03e1bd296c8493f) + % TODO manca prototipo di linkat, verificare se metterlo o metter menzione % altre modifiche al riguardo nel 3.11 (AT_EMPTY_PATH?) vedi % http://lwn.net/Articles/562488/ @@ -1856,15 +1863,88 @@ costanti utilizzabili per i valori di \param{flags}. \end{table} +\texttt{ATTENZIONE PARTE DA RIVEDERE} + + Un'ultima differenza fra le \textit{at-functions} e le funzioni tradizionali di cui sono estensione è, come accennato in sez.~\ref{sec:file_temp_file}, quella relativa a \func{utimensat} che non è propriamente una corrispondente esatta di \func{utimes} e \func{lutimes}, dato che questa funzione ha una maggiore precisione nella indicazione dei tempi dei file, per i quali come per \func{futimes}, si devono usare strutture \struct{timespec} che consentono una -precisione fino al nanosecondo. +precisione fino al nanosecondo; la funzione è stata introdotta con il kernel +2.6.22,\footnote{in precedenza, a partire dal kernel 2.6.16, era stata + introdotta una \textit{system call} \funcm{futimesat} seguendo una bozza + della revisione dello standard poi modificata; questa funzione, sostituita + da \func{utimensat}, è stata dichiarata obsoleta, non è supportata da + nessuno standard e non deve essere più utilizzata: pertanto non ne + parleremo.} ed il suo prototipo è: + +\begin{funcproto}{ +\fhead{sys/time.h} +\fdecl{int utimensat(int dirfd, const char *pathname, const struct + timespec times[2], int flags)} +\fdesc{Cambia i tempi di un file.} +} + +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual + caso \var{errno} assumerà uno dei valori: + \begin{errlist} + \item[\errcode{EACCES}] si è richiesta l'impostazione del tempo corrente ma + non si ha il permesso di scrittura sul file, o non si è proprietari del + file o non si hanno i privilegi di amministratore; oppure il file è + immutabile (vedi sez.~\ref{sec:file_perm_overview}). + \item[\errcode{EBADF}] \param{dirfd} non è \const{AT\_FDCWD} o un file + descriptor valido. + \item[\errcode{EFAULT}] \param{times} non è un puntatore valido oppure + \param{dirfd} è \const{AT\_FDCWD} ma \param{pathname} è \var{NULL} o non è + un puntatore valido. + \item[\errcode{EINVAL}] si sono usati dei valori non corretti per i tempi di + \param{times}, oppure è si usato un valore non valido per \param{flags}, + oppure \param{pathname} è \var{NULL}, \param{dirfd} non è + \const{AT\_FDCWD} e \param{flags} contiene \const{AT\_SYMLINK\_NOFOLLOW}. + \item[\errcode{EPERM}] si è richiesto un cambiamento nei tempi non al tempo + corrente, ma non si è proprietari del file o non si hanno i privilegi di + amministratore; oppure il file è immutabile o \textit{append-only} (vedi + sez.~\ref{sec:file_perm_overview}). + \item[\errcode{ESRCH}] non c'è il permesso di attraversamento per una delle + componenti di \param{pathname}. + \end{errlist} + ed inoltre per entrambe \errval{EROFS} e per \func{utimensat} + \errval{ELOOP}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOTDIR} nel + loro significato generico.} +\end{funcproto} + +La funzione imposta i tempi dei file utilizzando i valori passati nel vettore +di strutture \struct{timespec} esattamente come \func{futimes} (si veda quanto +illustrato in sez.~\ref{sec:file_file_times}). + +La funzione supporta invece, rispetto ad \func{utimes} che abbiamo visto in +sez.~\ref{sec:file_file_times}, una sintassi più complessa che consente una +indicazione sicura del file su cui operare specificando la directory su cui si +trova tramite il file descriptor \param{dirfd} ed il suo nome come +\textit{pathname relativo} in \param{pathname}.\footnote{su Linux solo + \func{utimensat} è una \textit{system call} e \func{futimens} è una funzione + di libreria, infatti se \param{pathname} è \var{NULL} \param{dirfd} viene + considerato un file descriptor ordinario e il cambiamento del tempo + applicato al file sottostante, qualunque esso sia, per cui + \code{futimens(fd, times}) è del tutto equivalente a \code{utimensat(fd, + NULL, times, 0)} ma nella \acr{glibc} questo comportamento è disabilitato + seguendo lo standard POSIX, e la funzione ritorna un errore di + \errval{EINVAL} se invocata in questo modo.} + +Torneremo su questa sintassi e sulla sua motivazione in +sez.~\ref{sec:file_openat}, quando tratteremo tutte le altre funzioni (le +cosiddette \textit{at-functions}) che la utilizzano; essa prevede comunque +anche la presenza dell'argomento \param{flags} con cui attivare flag di +controllo che modificano il comportamento della funzione, nel caso specifico +l'unico valore consentito è \const{AT\_SYMLINK\_NOFOLLOW} che indica alla +funzione di non dereferenziare i collegamenti simbolici, cosa che le permette +di riprodurre le funzionalità di \func{lutimes}. + + +\texttt{ATTENZIONE PARTE DA RIVEDERE} -% NOTA: manca prototipo di utimensat, per ora si lascia una menzione \itindend{at-functions} @@ -4249,9 +4329,11 @@ con uno dei valori \const{FSETLOCKING\_INTERNAL} o % LocalWords: FIONREAD epoll FIOQSIZE side effects SAFE BYCALLER QUERY EACCES % LocalWords: EBUSY OpenBSD syncfs futimes timespec only init ESRCH kill NTPL % LocalWords: ENXIO NONBLOCK WRONLY EPERM NOATIME ETXTBSY EWOULDBLOCK PGRP SZ -% LocalWords: EFAULT capabilities GETPIPE SETPIPE RESOURCE +% LocalWords: EFAULT capabilities GETPIPE SETPIPE RESOURCE dell'I all' NFSv %%% Local Variables: %%% mode: latex %%% TeX-master: "gapil" %%% End: +% LocalWords: l'I nell' du vm Documentation Urlich Drepper futimesat times +% LocalWords: futimens fs Tread all'I ll