From 613d2f30d1c3ec28c569578a7b7bab23a40e8fea Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Thu, 26 Dec 2002 22:48:07 +0000 Subject: [PATCH] Altre indicizzazioni, e inizio di readdir --- filedir.tex | 38 +++++++++++++++++++++++--------------- filestd.tex | 15 +++++++-------- intro.tex | 36 ++++++++++++++++++++---------------- macro.tex | 2 ++ process.tex | 20 +++++++++++++------- system.tex | 9 +++++---- 6 files changed, 70 insertions(+), 50 deletions(-) diff --git a/filedir.tex b/filedir.tex index 84b0194..5b3b0b5 100644 --- a/filedir.tex +++ b/filedir.tex @@ -642,9 +642,11 @@ Per creare una fifo (un file speciale, su cui torneremo in dettaglio in \errval{EEXIST}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOSPC}, \errval{ENOTDIR} e \errval{EROFS}.} \end{functions} -\noindent come per \func{mknod} il file \param{pathname} non deve esistere -(neanche come link simbolico); al solito i permessi specificati da -\param{mode} vengono modificati dal valore di \var{umask}. + +La funzione crea la fifo \param{pathname} con i permessi \param{mode}. Come +per \func{mknod} il file \param{pathname} non deve esistere (neanche come link +simbolico); al solito i permessi specificati da \param{mode} vengono +modificati dal valore di \var{umask}. @@ -659,11 +661,11 @@ file usando le apposite funzioni. Pu contenuto di una directory, ad esempio per fare la lista dei file che contiene o per delle ricerche. -Per far questo nello standard POSIX\footnote{le funzioni sono previste pure in +Per far questo lo standard POSIX\footnote{le funzioni sono previste pure in BSD e SVID.} ha introdotto i cosiddetti \textit{directory streams} (chiamati così per l'analogia con i file stream di \capref{cha:files_std_interface}) ed -alcune di funzioni per la loro gestione. La prima di queste è \funcd{opendir}, -che apre uno di questi stream, il suo prototipo è: +una serie di funzioni per la loro gestione. La prima di queste è +\funcd{opendir}, il cui prototipo è: \begin{functions} \headdecl{sys/types.h} \headdecl{dirent.h} @@ -678,13 +680,15 @@ che apre uno di questi stream, il suo prototipo \end{functions} La funzione apre un \textit{directory stream} per la directory -\param{dirname}, ritornando il puntatore alla relativa struttura \ctyp{DIR} da -usare per le successive operazioni, si posiziona inoltre sulla prima voce -della directory. +\param{dirname}, ritornando il puntatore alla relativa struttura \type{DIR} +(questo è un tipo opaco\index{tipo!opaco} usato dalle librerie per gestire i +\textit{directory stream}) da usare per le successive operazioni, infine +posiziona lo stream sulla prima voce contenuta nella directory. Dato che le directory sono comunque dei file, in alcuni casi può essere utile -conoscere il file descriptor sottostante un \textit{directory stream}, ad -esempio per utilizzarlo con la funzione \func{fchdir} per cambiare la +conoscere il \textit{file descriptor} (tratteremo dei \textit{file descriptor} +in \capref{cha:file_unix_interface}) sottostante un \textit{directory stream}, +ad esempio per utilizzarlo con la funzione \func{fchdir} per cambiare la directory di lavoro (vedi \secref{sec:file_work_dir}) a quella relativa allo stream che si è aperto. A questo scopo si può usare la funzione \funcd{dirfd}, il cui prototipo è: @@ -719,10 +723,14 @@ La lettura di una voce nella directory viene effettuata attraverso la funzione \var{errno} assumerà il valore \errval{EBADF}.} \end{functions} -La funzione legge una voce dalla directory (una \textit{directory entry}, da -distinguersi da quelle della cache di cui parlavamo in \secref{sec:file_vfs}) -in un'opportuna struttura \struct{dirent} definita in -\figref{fig:file_dirent_struct}, il suo pro +La funzione legge una voce dalla directory \textit{directory + entry},\footnote{anche questa viene chiamata anche se non ha nulla a che + fare con le omonime \textit{directory entry} di cui parlavamo in + \secref{sec:file_vfs}).} in un'opportuna struttura \struct{dirent}, la cui +definizione è riportata in \figref{fig:file_dirent_struct}, che contiene i +dati relativi al file cui la voce fa riferimento. Si tenga presente che la +struttura viene sovrascritta tutte le volte che si ripete una lettura sullo +stesso \textit{directory stream}. \begin{figure}[!htb] \footnotesize diff --git a/filestd.tex b/filestd.tex index 5bf7cf4..8d6b55b 100644 --- a/filestd.tex +++ b/filestd.tex @@ -81,14 +81,13 @@ contengono tutte le informazioni necessarie a gestire le operazioni sugli stream, come la posizione corrente, lo stato del buffer e degli indicatori di stato e di fine del file. -Per questo motivo gli utenti non devono mai utilizzare direttamente o -allocare queste strutture, ma usare sempre puntatori del tipo \ctyp{FILE - *} ottenuti dalla libreria stessa (tanto che in certi casi il termine -di puntatore a file è diventato sinonimo di stream). Tutte le funzioni -della libreria che operano sui file accettano come parametri solo -variabili di questo tipo, che diventa accessibile includendo l'header -file \file{stdio.h}. - +Per questo motivo gli utenti non devono mai utilizzare direttamente o allocare +queste strutture (che sono dei \textsl{tipi opachi}\index{tipo!opaco}) ma +usare sempre puntatori del tipo \ctyp{FILE *} ottenuti dalla libreria stessa +(tanto che in certi casi il termine di puntatore a file è diventato sinonimo +di stream). Tutte le funzioni della libreria che operano sui file accettano +come parametri solo variabili di questo tipo, che diventa accessibile +includendo l'header file \file{stdio.h}. \subsection{Gli stream standard} diff --git a/intro.tex b/intro.tex index e349fe6..27a1d33 100644 --- a/intro.tex +++ b/intro.tex @@ -365,15 +365,19 @@ usare le varie estensioni al linguaggio e al preprocessore da esso supportate. Uno dei problemi di portabilità del codice più comune è quello dei tipi di dati utilizzati nei programmi, che spesso variano da sistema a sistema, o anche da una architettura ad un altra (ad esempio passando da macchine con -processori 32 bit a 64). - -Storicamente alcuni tipi di dati definiti dallo standard ANSI C sono sempre -stati associati ad alcune variabili nei sistemi Unix, ad esempio la posizione -corrente all'interno di un file è sempre stato associato ad un intero a 32 -bit, mentre il numero di dispositivo è sempre stato associato ad un intero a -16 bit. Tutto questo ovviamente costituisce un incubo per la portabilità tutte -le volte che, con l'evolversi delle piattaforme hardware, alcuni di questi -tipi si sono rivelati inadeguati, e se ne è dovuto cambiare la dimensione. +processori 32 bit a 64). In particolare questo è vero nell'uso dei cosiddetti +\textit{tipi elementari}\index{tipo!elementare} del linguaggio C (come +\ctyp{int}) la cui dimensione varia a seconda dell'architettura hardware. + +Storicamente alcuni tipi nativi dello standard ANSI C sono sempre stati +associati ad alcune variabili nei sistemi Unix, dando per scontata la +dimensione. Ad esempio la posizione corrente all'interno di un file è sempre +stata associata ad un intero a 32 bit, mentre il numero di dispositivo è +sempre stato associato ad un intero a 16 bit. Storicamente questi erano +definiti rispettivamente come \ctyp{int} e \ctyp{short}, ma tutte le volte +che, con l'evolversi ed il mutare delle piattaforme hardware, alcuni di questi +tipi si sono rivelati inadeguati o sono cambiati, ci si è trovati di fronte ad +una infinita serie di problemi di portabilità. \begin{table}[htb] \footnotesize @@ -408,10 +412,11 @@ tipi si sono rivelati inadeguati, e se ne \end{table} Per questo motivo tutte le funzioni di libreria di solito non fanno -riferimento ai tipi standard del linguaggio C, ma ad una serie di \textsl{tipi - primitivi}, riportati in \tabref{tab:intro_primitive_types}, caratteristici -di ogni sistema, definiti nell'header file \file{sys/types.h}, che associano i -tipi utilizzati dalle funzioni di sistema ai tipi elementari supportati dal +riferimento ai tipi elementari dello standard del linguaggio C, ma ad una +serie di \textsl{tipi primitivi}\index{tipo!primitivo} del sistema, riportati +in \tabref{tab:intro_primitive_types}, e definiti nell'header file +\file{sys/types.h}, in modo da mantenere completamente indipendenti i tipi +utilizzati dalle funzioni di sistema dai tipi elementari supportati dal compilatore C. @@ -440,15 +445,14 @@ identificati fra IEEE ed ISO; si tenga conto inoltre che molto spesso si usa l'estensione IEEE anche come aggiunta al nome POSIX (ad esempio si può parlare di POSIX.4 come di POSIX.1b). -Si tenga presente però che nuove specifiche e proposte di standardizzazione si -aggiungono continuamente, mentre le versioni precedenti vengono riviste; +Si tenga presente inoltre che nuove specifiche e proposte di standardizzazione +si aggiungono continuamente, mentre le versioni precedenti vengono riviste; talvolta poi i riferimenti cambiamo nome, per cui anche solo seguire le denominazioni usate diventa particolarmente faticoso; una pagina dove si possono recuperare varie (e di norma piuttosto intricate) informazioni è: \href{http://www.pasc.org/standing/sd11.html} {http://www.pasc.org/standing/sd11.html}. - \begin{table}[htb] \footnotesize \centering diff --git a/macro.tex b/macro.tex index 18f67f6..da3c35a 100644 --- a/macro.tex +++ b/macro.tex @@ -55,6 +55,7 @@ % \newenvironment{prototype}[2] {% defining what is done by \begin + \nobreak \center \begin{boxedminipage}[c]{14cm} \footnotesize @@ -90,6 +91,7 @@ % \newenvironment{functions} {% defining what is done by \begin + \nobreak \center \begin{boxedminipage}[c]{14cm} \footnotesize diff --git a/process.tex b/process.tex index 8bde54c..f29d5e3 100644 --- a/process.tex +++ b/process.tex @@ -1437,12 +1437,13 @@ stack all'indirizzo dove sono stati salvati i parametri, normale pensare di poter effettuare questa operazione. In generale però possono esistere anche realizzazioni diverse, per questo -motivo \macro{va\_list} è definito come \textsl{tipo opaco} e non può essere -assegnato direttamente ad un'altra variabile dello stesso tipo. Per risolvere -questo problema lo standard ISO C99\footnote{alcuni sistemi che non hanno - questa macro provvedono al suo posto \macro{\_\_va\_copy} che era il nome - proposto in una bozza dello standard.} ha previsto una macro ulteriore che -permette di eseguire la copia di un puntatore alla lista degli argomenti: +motivo \macro{va\_list} è definito come \textsl{tipo opaco}\index{tipo opaco} +e non può essere assegnato direttamente ad un'altra variabile dello stesso +tipo. Per risolvere questo problema lo standard ISO C99\footnote{alcuni + sistemi che non hanno questa macro provvedono al suo posto + \macro{\_\_va\_copy} che era il nome proposto in una bozza dello standard.} +ha previsto una macro ulteriore che permette di eseguire la copia di un +puntatore alla lista degli argomenti: \begin{prototype}{stdarg.h}{void va\_copy(va\_list dest, va\_list src)} Copia l'attuale valore \param{src} del puntatore alla lista degli argomenti su \param{dest}. @@ -1548,7 +1549,12 @@ salvare il contesto dello stack \end{functions} Quando si esegue la funzione il contesto corrente dello stack viene salvato -nell'argomento \param{env}, una variabile di tipo \type{jmp\_buf} che deve +nell'argomento \param{env}, una variabile di tipo +\type{jmp\_buf}\footnote{questo è un classico esempio di variabile di + \textsl{tipo opaco}\index{tipo!opaco}. Si definiscono così strutture ed + altri oggetti usati da una libreria, la cui struttura interna non deve + essere vista dal programma chiamante (da cui il nome) che li devono + utilizzare solo attraverso dalle opportune funzioni di gestione.} che deve essere stata definita in precedenza. In genere le variabili di tipo \type{jmp\_buf} vengono definite come variabili globali in modo da poter essere viste in tutte le funzioni del programma. diff --git a/system.tex b/system.tex index 03d1bed..c5e1822 100644 --- a/system.tex +++ b/system.tex @@ -1842,10 +1842,11 @@ verranno considerati nel calcolo di questi tempi. Come anticipato in \secref{sec:sys_unix_time} il \textit{calendar time} è mantenuto dal kernel in una variabile di tipo \type{time\_t}, che usualmente -corrisponde ad un tipo nativo (in Linux è un intero a 32 bit). Il valore -corrente del \textit{calendar time}, che indicheremo come \textsl{tempo di - sistema}, può essere ottenuto con la funzione \funcd{time} che lo restituisce -in nel suddetto formato; il suo prototipo è: +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 +con la funzione \funcd{time} che lo restituisce in nel suddetto formato; il +suo prototipo è: \begin{prototype}{time.h}{time\_t time(time\_t *t)} Legge il valore corrente del \textit{calendar time}. -- 2.30.2