From 6271cd1b0cc4d403753d1f48d3d562b16db7e613 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sun, 21 Jun 2009 18:59:32 +0000 Subject: [PATCH] Spostamento delle strutture timeval e timespec e completamento delle funzioni di impostazione dei tempi dei file, modifica dei riferimenti, correzioni sui permessi, risistemazione della parte sulle 'at'-functions. --- fileadv.tex | 2 +- filedir.tex | 311 ++++++++++++++++++++++++++++++++------------- fileunix.tex | 237 +++++++++++++++++++++------------- intro.tex | 12 +- ipc.tex | 2 +- listati/timespec.h | 4 + listati/timeval.h | 8 +- process.tex | 13 +- signal.tex | 4 +- system.tex | 39 +++--- 10 files changed, 411 insertions(+), 221 deletions(-) create mode 100644 listati/timespec.h diff --git a/fileadv.tex b/fileadv.tex index 10c9588..42458e9 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -277,7 +277,7 @@ precedenti, ed inoltre aggiunge a \func{select} una nuova funzione \end{prototype} La funzione è sostanzialmente identica a \func{select}, solo che usa una -struttura \struct{timespec} (vedi fig.~\ref{fig:sys_timeval_struct}) per +struttura \struct{timespec} (vedi fig.~\ref{fig:sys_timespec_struct}) per indicare con maggiore precisione il timeout e non ne aggiorna il valore in caso di interruzione.\footnote{in realtà la system call di Linux aggiorna il valore al tempo rimanente, ma la funzione fornita dalle \acr{glibc} modifica diff --git a/filedir.tex b/filedir.tex index 7c9beee..04a8d1d 100644 --- a/filedir.tex +++ b/filedir.tex @@ -1741,7 +1741,9 @@ possono essere letti tramite la funzione \func{stat}, che li restituisce attraverso tre campi della struttura \struct{stat} di fig.~\ref{fig:file_stat_struct}. Il significato di detti tempi e dei relativi campi è riportato nello schema in tab.~\ref{tab:file_file_times}, dove è anche -riportato un esempio delle funzioni che effettuano cambiamenti su di essi. +riportato un esempio delle funzioni che effettuano cambiamenti su di essi. Il +valore è espresso nel cosiddetto \itindex{calendar~time} \textit{calendar + time}, su cui torneremo in dettaglio in sez.~\ref{sec:sys_time}. \begin{table}[htb] \centering @@ -1801,14 +1803,14 @@ maggior parte dei casi non interessa, l'aggiornamento del tempo di ultimo accesso con l'opzione di montaggio \texttt{noatime}. Dato però che questo può creare problemi a qualche programma, in Linux è stata introdotta la opzione \texttt{relatime} che esegue -l'aggiornamnto soltanto se il tempo di ultimo accesso è precedente al tempo di -ultima modifica o cambiamneto, così da rendere evidente che vi è stato un +l'aggiornamento soltanto se il tempo di ultimo accesso è precedente al tempo di +ultima modifica o cambiamento, così da rendere evidente che vi è stato un accesso dopo la scrittura, ed evitando al contempo ulteriori operazioni su disco negli accessi successivi. In questo modo l'informazione relativa al fatto che un file sia stato letto resta disponibile, e ad esempio i programmi citati in precedenza continuano a funzionare. Questa opzione, a partire dal kernel 2.6.30, è diventata il comportamento di default e non deve più essere -specificata esplicitamente.\footnote{si può comunque riottere il vecchio +specificata esplicitamente.\footnote{si può comunque riottenere il vecchio comportamento usando la opzione di montaggio \texttt{strictatime}.} L'effetto delle varie funzioni di manipolazione dei file sui relativi tempi è @@ -1915,19 +1917,20 @@ avr I tempi di ultimo accesso e modifica possono essere modificati esplicitamente usando la funzione \funcd{utime}, il cui prototipo è: \begin{prototype}{utime.h} -{int utime(const char *filename, struct utimbuf *times)} + {int utime(const char *filename, struct utimbuf *times)} -Cambia i tempi di ultimo accesso e modifica \itindex{inode} -dell'\textit{inode} specificato da \param{filename} secondo i campi -\var{actime} e \var{modtime} di \param{times}. Se questa è \val{NULL} allora -viene usato il tempo corrente. + Cambia i tempi di ultimo accesso e modifica \itindex{inode} + dell'\textit{inode} specificato da \param{filename} secondo i valori dei + campi \var{actime} e \var{modtime} di \param{times}. Se questa è \val{NULL} + allora viene usato il tempo corrente. -\bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di - errore, nel qual caso \var{errno} assumerà uno dei valori: - \begin{errlist} - \item[\errcode{EACCES}] non si ha il permesso di scrittura sul file. - \item[\errcode{ENOENT}] \param{filename} non esiste. - \end{errlist}} + \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di + errore, nel qual caso \var{errno} assumerà uno dei valori: + \begin{errlist} + \item[\errcode{EACCES}] non si ha il permesso di scrittura sul file. + \item[\errcode{EPERM}] non si è proprietari del file. + \end{errlist} + ed inoltre \errval{EROFS} e \errval{ENOENT}.} \end{prototype} La funzione prende come argomento \param{times} una struttura @@ -1976,25 +1979,144 @@ saranno nulli. Per la gestione di questi nuovi valori è stata definita una seconda funzione di modifica, \funcd{utimes}, che consente di specificare tempi con maggior precisione; il suo prototipo è: -\begin{prototype}{utime.h} -{int utimes(const char *filename, struct timeval times[2])} +\begin{prototype} + {sys/time.h} + {int utimes(const char *filename, struct timeval times[2])} + + Cambia i tempi di ultimo accesso e modifica \itindex{inode} + dell'\textit{inode} specificato da \param{filename} secondo i valori + specificati da \param{times}. Se questo è \val{NULL} allora viene usato il + tempo corrente. + + \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di + errore, nel qual caso \var{errno} assumerà uno dei valori: + \begin{errlist} + \item[\errcode{EACCES}] non si ha il permesso di scrittura sul file. + \item[\errcode{EPERM}] non si è proprietari del file. + \end{errlist} + ed inoltre \errval{EROFS} e \errval{ENOENT}.} +\end{prototype} + +La funzione è del tutto analoga alla precedente \func{utime} ma usa come +argomento \param{times}, un vettore di due strutture \struct{timeval}, la cui +definizione è riportata in fig.~\ref{fig:sys_timeval_struct}, che consentono +di indicare i tempi con una precisione del microsecondo. Il primo elemento +di \param{times} indica il valore per il tempo di ultimo accesso, il secondo +quello per il tempo di ultima modifica. + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includestruct{listati/timeval.h} + \end{minipage} + \normalsize + \caption{La struttura \structd{timeval} usata per indicare valori di tempo + con la precisione del microsecondo.} + \label{fig:sys_timeval_struct} +\end{figure} -Cambia i tempi di ultimo accesso e modifica \itindex{inode} -dell'\textit{inode} specificato da \param{filename} secondo i valori -specificati da \param{times}. Se questo è \val{NULL} allora viene usato il -tempo corrente. +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 link simbolico. I relativi +prototipi sono: +\begin{functions} + \headdecl{sys/time.h} + + \funcdecl{int futimes(int fd, const struct timeval tv[2])} Cambia i tempi + di un file già aperto specificato tramite il file descriptor \param{fd}. -\bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di - errore, nel qual caso \var{errno} assumerà uno dei valori: + \funcdecl{int lutimes(const char *filename, const struct timeval tv[2])} + Cambia i tempi di \param{filename} anche se questo è un link simbolico. + + + \bodydesc{Le funzioni restituiscono zero in caso di successo e $-1$ per un + errore, nel qual caso \var{errno} assumerà gli stessi valori di + \func{utimes}, con in più per \func{futimes}: \begin{errlist} - \item[\errcode{EACCES}] non si ha il permesso di scrittura sul file. - \item[\errcode{ENOENT}] \param{filename} non esiste. + \item[\errcode{EBADF}] \param{fd} non è un file descriptor. + \item[\errcode{ENOSYS}] il filesystem \texttt{/proc} non è accessibile. \end{errlist}} -\end{prototype} +\end{functions} -La funzione usa +Le due funzioni anno 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 facendo riferimento al relativo file +descriptor (tratteremo in dettaglio l'argomento in +sez.~\ref{cha:file_unix_interface}) mentre con \func{lutimes} nel caso in +cui \param{filename} sia un link simbolico saranno modificati i suoi tempi +invece di quelli del file a cui esso punta. + +Nonostante il kernel, come accennato, supporti risoluzioni dei tempi dei file +fino al nanosecondo, le funzioni fin qui esaminate non consentono di impostare +valori con questa precisione. Per questo sono state introdotte due nuove +funzioni, \funcd{futimens} e \func{utimensat}, in grado di eseguire questo +compito; i rispettivi prototipi sono: +\begin{functions} + \headdecl{sys/time.h} + + \funcdecl{futimens(int fd, const struct timespec times[2])} Cambia i tempi + di un file già aperto, specificato dal file descriptor \param{fd}. -%TODO documentare utimes + \funcdecl{int utimensat(int dirfd, const char *pathname, const struct + timespec times[2], int flags)} Cambia i tempi del file \param{pathname}. + + + \bodydesc{Le funzioni restituiscono zero in caso di successo e $-1$ per un + errore, nel qual caso \var{errno} assumerà gli stessi valori di + \func{utimes}, con in più per \func{futimes}: + \begin{errlist} + \item[\errcode{EBADF}] \param{fd} non è un file descriptor. + \item[\errcode{ENOSYS}] il filesystem \texttt{/proc} non è accessibile. + \end{errlist}} +\end{functions} + +Entrambe le funzioni utilizzano per indicare i valori dei tempi un +vettore \param{times} di due strutture \struct{timespec} che permette di +specificare un valore di tempo con una precisione fino al nanosecondo, la cui +definizione è riportata in fig.~\ref{fig:sys_timespec_struct}. + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includestruct{listati/timespec.h} + \end{minipage} + \normalsize + \caption{La struttura \structd{timespec} usata per indicare valori di tempo + con la precisione del nanosecondo.} + \label{fig:sys_timespec_struct} +\end{figure} + +Come per le precedenti funzioni il primo elemento di \param{times} indica il +tempo di ultimo accesso ed il secondo quello di ultima modifica, e se si usa +il valore \const{NULL} verrà impostato il tempo corrente sia per l'ultimo +accesso che per l'ultima modifica. Nei singoli elementi di \param{times} si +possono inoltre utilizzare due valori speciali per il campo \var{tv\_nsec}: +con \const{UTIME\_NOW} si richiede l'uso del tempo corrente, mentre con +\const{UTIME\_OMIT} si richiede di non impostare il tempo. Si può così +aggiornare in maniera specifica soltanto uno fra il tempo di ultimo accesso e +quello di ultima modifica. Quando si usa uno di questi valori speciali per +\var{tv\_nsec} il corrispondente valore di \var{tv\_sec} viene ignorato. + +Queste due funzioni sono una estensione definita in una recente revisione +dello standard POSIX (la POSIX.1-2008); sono state introdotte a partire dal +kernel 2.6.22, e supportate dalle \acr{glibc} a partire dalla versione +2.6.\footnote{in precedenza, a partire dal kernel 2.6.16, era stata introdotta + la funzione \func{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 la tratteremo.} La prima è +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},\footnote{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}.} 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. \section{Il controllo di accesso ai file} @@ -2602,16 +2724,28 @@ automaticamente propagato, restando coerente a quello della directory di partenza, in tutte le sotto-directory. La semantica SVr4 offre la possibilità di scegliere, ma per ottenere lo stesso -risultato di coerenza che si ha con BSD necessita che per le nuove directory -venga anche propagato anche il bit \acr{sgid}. Questo è il comportamento -predefinito del comando \cmd{mkdir}, ed è in questo modo ad esempio che Debian -assicura che le sotto-directory create nella home di un utente restino sempre -con il \acr{gid} del gruppo primario dello stesso. - -Come per i permessi, il sistema fornisce anche delle funzioni che permettano -di cambiare utente e gruppo cui il file appartiene; le funzioni in questione -sono tre: \funcd{chown}, \funcd{fchown} e \funcd{lchown}, ed i loro prototipi -sono: +risultato di coerenza che si ha con BSD necessita che quando si creano nuove +directory venga anche propagato anche il bit \acr{sgid}. Questo è il +comportamento predefinito del comando \cmd{mkdir}, ed è in questo modo ad +esempio che le varie distribuzioni assicurano che le sotto-directory create +nella home di un utente restino sempre con il \acr{gid} del gruppo primario +dello stesso. + +La presenza del bit \acr{sgid} è inoltre molto comoda quando si hanno +directory contenenti file condivisi all'intero di un gruppo in cui possono +scrivere tutti i membri dello stesso, dato che assicura che i file che gli +utenti vi creano appartengano sempre allo stesso gruppo. Questo non risolve +però completamente i problemi di accesso da parte di altri utenti dello stesso +gruppo, in quanto i permessi assegnati al gruppo potrebbero non essere +sufficienti; in tal caso si deve aver cura di usare un valore di +\itindex{umask} \textit{umask} che ne lasci di sufficienti.\footnote{in tal + caso si può assegnare agli utenti del gruppo una \textit{umask} di $002$, + anche se la soluzione migliore in questo caso è usare una ACL di default + (vedi sez.~\ref{sec:file_ACL}).} + +Come avviene nel caso dei permessi il sistema fornisce anche delle funzioni, +\funcd{chown}, \funcd{fchown} e \funcd{lchown}, che permettono di cambiare sia +l'utente che il gruppo a cui un file appartiene; i rispettivi prototipi sono: \begin{functions} \headdecl{sys/types.h} \headdecl{sys/stat.h} @@ -2623,8 +2757,8 @@ sono: Le funzioni cambiano utente e gruppo di appartenenza di un file ai valori specificati dalle variabili \param{owner} e \param{group}. - \bodydesc{Le funzioni restituiscono zero in caso di successo e -1 per - un errore, in caso di errore \var{errno} può assumere i valori: + \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 per un + errore, nel qual caso caso \var{errno} assumerà i valori: \begin{errlist} \item[\errcode{EPERM}] l'user-ID effettivo non corrisponde a quello del proprietario del file o non è zero, o utente e gruppo non sono validi @@ -2635,13 +2769,14 @@ sono: \errval{EACCES}, \errval{ELOOP}; \func{fchown} anche \errval{EBADF}.} \end{functions} -In Linux soltanto l'amministratore (in sostanza un processo con la -\itindex{capabilities} capability \const{CAP\_CHOWN}) può cambiare il -proprietario di un file, seguendo la semantica di BSD che non consente agli -utenti di assegnare i loro file ad altri (per evitare eventuali aggiramenti -delle quote). L'amministratore può cambiare il gruppo di un file, il -proprietario può cambiare il gruppo dei file che gli appartengono solo se il -nuovo gruppo è il suo gruppo primario o uno dei gruppi di cui fa parte. +Con Linux solo l'amministratore\footnote{o in generale un processo con la + \itindex{capabilities} capability \const{CAP\_CHOWN}, vedi + sez.~\ref{sec:proc_capabilities}.} può cambiare il proprietario di un file; +in questo viene seguita la semantica usata da BSD che non consente agli utenti +di assegnare i loro file ad altri utenti evitando eventuali aggiramenti delle +quote. L'amministratore può cambiare sempre il gruppo di un file, il +proprietario può cambiare il gruppo solo dei file che gli appartengono e solo +se il nuovo gruppo è il suo gruppo primario o uno dei gruppi di cui fa parte. La funzione \func{chown} segue i link simbolici, per operare direttamente su un link simbolico si deve usare la funzione \func{lchown}.\footnote{fino alla @@ -2658,24 +2793,18 @@ privilegi di root entrambi i bit \itindex{suid~bit} \acr{suid} e \itindex{sgid~bit} \acr{sgid} vengono cancellati. Questo non avviene per il bit \acr{sgid} nel caso in cui esso sia usato (in assenza del corrispondente permesso di esecuzione) per indicare che per il file è attivo il -\itindex{mandatory~locking} \textit{mandatory locking}. +\itindex{mandatory~locking} \textit{mandatory locking} (vedi +sez.~\ref{sec:file_mand_locking}). \subsection{Un quadro d'insieme sui permessi} \label{sec:file_riepilogo} -Avendo affrontato in maniera separata il comportamento delle varie funzioni ed -il significato dei singoli bit dei permessi sui file, vale la pena fare un -riepilogo in cui si riassumono le caratteristiche di ciascuno di essi, in modo -da poter fornire un quadro d'insieme. - -In tab.~\ref{tab:file_fileperm_bits} si sono riassunti gli effetti dei vari -bit dei permessi per un file; per quanto riguarda l'applicazione dei permessi -per proprietario, gruppo ed altri si ricordi quanto illustrato in -sez.~\ref{sec:file_perm_overview}. Per compattezza, nella tabelle si sono -specificati i bit di \itindex{suid~bit} \textit{suid}, \itindex{sgid~bit} -\textit{sgid} e \textit{sticky} \itindex{sticky~bit} con la notazione -illustrata anche in fig.~\ref{fig:file_perm_bit}. +Avendo affrontato in maniera separata il comportamento delle varie funzioni +che operano su di essi ed avendo trattato il significato dei singoli bit dei +permessi sui file in sezioni diverse, vale la pena di fare un riepilogo in cui +si riassumano le caratteristiche di ciascuno di essi, in modo da poter fornire +un quadro d'insieme. \begin{table}[!htb] \centering @@ -2686,7 +2815,7 @@ illustrata anche in fig.~\ref{fig:file_perm_bit}. \multicolumn{3}{|c|}{user}& \multicolumn{3}{|c|}{group}& \multicolumn{3}{|c|}{other}& - \multirow{2}{*}{\textbf{Operazioni possibili}} \\ + \multirow{2}{*}{\textbf{Significato per i file}} \\ \cline{1-12} \acr{s}&\acr{s}&\acr{t}&r&w&x&r&w&x&r&w&x& \\ \hline @@ -2706,28 +2835,12 @@ illustrata anche in fig.~\ref{fig:file_perm_bit}. -&-&-&-&-&-&-&-&-&-&1&-&Permesso di scrittura per tutti gli altri.\\ -&-&-&-&-&-&-&-&-&-&-&1&Permesso di esecuzione per tutti gli altri.\\ \hline - \end{tabular} - \caption{Tabella riassuntiva del significato dei bit dei permessi per un - file.} - \label{tab:file_fileperm_bits} -\end{table} - -In tab.~\ref{tab:file_dirperm_bits} si sono invece riassunti gli effetti dei -vari bit dei permessi per una directory; anche in questo caso si sono -specificati i bit di \itindex{suid~bit} \textit{suid}, \itindex{sgid~bit} -\textit{sgid} e \textit{sticky} \itindex{sticky~bit} con la notazione compatta -illustrata in fig.~\ref{fig:file_perm_bit}. - -\begin{table}[!htb] - \centering - \footnotesize - \begin{tabular}[c]{|c|c|c|c|c|c|c|c|c|c|c|c|l|} \hline \multicolumn{3}{|c|}{special}& \multicolumn{3}{|c|}{user}& \multicolumn{3}{|c|}{group}& \multicolumn{3}{|c|}{other}& - \multirow{2}{*}{\textbf{Operazioni possibili}} \\ + \multirow{2}{*}{\textbf{Significato per le directory}} \\ \cline{1-12} \acr{s}&\acr{s}&\acr{t}&r&w&x&r&w&x&r&w&x& \\ \hline @@ -2751,20 +2864,32 @@ illustrata in fig.~\ref{fig:file_perm_bit}. -&-&-&-&-&-&-&-&-&-&-&1&Permesso di attraversamento per tutti gli altri.\\ \hline \end{tabular} - \caption{Tabella riassuntiva del significato dei bit dei permessi per una - directory.} - \label{tab:file_dirperm_bits} + \caption{Tabella riassuntiva del significato dei bit dei permessi per un + file e directory.} + \label{tab:file_fileperm_bits} \end{table} -Nelle tabelle si è indicato con il carattere ``-'' il fatto che il valore del +Nella parte superiore di tab.~\ref{tab:file_fileperm_bits} si è riassunto il +significato dei vari bit dei permessi per un file; per quanto riguarda +l'applicazione dei permessi per proprietario, gruppo ed altri si ricordi +quanto illustrato in sez.~\ref{sec:file_perm_overview}. Per compattezza, +nella tabella si sono specificati i bit di \itindex{suid~bit} \textit{suid}, +\itindex{sgid~bit} \textit{sgid} e \textit{sticky} \itindex{sticky~bit} con la +notazione illustrata anche in fig.~\ref{fig:file_perm_bit}. Nella parte +inferiore si sono invece riassunti i significati dei vari bit dei permessi per +una directory; anche in questo caso si e` riapplicato ai bit di +\itindex{suid~bit} \textit{suid}, \itindex{sgid~bit} \textit{sgid} e +\textit{sticky} \itindex{sticky~bit} con la notazione illustrata in +fig.~\ref{fig:file_perm_bit}. + +Nella tabella si è indicato con il carattere ``-'' il fatto che il valore del bit in questione non è influente rispetto a quanto indicato nella riga della -tabella; la descrizione dell'operazione fa riferimento soltanto alla +tabella; la descrizione del significato fa riferimento soltanto alla combinazione di bit per i quali è stato riportato esplicitamente un valore. Si rammenti infine che il valore dei bit dei permessi non ha alcun effetto qualora il processo possieda i privilegi di amministratore. - \section{Caratteristiche e funzionalità avanzate} \label{sec:file_dir_advances} @@ -4765,7 +4890,7 @@ programmi e librerie) di cui il server potrebbe avere bisogno. % LocalWords: sez like filesystem unlink MacOS Windows VMS inode kernel unistd -% LocalWords: un'etichetta int const char oldpath newpath errno EXDEV EPERM st +% LocalWords: int const char oldpath newpath errno EXDEV EPERM st % LocalWords: EEXIST EMLINK EACCES ENAMETOOLONG ENOTDIR EFAULT ENOMEM EROFS ls % LocalWords: ELOOP ENOSPC EIO pathname nlink stat vfat fsck EISDIR ENOENT cap % LocalWords: POSIX socket fifo sticky root system call count crash nell' init @@ -4798,10 +4923,22 @@ programmi e librerie) di cui il server potrebbe avere bisogno. % LocalWords: attributes mime ADMIN FOWNER libattr lattr getxattr lgetxattr of % LocalWords: fgetxattr attr ssize ENOATTR ENOTSUP NUL setxattr lsetxattr list % LocalWords: fsetxattr flags XATTR REPLACE listxattr llistxattr flistxattr by -% LocalWords: removexattr lremovexattr fremovexattr attributename lacl acl +% LocalWords: removexattr lremovexattr fremovexattr attributename lacl acl tv % LocalWords: OBJ setfacl len any prefix separator options NUMERIC IDS SMART % LocalWords: INDENT major number IDE Documentation makedev fopendir proc copy -% LocalWords: euidaccess eaccess delete def tag qualifier permset +% LocalWords: euidaccess eaccess delete def tag qualifier permset calendar NOW +% LocalWords: mutt noatime relatime strictatime atim nsec mtim ctim atimensec +% LocalWords: mtimensec utimes timeval futimes lutimes ENOSYS futimens OMIT +% LocalWords: utimensat timespec sec futimesat LIDS DAC OVERRIDE SEARCH chattr +% LocalWords: Discrectionary KILL SETGID domain SETUID setuid setreuid SETPCAP +% LocalWords: setresuid setfsuid IMMUTABLE immutable append only BIND SERVICE +% LocalWords: BROADCAST broadcast multicast multicasting RAW PACKET IPC LOCK +% LocalWords: memory mlock mlockall shmctl mmap MODULE RAWIO ioperm iopl PACCT +% LocalWords: PTRACE ptrace accounting NICE RESOURCE TTY CONFIG hangup vhangup +% LocalWords: LEASE lease SETFCAP AUDIT permitted inherited inheritable AND +% LocalWords: bounding execve fork capget capset header hdrp datap ESRCH undef +% LocalWords: version libcap lcap clear ncap caps pag capgetp CapInh CapPrm +% LocalWords: fffffeff CapEff getcap %%% Local Variables: %%% mode: latex diff --git a/fileunix.tex b/fileunix.tex index c9712a7..171c1bd 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -1081,33 +1081,39 @@ molti casi in cui sarebbe invece utile che ogni singolo \itindex{thread} Per risolvere questi problemi, riprendendo una interfaccia già presente in Solaris, a fianco delle normali funzioni che operano sui file (come \func{open}, \func{mkdir}, ecc.) sono state introdotte delle ulteriori -funzioni, contraddistinte dal suffisso \texttt{at}, che permettono che -permettano 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 - \texttt{/proc/self/fd/dirfd/relative\_path}.} Benché queste non siano -funzioni standard esse sono disponibili anche su altri Unix\footnote{oltre al - citato Solaris ne è prevista l'inclusione anche in BSD.} e sono state -proposte per l'inclusione nello standard POSIX.1, nelle future revisioni dello -stesso. - -L'idea è che si apra prima la directory che si vuole usare come base dei -pathname relativo, e si passi il file descriptor alla funzione che userà -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 anche una directory di lavoro diversa per ciascuno di essi.} Con -queste funzioni si possono anche ottenere grossi aumenti di prestazioni quando -si devono eseguire operazioni su delle sezioni di albero dei file che -prevedono gerarchie molto profonde e grandi quantità di file e directory, dato -che basta eseguire la risoluzione di un pathname una sola volta (nell'apertura -della directory) e non per ciascun file che essa contiene. - -La sintassi generale di queste nuove funzioni è che esse prendano come primo +funzioni, 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 + \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 +essere incluse nella recente revisione (la POSIX.1-2008) dello standard +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 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. + +La sintassi generale di queste nuove funzioni è che esse prevedono come primo argomento il file descriptor della directory da usare come base, mentre gli argomenti successivi restano identici a quelli della corrispondente funzione ordinaria; ad esempio nel caso di \funcd{openat} avremo che essa è definita @@ -1129,36 +1135,61 @@ come: \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 +\param{dirfd} si usa il valore speciale \const{AT\_FDCWD},\footnote{questa, + come le altre costanti \texttt{AT\_*}, è definita in \texttt{fcntl.h}, + pertanto se la si vuole usare occorrerà includere comunque questo file, + anche per le funzioni che non sono definite in esso.} la risoluzione sarà +effettuata rispetto alla directory di lavoro corrente del processo. + +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.} + In tab.~\ref{tab:file_atfunc_corr} si sono riportate le funzioni introdotte con questa nuova interfaccia, con a fianco la corrispondente funzione -classica. Tranne che nel caso di \func{faccessat} e \func{unlinkat} tutti i -loro prototipi seguono la convenzione appena vista per \func{openat}, in cui -agli argomenti della corrispondente funzione classica viene anteposto -l'argomento \param{dirfd}.\footnote{non staremo pertanto a riportarli uno per - uno.} +classica.\footnote{in realtà, come visto in sez.~\ref{sec:file_temp_file}, le + funzioni \func{utimes} e \func{lutimes} non sono propriamente le + corrispondenti di \func{utimensat}, dato che questa ha una maggiore + precisione nella indicazione dei tempi dei file.} La gran parte di queste +seguono la convenzione appena vista per \func{openat}, in cui agli argomenti +della corrispondente funzione classica viene anteposto +l'argomento \param{dirfd}.\footnote{non staremo pertanto a riportarle una per + una.} Per una parte di queste, indicate dal contenuto della omonima colonna +di tab.~\ref{tab:file_atfunc_corr}, oltre al nuovo argomento iniziale, è +prevista anche l'aggiunta di un ulteriore argomento finale, \param{flags}. \begin{table}[htb] \centering \footnotesize \begin{tabular}[c]{|l|c|l|} \hline - \textbf{Funzione} &\textbf{Flags} \textbf{Corrispondente} \\ + \textbf{Funzione} &\textbf{Flags} &\textbf{Corrispondente} \\ \hline \hline - \func{faccessat} & -- &\func{access} \\ - \func{fchmodat} &$\bullet$\func{chmod} \\ - \func{fchownat} &\func{chown},\func{lchown} \\ - \func{fstatat} &\func{stat},\func{lstat} \\ - \func{futimesat} &\func{utimes} \\ - \func{linkat} &\func{link} \\ - \func{mkdirat} &\func{mkdir} \\ - \func{mknodat} &\func{mknod} \\ - \func{openat} &\func{open} \\ - \func{readlinkat}&\func{readlink}\\ - \func{renameat} &\func{rename} \\ - \func{symlinkat} &\func{symlink} \\ - \func{unlinkat} &\func{unlink} \\ - \func{mkfifoat} &\func{mkfifo} \\ + \func{faccessat} &$\bullet$&\func{access} \\ + \func{fchmodat} &$\bullet$&\func{chmod} \\ + \func{fchownat} &$\bullet$&\func{chown},\func{lchown}\\ + \func{fstatat} &$\bullet$&\func{stat},\func{lstat} \\ + \func{utimensat} &$\bullet$&\func{utimes},\func{lutimes}\\ + \func{linkat} &$\bullet$\footnotemark&\func{link} \\ + \func{mkdirat} & -- &\func{mkdir} \\ + \func{mknodat} & -- &\func{mknod} \\ + \func{openat} & -- &\func{open} \\ + \func{readlinkat}& -- &\func{readlink}\\ + \func{renameat} & -- &\func{rename} \\ + \func{symlinkat} & -- &\func{symlink} \\ + \func{unlinkat} &$\bullet$&\func{unlink},\func{rmdir} \\ + \func{mkfifoat} & -- &\func{mkfifo} \\ \hline \end{tabular} \caption{Corrispondenze fra le nuove funzioni ``\textit{at}'' e le @@ -1166,31 +1197,54 @@ l'argomento \param{dirfd}.\footnote{non staremo pertanto a riportarli uno per \label{tab:file_atfunc_corr} \end{table} -% TODO documentare utimesat, introdotta in 2.6.22 -% http://kernelnewbies.org/Linux_2_6_22 +\footnotetext{in questo caso l'argomento \param{flags} è disponibile ed + utilizzabile solo a partire dal kernel 2.6.18.} + +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 +su un link simbolico, così da poter scegliere se far agire la funzione +direttamente sullo stesso o sul file da esso referenziato. Dato che in certi +casi esso può fornire ulteriori indicazioni per modificare il comportamento +delle funzioni, \param{flags} deve comunque essere passato come maschera +binaria, ed impostato usando i valori delle appropriate costanti +\texttt{AT\_*}, definite in \texttt{fcntl.h}. + +Come esempio di questo secondo tipo di funzioni possiamo considerare +\funcd{fchownat}, che può essere usata per sostituire sia \func{chown} +che \func{lchown}; il suo prototipo è: +\begin{functions} + \headdecl{unistd.h} \headdecl{fcntl.h} -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 -\param{dirfd} si usa il valore speciale \const{AT\_FDCWD}, la risoluzione sarà -effettuata rispetto alla directory di lavoro corrente del processo. + \funcdecl{int fchownat(int dirfd, const char *pathname, uid\_t owner, gid\_t + group, int flags)} -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.} + .Modifica la proprietà di un file. + + \bodydesc{la funzione restituisce gli stessi valori e gli stessi codici di + errore di \func{chown}, ed in più: + \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. + \end{errlist}} +\end{functions} -Come accennato ci sono due eccezioni alla precedente regola, \func{faccessat} -e \func{unlinkat}, che tratteremo esplicitamente. Dette funzioni, oltre a -prendere \param{dirfd} come primo argomento aggiuntivo, prendono un ulteriore -argomento finale \param{flags}, utilizzato come maschera binaria. Nel caso di -\funcd{faccessat} avremo cioè: +In questo caso il valore di \param{flags} stabilisce il comportamento della +funzione quando la si applica ad un link simbolico, e l'unico valore +utilizzabile è \const{AT\_SYMLINK\_NOFOLLOW}\footnote{in \texttt{fcntl.h} è + definito anche \const{AT\_SYMLINK\_FOLLOW}, che richiede di dereferenziare i + link simbolici, essendo questo però il comportamento adottato per un valore + nullo di \param{flags} questo valore non viene mai usato.} che se impostato +indica alla funzione di non eseguire la dereferenziazione di un eventuale link +simbolico, facendo comportare \func{fchownat} come \func{lchown} invece che +come \func{chown}. + +Come accennato fra tutte quelle marcate in tab.~\ref{tab:file_atfunc_corr} +solo due funzioni possono usare l'argomento \param{flags} con valori diversi +da \const{AT\_SYMLINK\_NOFOLLOW}, la prima di queste è \funcd{faccessat}, ed +il suo prototipo è: \begin{functions} \headdecl{unistd.h} \funcdecl{int faccessat(int dirfd, const char *path, int mode, int flags)} @@ -1201,6 +1255,7 @@ argomento finale \param{flags}, utilizzato come maschera binaria. Nel caso di errore di \func{access}, ed in più: \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. \end{errlist}} @@ -1208,21 +1263,21 @@ argomento finale \param{flags}, utilizzato come maschera binaria. Nel caso di La funzione esegue lo stesso controllo di accesso effettuabile con \func{access}, ma si può utilizzare l'argomento \param{flags} per modificarne -il comportamento rispetto a quello ordinario di \func{access}; questo infatti -può essere specificato come maschera binaria dei seguenti valori: -\begin{basedescript}{\desclabelwidth{2.0cm}} -\item[\const{AT\_EACCESS}] se impostato esegue il controllo dei permessi - usando l'\textsl{user-ID effettivo} invece di quello reale (il comportamento - di default, che riprende quello di \func{access}). -\item[\const{AT\_SYMLINK\_NOFOLLOW}] se impostato non esegue la - dereferenziazione del link simbolico (il comportamento di default, che - riprende quello di \func{access}), ma effettua il controllo sui permessi del - link simbolico stesso. +il comportamento rispetto a quello ordinario di \func{access}. In questo caso +esso può essere specificato come maschera binaria di due valori: +\begin{basedescript}{\desclabelwidth{3.0cm}} +\item[\const{AT\_EACCESS}] se impostato \funcd{faccessat} esegue il controllo + dei permessi usando l'\textsl{user-ID effettivo} invece di quello reale (il + comportamento di default, che riprende quello di \func{access}). +\item[\const{AT\_SYMLINK\_NOFOLLOW}] se impostato \funcd{faccessat} non esegue + la dereferenziazione dei link simbolici, effettuando il controllo dei + permessi direttamente sugli stessi. \end{basedescript} -Nel caso di \func{unlinkat} l'ulteriore argomento \param{flags} viene inserito -perché detta funzione può comportarsi sia come analogo di \func{unlink} che di -\func{rmdir}; pertanto il suo prototipo è: +La seconda eccezione è \func{unlinkat}, in questo caso l'ulteriore +argomento \param{flags} viene utilizzato perché tramite esso la funzione possa +comportarsi sia come analogo di \func{unlink} che di \func{rmdir}; il suo +prototipo è: \begin{functions} \headdecl{fcntl.h} \funcdecl{int unlinkat(int dirfd, const char *pathname, int flags)} @@ -1234,17 +1289,20 @@ perch \param{flags}, ed in più: \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. \end{errlist}} \end{functions} Di default il comportamento di \func{unlinkat} è equivalente a quello che -avrebbe \func{unlink} applicata a \param{pathname}, fallendo se questo è una -directory, se però si imposta \param{flags} al valore di +avrebbe \func{unlink} applicata a \param{pathname}, fallendo in tutti i casi +in cui questo è una directory, se però si imposta \param{flags} al valore di \const{AT\_REMOVEDIR},\footnote{anche se \param{flags} è una maschera binaria, - essendo questo l'unico flag disponibile, lo si può assegnare direttamente.} -essa si comporterà come \func{rmdir}. + essendo questo l'unico flag disponibile per questa funzione, lo si può + assegnare direttamente.} essa si comporterà come \func{rmdir}, in tal +caso \param{pathname} deve essere una directory, che sarà rimossa qualora +risulti vuota. \subsection{La funzione \func{fcntl}} @@ -1595,10 +1653,11 @@ ma le due funzioni sono rimaste. % LocalWords: FIOCLEX FIONCLEX FIOASYNC FIONBIO NOATIME redirezione FIOSETOWN % LocalWords: FIOGETOWN FIONREAD mkdirat thread Solaris mkdir at Urlich proc % LocalWords: Drepper path dirfd faccessat unlinkat access fchmodat chmod Di -% LocalWords: fchownat chown fstatat futimesat utimes linkat mknodat mknod -% LocalWords: readlinkat readlink renameat rename symlinkat symlink unlink +% LocalWords: fchownat chown fstatat futimesat utimes linkat mknodat mknod uid +% LocalWords: readlinkat readlink renameat rename symlinkat symlink unlink gid % LocalWords: mkfifoat mkfifo FDCWD EACCESS dereferenziazione rmdir REMOVEDIR -% LocalWords: epoll lsattr chattr FIOQSIZE +% LocalWords: epoll lsattr chattr FIOQSIZE ATFILE lutimes utimensat lchown +% LocalWords: lstat owner FOLLOW %%% Local Variables: %%% mode: latex diff --git a/intro.tex b/intro.tex index 9b7bae5..50b5367 100644 --- a/intro.tex +++ b/intro.tex @@ -459,7 +459,9 @@ una infinita serie di problemi di portabilit \type{size\_t} & Dimensione di un oggetto.\\ \type{ssize\_t} & Dimensione in numero di byte ritornata dalle funzioni.\\ \type{ptrdiff\_t}& Differenza fra due puntatori.\\ - \type{time\_t} & Numero di secondi (in tempo di calendario).\\ + \type{time\_t} & Numero di secondi (in \itindex{calendar~time} + \textsl{tempo di calendario}, vedi + sez.~\ref{sec:sys_time}).\\ \type{uid\_t} & Identificatore di un utente.\\ \hline \end{tabular} @@ -945,10 +947,10 @@ una opportuna macro; queste estensioni sono illustrate nel seguente elenco: macro non ha nessun effetto. \item[\macro{\_ATFILE\_SOURCE}] definendo questa macro si rendono disponibili - le estensioni delle funzioni di creazione 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}. + 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}. \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 11e9c26..529b3de 100644 --- a/ipc.tex +++ b/ipc.tex @@ -3596,7 +3596,7 @@ bloccante,\footnote{o si sia impostato il flag \const{O\_NONBLOCK} sul file La sola differenza fra le due funzioni è che la seconda, passato il tempo massimo impostato con l'argomento \param{abs\_timeout},\footnote{deve essere specificato un tempo assoluto tramite una struttura \struct{timespec} (vedi - fig.~\ref{fig:sys_timeval_struct}) indicato in numero di secondi e + fig.~\ref{fig:sys_timespec_struct}) indicato in numero di secondi e nanosecondi a partire dal 1 gennaio 1970.} ritorna comunque con un errore di \errcode{ETIMEDOUT}, se invece il tempo è già scaduto al momento della chiamata e la coda è vuota la funzione ritorna immediatamente. diff --git a/listati/timespec.h b/listati/timespec.h new file mode 100644 index 0000000..57f8b3e --- /dev/null +++ b/listati/timespec.h @@ -0,0 +1,4 @@ +struct timespec { + time_t tv_sec; /* seconds */ + long int tv_nsec; /* nanoseconds */ +}; diff --git a/listati/timeval.h b/listati/timeval.h index 4283a69..67e2d5d 100644 --- a/listati/timeval.h +++ b/listati/timeval.h @@ -1,9 +1,5 @@ struct timeval { - long tv_sec; /* seconds */ - long tv_usec; /* microseconds */ -}; -struct timespec { - time_t tv_sec; /* seconds */ - long tv_nsec; /* nanoseconds */ + time_t tv_sec; /* seconds */ + suseconds_t tv_usec; /* microseconds */ }; diff --git a/process.tex b/process.tex index 7c104bc..601d3c3 100644 --- a/process.tex +++ b/process.tex @@ -151,13 +151,14 @@ non vengono salvati e le eventuali funzioni registrate con \func{atexit} e \bodydesc{La funzione non ritorna. Il processo viene terminato.} \end{prototype} -La funzione chiude tutti i file descriptor appartenenti al processo (si tenga +La funzione chiude tutti i file descriptor appartenenti al processo; si tenga presente che questo non comporta il salvataggio dei dati bufferizzati degli -stream), fa sì che ogni figlio del processo sia adottato da \cmd{init} (vedi -cap.~\ref{cha:process_handling}), manda un segnale \const{SIGCHLD} al processo -padre (vedi sez.~\ref{sec:sig_job_control}) ed infine ritorna lo stato di -uscita specificato in \param{status} che può essere raccolto usando la -funzione \func{wait} (vedi sez.~\ref{sec:proc_wait}). +stream, (torneremo sulle due interfacce dei file a partire da +cap.~\ref{cha:file_intro}), fa sì che ogni figlio del processo sia adottato da +\cmd{init} (vedi cap.~\ref{cha:process_handling}), manda un segnale +\const{SIGCHLD} al processo padre (vedi sez.~\ref{sec:sig_job_control}) ed +infine ritorna lo stato di uscita specificato in \param{status} che può essere +raccolto usando la funzione \func{wait} (vedi sez.~\ref{sec:proc_wait}). \subsection{Le funzioni \func{atexit} e \func{on\_exit}} diff --git a/signal.tex b/signal.tex index d20803b..2653413 100644 --- a/signal.tex +++ b/signal.tex @@ -1370,8 +1370,8 @@ indipendente da \func{alarm}\footnote{nel caso di Linux questo utilizzando direttamente il timer del kernel.} e sia utilizzabile senza interferenze con l'uso di \const{SIGALRM}. La funzione prende come argomenti delle strutture di tipo \struct{timespec}, la cui definizione è riportata in -fig.~\ref{fig:sys_timeval_struct}, che permettono di specificare un tempo con -una precisione (teorica) fino al nanosecondo. +fig.~\ref{fig:sys_timespec_struct}, che permette di specificare un tempo con +una precisione fino al nanosecondo. La funzione risolve anche il problema di proseguire l'attesa dopo l'interruzione dovuta ad un segnale; infatti in tal caso in \param{rem} viene diff --git a/system.tex b/system.tex index e69639b..9a37199 100644 --- a/system.tex +++ b/system.tex @@ -1823,10 +1823,10 @@ gestione di data e ora. Storicamente i sistemi unix-like hanno sempre mantenuto due distinti tipi di dati per la misure dei tempi all'interno del sistema: essi sono -rispettivamente chiamati \itindend{calendar~time} \textit{calendar time} e +rispettivamente chiamati \itindex{calendar~time} \textit{calendar time} e \itindex{process~time} \textit{process time}, secondo le definizioni: \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} -\item[\textit{calendar time}] \itindend{calendar~time} detto anche +\item[\textit{calendar time}] \itindex{calendar~time} detto anche \textsl{tempo di calendario}. È il numero di secondi dalla mezzanotte del primo gennaio 1970, in tempo universale coordinato (o UTC), data che viene usualmente indicata con 00:00:00 Jan, 1 1970 (UTC) e chiamata \textit{the @@ -1851,7 +1851,7 @@ rispettivamente chiamati \itindend{calendar~time} \textit{calendar time} e obsoleto. \end{basedescript} -In genere si usa il \itindend{calendar~time} \textit{calendar time} per +In genere si usa il \itindex{calendar~time} \textit{calendar time} per esprimere le date dei file e le informazioni analoghe che riguardano i cosiddetti \textsl{tempi di orologio}, che vengono usati ad esempio per i demoni che compiono lavori amministrativi ad ore definite, come \cmd{cron}. @@ -1899,7 +1899,7 @@ del comando \cmd{time}. \itindbeg{process~time} Di norma tutte le operazioni del sistema fanno sempre riferimento al -\itindend{calendar~time} \textit{calendar time}, l'uso del \textit{process +\itindex{calendar~time} \textit{calendar time}, l'uso del \textit{process time} è riservato a quei casi in cui serve conoscere i tempi di esecuzione di un processo (ad esempio per valutarne l'efficienza). In tal caso infatti fare ricorso al \textit{calendar time} è inutile in quanto il tempo può essere @@ -1977,7 +1977,10 @@ lo stato di terminazione di tutti i suoi figli, questi processi \itindbeg{calendar~time} Come anticipato in sez.~\ref{sec:sys_unix_time} il \textit{calendar time} è -mantenuto dal kernel in una variabile di tipo \type{time\_t}, che usualmente +mantenuto dal kernel in una variabile di tipo \type{time\_t},\footnote{in + realtà il kernel usa una rappresentazione interna di che fornisce una + precisione molto maggiore, e consente per questo anche di usare + rappresentazioni diverse del \textit{calendar time}.} che usualmente corrisponde ad un tipo elementare (in Linux è definito come \ctyp{long int}, che di norma corrisponde a 32 bit). Il valore corrente del \textit{calendar time}, che indicheremo come \textsl{tempo di sistema}, può essere ottenuto @@ -2033,25 +2036,13 @@ sono: \errval{EPERM}.} \end{functions} -Queste funzioni utilizzano una struttura di tipo \struct{timeval}, la cui -definizione, insieme a quella della analoga \struct{timespec}, è riportata in -fig.~\ref{fig:sys_timeval_struct}. Le \acr{glibc} infatti forniscono queste due -rappresentazioni alternative del \textit{calendar time} che rispetto a -\type{time\_t} consentono rispettivamente precisioni del microsecondo e del -nanosecondo.\footnote{la precisione è solo teorica, la precisione reale della - misura del tempo dell'orologio di sistema non dipende dall'uso di queste - strutture.} - -\begin{figure}[!htb] - \footnotesize \centering - \begin{minipage}[c]{15cm} - \includestruct{listati/timeval.h} - \end{minipage} - \normalsize - \caption{Le strutture \structd{timeval} e \structd{timespec} usate per una - rappresentazione ad alta risoluzione del \textit{calendar time}.} - \label{fig:sys_timeval_struct} -\end{figure} +Si noti come queste funzioni utilizzino per indicare il tempo una struttura di +tipo \struct{timeval}, la cui definizione si è già vista in +fig.~\ref{fig:sys_timeval_struct}, questa infatti permette una espressione +alternativa dei valori del \textit{calendar time}, con una precisione, +rispetto a \type{time\_t}, fino al microsecondo.\footnote{la precisione è solo + teorica, la precisione reale della misura del tempo dell'orologio di sistema + non dipende dall'uso di queste strutture.} Come nel caso di \func{stime} anche \func{settimeofday} (la cosa continua a valere per qualunque funzione che vada a modificare l'orologio di sistema, -- 2.30.2