From dc6f430983f53479f813a2b7bc5ec6517e4b7e98 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Thu, 4 Jan 2007 19:14:07 +0000 Subject: [PATCH] Correzioni di impaginazione e qualche precisazione. --- fileadv.tex | 99 +++++++++++++++++++++++++--------------------------- filedir.tex | 63 ++++++++++++++++++--------------- fileunix.tex | 12 +++---- signal.tex | 29 ++++++++------- sockctrl.tex | 2 +- system.tex | 70 +++++++++++++++++++++---------------- 6 files changed, 145 insertions(+), 130 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index b4c7d00..75f0471 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1026,10 +1026,9 @@ valore di \param{aiocbp}. Quando una operazione viene cancellata una successiva chiamata ad \func{aio\_error} riporterà \errcode{ECANCELED} come codice di errore, ed il suo codice di ritorno sarà -1, inoltre il meccanismo di notifica non verrà invocato. Se si specifica una operazione relativa ad un -altro file descriptor il risultato è indeterminato. - -In caso di successo, i possibili valori di ritorno per \func{aio\_cancel} sono -tre (anch'essi definiti in \file{aio.h}): +altro file descriptor il risultato è indeterminato. In caso di successo, i +possibili valori di ritorno per \func{aio\_cancel} (anch'essi definiti in +\file{aio.h}) sono tre: \begin{basedescript}{\desclabelwidth{3.0cm}} \item[\const{AIO\_ALLDONE}] indica che le operazioni di cui si è richiesta la cancellazione sono state già completate, @@ -1104,29 +1103,28 @@ lettura o scrittura; il suo prototipo } \end{prototype} -La funzione esegue la richiesta delle \param{nent} operazioni indicate dalla -lista \param{list}; questa deve contenere gli indirizzi di altrettanti -\textit{control block}, opportunamente inizializzati; in particolare nel caso -dovrà essere specificato il tipo di operazione tramite il campo -\var{aio\_lio\_opcode}, che può prendere i tre valori: +La funzione esegue la richiesta delle \param{nent} operazioni indicate nella +lista \param{list} che deve contenere gli indirizzi di altrettanti +\textit{control block} opportunamente inizializzati; in particolare dovrà +essere specificato il tipo di operazione con il campo \var{aio\_lio\_opcode}, +che può prendere i valori: \begin{basedescript}{\desclabelwidth{2.0cm}} \item[\const{LIO\_READ}] si richiede una operazione di lettura. \item[\const{LIO\_WRITE}] si richiede una operazione di scrittura. \item[\const{LIO\_NOP}] non si effettua nessuna operazione. \end{basedescript} -l'ultimo valore viene usato quando si ha a che fare con un vettore di -dimensione fissa, per poter specificare solo alcune operazioni, o quando si è -dovuto cancellare delle operazioni e si deve ripetere la richiesta per quelle -non completate. +dove \const{LIO\_NOP} viene usato quando si ha a che fare con un vettore di +dimensione fissa, per poter specificare solo alcune operazioni, o quando si +sono dovute cancellare delle operazioni e si deve ripetere la richiesta per +quelle non completate. -L'argomento \param{mode} permette di stabilire il comportamento della -funzione, se viene specificato il valore \const{LIO\_WAIT} la funzione si -blocca fino al completamento di tutte le operazioni richieste; se invece si -specifica \const{LIO\_NOWAIT} la funzione ritorna immediatamente dopo aver -messo in coda tutte le richieste. In questo caso il chiamante può richiedere -la notifica del completamento di tutte le richieste, impostando l'argomento -\param{sig} in maniera analoga a come si fa per il campo \var{aio\_sigevent} -di \struct{aiocb}. +L'argomento \param{mode} controlla il comportamento della funzione, se viene +usato il valore \const{LIO\_WAIT} la funzione si blocca fino al completamento +di tutte le operazioni richieste; se si usa \const{LIO\_NOWAIT} la funzione +ritorna immediatamente dopo aver messo in coda tutte le richieste. In tal caso +il chiamante può richiedere la notifica del completamento di tutte le +richieste, impostando l'argomento \param{sig} in maniera analoga a come si fa +per il campo \var{aio\_sigevent} di \struct{aiocb}. \section{Altre modalità di I/O avanzato} @@ -1163,37 +1161,34 @@ prototipi sono: \begin{functions} \headdecl{sys/uio.h} - \funcdecl{int readv(int fd, const struct iovec *vector, int count)} Esegue - una lettura vettorizzata da \param{fd} nei \param{count} buffer specificati - da \param{vector}. - - \funcdecl{int writev(int fd, const struct iovec *vector, int count)} Esegue - una scrittura vettorizzata da \param{fd} nei \param{count} buffer - specificati da \param{vector}. + \funcdecl{int readv(int fd, const struct iovec *vector, int count)} + \funcdecl{int writev(int fd, const struct iovec *vector, int count)} + + Eseguono rispettivamente una lettura o una scrittura vettorizzata. \bodydesc{Le funzioni restituiscono il numero di byte letti o scritti in caso di successo, e -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{EBADF}] si è specificato un file descriptor sbagliato. \item[\errcode{EINVAL}] si è specificato un valore non valido per uno degli argomenti (ad esempio \param{count} è maggiore di \const{MAX\_IOVEC}). \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale prima di di avere eseguito una qualunque lettura o scrittura. \item[\errcode{EAGAIN}] \param{fd} è stato aperto in modalità non bloccante e non ci sono dati in lettura. - \item[\errcode{EOPNOTSUPP}] La coda delle richieste è momentaneamente piena. + \item[\errcode{EOPNOTSUPP}] la coda delle richieste è momentaneamente piena. \end{errlist} - ed inoltre \errval{EISDIR}, \errval{ENOMEM}, \errval{EFAULT} (se non sono - stato allocati correttamente i buffer specificati nei campi - \var{iov\_base}), più tutti gli ulteriori errori che potrebbero avere le - usuali funzioni di lettura e scrittura eseguite su \param{fd}.} + ed anche \errval{EISDIR}, \errval{EBADF}, \errval{ENOMEM}, \errval{EFAULT} + (se non sono stati allocati correttamente i buffer specificati nei campi + \var{iov\_base}), più gli eventuali errori delle funzioni di lettura e + scrittura eseguite su \param{fd}.} \end{functions} -Entrambe le funzioni usano una struttura \struct{iovec}, definita in -fig.~\ref{fig:file_iovec}, che definisce dove i dati devono essere letti o -scritti. Il primo campo, \var{iov\_base}, contiene l'indirizzo del buffer ed -il secondo, \var{iov\_len}, la dimensione dello stesso. +Entrambe le funzioni usano una struttura \struct{iovec}, la cui definizione è +riportata in fig.~\ref{fig:file_iovec}, che definisce dove i dati devono +essere letti o scritti ed in che quantità. Il primo campo della struttura, +\var{iov\_base}, contiene l'indirizzo del buffer ed il secondo, +\var{iov\_len}, la dimensione dello stesso. \begin{figure}[!htb] \footnotesize \centering @@ -1206,12 +1201,12 @@ il secondo, \var{iov\_len}, la dimensione dello stesso. \label{fig:file_iovec} \end{figure} -I buffer da utilizzare sono indicati attraverso l'argomento \param{vector} che -è un vettore di strutture \struct{iovec}, la cui lunghezza è specificata da -\param{count}. Ciascuna struttura dovrà essere inizializzata per -opportunamente per indicare i vari buffer da/verso i quali verrà eseguito il -trasferimento dei dati. Essi verranno letti (o scritti) nell'ordine in cui li -si sono specificati nel vettore \param{vector}. +La lista dei buffer da utilizzare viene indicata attraverso l'argomento +\param{vector} che è un vettore di strutture \struct{iovec}, la cui lunghezza +è specificata dall'argomento \param{count}. Ciascuna struttura dovrà essere +inizializzata opportunamente per indicare i vari buffer da e verso i quali +verrà eseguito il trasferimento dei dati. Essi verranno letti (o scritti) +nell'ordine in cui li si sono specificati nel vettore \param{vector}. \subsection{File mappati in memoria} @@ -1225,6 +1220,14 @@ cosiddetto \textit{memory-mapped I/O}, che, attraverso il meccanismo della sez.~\ref{sec:proc_mem_gen}), permette di \textsl{mappare} il contenuto di un file in una sezione dello spazio di indirizzi del processo. +\begin{figure}[htb] + \centering + \includegraphics[width=12cm]{img/mmap_layout} + \caption{Disposizione della memoria di un processo quando si esegue la + mappatura in memoria di un file.} + \label{fig:file_mmap_layout} +\end{figure} + Il meccanismo è illustrato in fig.~\ref{fig:file_mmap_layout}, una sezione del file viene \textsl{mappata} direttamente nello spazio degli indirizzi del programma. Tutte le operazioni di lettura e scrittura su variabili contenute @@ -1236,14 +1239,6 @@ segmento di memoria con quello del file mappato su di esso. Per questo motivo si può parlare tanto di \textsl{file mappato in memoria}, quanto di \textsl{memoria mappata su file}. -\begin{figure}[htb] - \centering - \includegraphics[width=14cm]{img/mmap_layout} - \caption{Disposizione della memoria di un processo quando si esegue la - mappatura in memoria di un file.} - \label{fig:file_mmap_layout} -\end{figure} - L'uso del \textit{memory-mapping} comporta una notevole semplificazione delle operazioni di I/O, in quanto non sarà più necessario utilizzare dei buffer intermedi su cui appoggiare i dati da traferire, poiché questi potranno essere diff --git a/filedir.tex b/filedir.tex index 239c995..b73660a 100644 --- a/filedir.tex +++ b/filedir.tex @@ -432,7 +432,7 @@ stringa con un carattere nullo e la tronca alla dimensione specificata da \begin{figure}[htb] \centering - \includegraphics[width=9cm]{img/link_loop} + \includegraphics[width=8cm]{img/link_loop} \caption{Esempio di loop nel filesystem creato con un link simbolico.} \label{fig:file_link_loop} \end{figure} @@ -828,11 +828,11 @@ il nome del relativo campo; nel nostro caso sono definite le macro Per quanto riguarda il significato dei campi opzionali, il campo \var{d\_type} indica il tipo di file (fifo, directory, link simbolico, ecc.); i suoi possibili valori\footnote{fino alla versione 2.1 delle \acr{glibc} questo - campo, pur presente nella struttura, non è implementato, e resta sempre al + campo, pur presente nella struttura, non era implementato, e resta sempre al valore \const{DT\_UNKNOWN}.} sono riportati in -tab.~\ref{tab:file_dtype_macro}; per la conversione da e verso l'analogo valore -mantenuto dentro il campo \var{st\_mode} di \struct{stat} sono definite anche -due macro di conversione \macro{IFTODT} e \macro{DTTOIF}: +tab.~\ref{tab:file_dtype_macro}; per la conversione da e verso l'analogo +valore mantenuto dentro il campo \var{st\_mode} di \struct{stat} sono definite +anche due macro di conversione \macro{IFTODT} e \macro{DTTOIF}: \begin{functions} \funcdecl{int IFTODT(mode\_t MODE)} Converte il tipo di file dal formato di \var{st\_mode} a quello di \var{d\_type}. @@ -897,7 +897,7 @@ ed ordinamento) del contenuto di una directory; la funzione \funcd{scandir}\footnote{in Linux questa funzione è stata introdotta fin dalle libc4.} ed il suo prototipo è: \begin{prototype}{dirent.h}{int scandir(const char *dir, - struct dirent ***namelist, int(*select)(const struct dirent *), + struct dirent ***namelist, int(*filter)(const struct dirent *), int(*compar)(const struct dirent **, const struct dirent **))} Esegue una scansione di un \textit{directory stream}. @@ -909,27 +909,33 @@ ed ordinamento) del contenuto di una directory; la funzione Al solito, per la presenza fra gli argomenti di due puntatori a funzione, il prototipo non è molto comprensibile; queste funzioni però sono quelle che controllano rispettivamente la selezione di una voce (quella passata con -l'argomento \param{select}) e l'ordinamento di tutte le voci selezionate +l'argomento \param{filter}) e l'ordinamento di tutte le voci selezionate (quella specificata dell'argomento \param{compar}). La funzione legge tutte le voci della directory indicata dall'argomento -\param{dir}, passando ciascuna di esse (una struttura \struct{dirent}) come -argomento della funzione di selezione specificata da \param{select}; se questa -ritorna un valore diverso da zero la voce viene inserita in un vettore che -viene allocato dinamicamente con \func{malloc}. Qualora si specifichi un -valore \val{NULL} per \func{select} vengono selezionate tutte le voci. +\param{dir}, passando un puntatore a ciascuna di esse (una struttura +\struct{dirent}) come argomento della funzione di selezione specificata da +\param{filter}; se questa ritorna un valore diverso da zero il puntatore viene +inserito in un vettore che viene allocato dinamicamente con \func{malloc}. +Qualora si specifichi un valore \val{NULL} per l'argomento \func{filter} non +viene fatta nessuna selezione e si ottengono tutte le voci presenti. Le voci selezionate possono essere riordinate tramite \func{qsort}, le modalità del riordinamento possono essere personalizzate usando la funzione -\param{compar} come criterio di ordinamento di\func{qsort}, la funzione prende -come argomenti le due strutture \struct{dirent} da confrontare restituendo un -valore positivo, nullo o negativo per indicarne l'ordinamento; alla fine -l'indirizzo della lista delle strutture \struct{dirent} così ordinate viene -restituito nell'argomento \param{namelist}. - -Per l'ordinamento (vale a dire come valori possibili per l'argomento -\param{compar}) sono disponibili anche due funzioni predefinite, -\funcd{alphasort} e \funcd{versionsort}, i cui prototipi sono: +\param{compar} come criterio di ordinamento di \func{qsort}, la funzione +prende come argomenti le due strutture \struct{dirent} da confrontare +restituendo un valore positivo, nullo o negativo per indicarne l'ordinamento; +alla fine l'indirizzo della lista ordinata dei puntatori alle strutture +\struct{dirent} viene restituito nell'argomento +\param{namelist}.\footnote{la funzione alloca automaticamente la lista, e + restituisce, come \itindex{value~result~argument} \textit{value result + argument}, l'indirizzo della stessa; questo significa che \param{namelist} + deve essere dichiarato come \code{struct dirent **namelist} ed alla funzione + si deve passare il suo indirizzo.} + +Per l'ordinamento, vale a dire come valori possibili per l'argomento +\param{compar} sono disponibili due funzioni predefinite, \funcd{alphasort} e +\funcd{versionsort}, i cui prototipi sono: \begin{functions} \headdecl{dirent.h} @@ -1612,13 +1618,6 @@ cancellare i file che non servono pi il programma \cmd{leafnode} cancella i vecchi articoli sulla base di questo tempo). -Il tempo di ultima modifica invece viene usato da \cmd{make} per decidere -quali file necessitano di essere ricompilati o (talvolta insieme anche al -tempo di cambiamento di stato) per decidere quali file devono essere -archiviati per il backup. 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}. - \begin{table}[htb] \centering \footnotesize @@ -1692,6 +1691,14 @@ nell'ultima colonna di tab.~\ref{tab:file_file_times}. \label{tab:file_times_effects} \end{table} + +Il tempo di ultima modifica invece viene usato da \cmd{make} per decidere +quali file necessitano di essere ricompilati o (talvolta insieme anche al +tempo di cambiamento di stato) per decidere quali file devono essere +archiviati per il backup. 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}. + L'effetto delle varie funzioni di manipolazione dei file sui tempi è illustrato in tab.~\ref{tab:file_times_effects}. Si sono riportati gli effetti sia per il file a cui si fa riferimento, sia per la directory che lo contiene; diff --git a/fileunix.tex b/fileunix.tex index 7ff6ca0..60f3490 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -241,15 +241,10 @@ ritorno il file descriptor con il valore pi alternativa di usare un file con un nome univoco e la funzione \func{link} per verificarne l'esistenza (vedi sez.~\ref{sec:ipc_file_lock}).} -\footnotetext[3]{acronimo di \itindex{Denial~of~Service~(DoS)} \textit{Denial - of Service}, si chiamano così attacchi miranti ad impedire un servizio - causando una qualche forma di carico eccessivo per il sistema, che resta - bloccato nelle risposte all'attacco.} - \begin{table}[!htb] \centering \footnotesize - \begin{tabular}[c]{|l|p{12cm}|} + \begin{tabular}[c]{|l|p{13cm}|} \hline \textbf{Flag} & \textbf{Descrizione} \\ \hline @@ -360,6 +355,11 @@ ritorno il file descriptor con il valore pi \label{tab:file_open_flags} \end{table} +\footnotetext[3]{acronimo di \itindex{Denial~of~Service~(DoS)} \textit{Denial + of Service}, si chiamano così attacchi miranti ad impedire un servizio + causando una qualche forma di carico eccessivo per il sistema, che resta + bloccato nelle risposte all'attacco.} + \footnotetext[4]{il problema è che NFS non supporta la scrittura in \itindex{append~mode} \textit{append}, ed il kernel deve simularla, ma questo comporta la possibilità di una \itindex{race~condition} \textit{race diff --git a/signal.tex b/signal.tex index edbc674..26b3ac9 100644 --- a/signal.tex +++ b/signal.tex @@ -904,18 +904,20 @@ e che prende un argomento di tipo \ctyp{int}.\footnote{si devono usare le operatori del C, senza di esse si sarebbe definita una funzione che ritorna un puntatore a \ctyp{void} e non un puntatore ad una funzione \ctyp{void}.} La funzione \func{signal} quindi restituisce e prende come secondo argomento -un puntatore a una funzione di questo tipo, che è appunto il gestore del -segnale. - -Il numero di segnale passato in \param{signum} può essere indicato -direttamente con una delle costanti definite in sez.~\ref{sec:sig_standard}. Il -gestore \param{handler} invece, oltre all'indirizzo della funzione da chiamare -all'occorrenza del segnale, può assumere anche i due valori costanti -\const{SIG\_IGN} con cui si dice di ignorare il segnale e \const{SIG\_DFL} per -reinstallare l'azione predefinita.\footnote{si ricordi però che i due segnali +un puntatore a una funzione di questo tipo, che è appunto la funzione che +verrà usata come gestore del segnale. + +Il numero di segnale passato nell'argomento \param{signum} può essere indicato +direttamente con una delle costanti definite in sez.~\ref{sec:sig_standard}. +L'argomento \param{handler} che indica il gestore invece, oltre all'indirizzo +della funzione da chiamare all'occorrenza del segnale, può assumere anche i +due valori costanti \const{SIG\_IGN} e \const{SIG\_DFL}; il primo indica che +il segnale deve essere ingnorato,\footnote{si ricordi però che i due segnali \const{SIGKILL} e \const{SIGSTOP} non possono essere né ignorati né intercettati; l'uso di \const{SIG\_IGN} per questi segnali non ha alcun - effetto.} + effetto.} mentre il secondo ripristina l'azione predefinita.\footnote{e + serve a tornare al comportamento di default quando non si intende più + gesrire direttamente un segnale.} La funzione restituisce l'indirizzo dell'azione precedente, che può essere salvato per poterlo ripristinare (con un'altra chiamata a \func{signal}) in un @@ -954,9 +956,10 @@ questi segnali pu \subsection{Le funzioni \func{kill} e \func{raise}} \label{sec:sig_kill_raise} -Come accennato in sez.~\ref{sec:sig_types}, un segnale può essere generato -direttamente da un processo attraverso una opportuna system call. Le funzioni -che si usano di solito per inviare un segnale generico sono due, \func{raise} e +Come precedentemente accennato in sez.~\ref{sec:sig_types}, un segnale può +anche essere generato direttamente nell'esecuzione di un programma, attraverso +la chiamata ad una opportuna system call. Le funzioni che si utilizzano di +solito per inviare un segnale generico ad un processo sono due: \func{raise} e \func{kill}. La prima funzione è \funcd{raise}, che è definita dallo standard ANSI C, e diff --git a/sockctrl.tex b/sockctrl.tex index df3ed69..37084e5 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -2365,7 +2365,7 @@ chiuso dopo aver impostato un errore di \errcode{ETIMEDOUT}. Qualora la connessione si sia ristabilita e si riceva un successivo messaggio di risposta il ciclo riparte come se niente fosse avvenuto. Infine se si riceve come risposta un pacchetto ICMP di destinazione irraggiungibile (vedi -sez.~\ref{sec:icmp_protocol_xxx}), verrà restituito l'errore corrispondente. +sez.~\ref{sec:ICMP_protocol}), verrà restituito l'errore corrispondente. In generale questa opzione serve per individuare una caduta della connessione anche quando non si sta facendo traffico su di essa. Viene usata diff --git a/system.tex b/system.tex index f2569bf..5f0a639 100644 --- a/system.tex +++ b/system.tex @@ -1158,11 +1158,13 @@ della macchina. I dati vengono usualmente\footnote{questa è la locazione specificata dal \textit{Linux Filesystem Hierarchy Standard}, adottato dalla gran parte delle distribuzioni.} memorizzati nei due file \file{/var/run/utmp} e -\file{/var/log/wtmp}. Quando un utente si collega viene aggiunta una voce a -\file{/var/run/utmp} in cui viene memorizzato il nome di login, il terminale -da cui ci si collega, l'\acr{uid} della shell di login, l'orario della -connessione ed altre informazioni. La voce resta nel file fino al logout, -quando viene cancellata e spostata in \file{/var/log/wtmp}. +\file{/var/log/wtmp}.\footnote{non si confonda quest'ultimo con il simile + \file{/var/log/btmp} dove invece vengono memorizzati dal programma di login + tutti tentativi di accesso fallito.} Quando un utente si collega viene +aggiunta una voce a \file{/var/run/utmp} in cui viene memorizzato il nome di +login, il terminale da cui ci si collega, l'\acr{uid} della shell di login, +l'orario della connessione ed altre informazioni. La voce resta nel file fino +al logout, quando viene cancellata e spostata in \file{/var/log/wtmp}. In questo modo il primo file viene utilizzato per registrare chi sta utilizzando il sistema al momento corrente, mentre il secondo mantiene la @@ -1195,34 +1197,29 @@ sono: \bodydesc{Le funzioni non ritornano codici di errore.} \end{functions} - -In caso questo non venga specificato nessun file viene usato il valore -standard \const{\_PATH\_UTMP} (che è definito in \file{paths.h}); in genere -\func{utmpname} prevede due possibili valori: +e si tenga presente che le funzioni non restituiscono nessun valore, pertanto +non è possibile accorgersi di eventuali errori (ad esempio se si è impostato +un nome di file sbagliato con \func{utmpname}). + +Nel caso non si sia utilizzata \func{utmpname} per specificare un file di +registro alternativo, sia \func{setutent} che \func{endutent} operano usando +il default che è \file{/var/run/utmp}. Il nome di questo file, così come una +serie di altri valori di default per i \textit{pathname} di uso più comune, +viene mantenuto nei valori di una serie di costanti definite includendo +\file{paths.h}, in particolare quelle che ci interessano sono: \begin{basedescript}{\desclabelwidth{2.0cm}} -\item[\const{\_PATH\_UTMP}] Specifica il registro per gli utenti correntemente - collegati. -\item[\const{\_PATH\_WTMP}] Specifica il registro per l'archivio storico degli - utenti collegati. +\item[\const{\_PATH\_UTMP}] specifica il file che contiene il registro per gli + utenti correntemente collegati; questo è il valore che viene usato se non si + è utilizzato \func{utmpname} per modificarlo. +\item[\const{\_PATH\_WTMP}] specifica il file che contiene il registro per + l'archivio storico degli utenti collegati. \end{basedescript} -corrispondenti ai file \file{/var/run/utmp} e \file{/var/log/wtmp} visti in -precedenza. - -\begin{figure}[!htb] - \footnotesize - \centering - \begin{minipage}[c]{15cm} - \includestruct{listati/utmp.h} - \end{minipage} - \normalsize - \caption{La struttura \structd{utmp} contenente le informazioni di una voce - del registro di \textsl{contabilità}.} - \label{fig:sys_utmp_struct} -\end{figure} +che nel caso di Linux hanno un valore corrispondente ai file +\file{/var/run/utmp} e \file{/var/log/wtmp} citati in precedenza. -Una volta aperto il file si può eseguire una scansione leggendo o scrivendo -una voce con le funzioni \funcd{getutent}, \funcd{getutid}, \funcd{getutline} -e \funcd{pututline}, i cui prototipi sono: +Una volta aperto il file del registro degli utenti si può eseguire una +scansione leggendo o scrivendo una voce con le funzioni \funcd{getutent}, +\funcd{getutid}, \funcd{getutline} e \funcd{pututline}, i cui prototipi sono: \begin{functions} \headdecl{utmp.h} @@ -1249,6 +1246,19 @@ fig.~\ref{fig:sys_utmp_struct}. Le prime tre funzioni servono per leggere una voce dal registro; \func{getutent} legge semplicemente la prima voce disponibile; le altre due permettono di eseguire una ricerca. + +\begin{figure}[!htb] + \footnotesize + \centering + \begin{minipage}[c]{15cm} + \includestruct{listati/utmp.h} + \end{minipage} + \normalsize + \caption{La struttura \structd{utmp} contenente le informazioni di una voce + del registro di \textsl{contabilità}.} + \label{fig:sys_utmp_struct} +\end{figure} + Con \func{getutid} si può cercare una voce specifica, a seconda del valore del campo \var{ut\_type} dell'argomento \param{ut}. Questo può assumere i valori riportati in tab.~\ref{tab:sys_ut_type}, quando assume i valori -- 2.30.2