From d88ea986fbf6b84a802fd8a5665af4324a6c89b3 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sat, 7 Dec 2002 15:57:55 +0000 Subject: [PATCH] Si prosegue con la riorganizzazione di \macro{} --- errors.tex | 28 ++-- fileadv.tex | 10 +- filedir.tex | 28 ++-- fileintro.tex | 2 +- filestd.tex | 12 +- fileunix.tex | 263 +++++++++++++++--------------- intro.tex | 24 +-- ipc.tex | 439 +++++++++++++++++++++++++------------------------- process.tex | 68 ++++---- prochand.tex | 166 +++++++++---------- session.tex | 408 +++++++++++++++++++++++----------------------- 11 files changed, 726 insertions(+), 722 deletions(-) diff --git a/errors.tex b/errors.tex index 434deca..d006491 100644 --- a/errors.tex +++ b/errors.tex @@ -44,11 +44,11 @@ gestione dei file. file che si suppone erroneamente essere esistente. \item \errcode{EIO} \textit{Input/output error}. Errore di input/output: usato per riportare errori hardware in lettura/scrittura su un dispositivo. -\item \errcode{ENXIO} \textit{No such device or address}. Device inesistente: il - sistema ha tentato di usare un dispositivo attraverso il file specificato, - ma non lo ha trovato. Può significare che il file di dispositivo non è - corretto, che il modulo relativo non è stato caricato nel kernel, o che il - dispositivo è fisicamente assente o non funzionante. +\item \errcode{ENXIO} \textit{No such device or address}. Device inesistente: + il sistema ha tentato di usare un dispositivo attraverso il file + specificato, ma non lo ha trovato. Può significare che il file di + dispositivo non è corretto, che il modulo relativo non è stato caricato nel + kernel, o che il dispositivo è fisicamente assente o non funzionante. \item \errcode{ENOEXEC} \textit{Invalid executable file format}. Il file non ha un formato eseguibile, è un errore riscontrato dalle funzioni \func{exec}. \item \errcode{EBADF} \textit{Bad file descriptor}. File descriptor non valido: @@ -62,17 +62,17 @@ gestione dei file. troppi link simbolici nella risoluzione di un pathname. \item \errcode{ENAMETOOLONG} \textit{File name too long}. Si è indicato un pathname troppo lungo. -\item \errcode{ENOTBLK} \textit{Block device required}. Si è specificato un file - che non è un \textit{block device} in un contesto in cui era necessario +\item \errcode{ENOTBLK} \textit{Block device required}. Si è specificato un + file che non è un \textit{block device} in un contesto in cui era necessario specificare un \textit{block device} (ad esempio si è tentato di montare un file ordinario). \item \errcode{EEXIST} \textit{File exists}. Si è specificato un file esistente in un contesto in cui ha senso solo specificare un nuovo file. -\item \errcode{EBUSY} \textit{Resource busy}. Una risorsa di sistema che non può - essere condivisa è occupata. Ad esempio si è tentato di cancellare la - directory su cui si è montato un filesystem. -\item \errcode{EXDEV} \textit{Cross-device link}. Si è tentato di creare un link - diretto che attraversa due filesystem differenti. +\item \errcode{EBUSY} \textit{Resource busy}. Una risorsa di sistema che non + può essere condivisa è occupata. Ad esempio si è tentato di cancellare la + directory su cui si è montato un filesystem. +\item \errcode{EXDEV} \textit{Cross-device link}. Si è tentato di creare un + link diretto che attraversa due filesystem differenti. \item \errcode{ENODEV} \textit{No such device}. Si è indicato un tipo di device sbagliato ad una funzione che ne richiede uno specifico. \item \errcode{ENOTDIR} \textit{Not a directory}. Si è specificato un file che @@ -91,8 +91,8 @@ gestione dei file. controllo relativa ad un terminale su un file che non lo è. \item \errcode{ETXTBSY} \textit{Text file busy}. Si è cercato di eseguire un file che è aperto in scrittura, o scrivere un file che è in esecuzione. -\item \errcode{EFBIG} \textit{File too big}. Si è ecceduto il limite imposto dal - sistema sulla dimensione massima che un file può avere. +\item \errcode{EFBIG} \textit{File too big}. Si è ecceduto il limite imposto + dal sistema sulla dimensione massima che un file può avere. \item \errcode{ENOSPC} \textit{No space left on device}. la directory in cui si vuole creare il link non ha spazio per ulteriori voci. \item \errcode{ESPIPE} \textit{Invalid seek operation}. diff --git a/fileadv.tex b/fileadv.tex index c73a8df..171f474 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -279,8 +279,8 @@ sostituisce i precedenti, ed aggiunge a \func{select} una nuova funzione 2.1. Le \acr{libc4} e \acr{libc5} non contengono questo header, le \acr{glibc} 2.0 contengono una definizione sbagliata di \func{psignal}, senza l'argomento \param{sigmask}, la definizione corretta è presente dalle - \acr{glibc} 2.1-2.2.1 se si è definito \const{\_GNU\_SOURCE} e nelle - \acr{glibc} 2.2.2-2.2.4 se si è definito \const{\_XOPEN\_SOURCE} con valore + \acr{glibc} 2.1-2.2.1 se si è definito \macro{\_GNU\_SOURCE} e nelle + \acr{glibc} 2.2.2-2.2.4 se si è definito \macro{\_XOPEN\_SOURCE} con valore maggiore di 600.} il cui prototipo è: \begin{prototype}{sys/select.h} {int pselect(int n, fd\_set *readfds, fd\_set *writefds, fd\_set *exceptfds, @@ -412,7 +412,7 @@ attraverso l'uso di una apposita struttura \type{aiocb} (il cui nome sta per \textit{asyncronous I/O control block}), che viene passata come argomento a tutte le funzioni dell'interfaccia. La sua definizione, come effettuata in \file{aio.h}, è riportata in \figref{fig:file_aiocb}. Nello steso file è -definita la macro \const{\_POSIX\_ASYNCHRONOUS\_IO}, che dichiara la +definita la macro \macro{\_POSIX\_ASYNCHRONOUS\_IO}, che dichiara la disponibilità dell'interfaccia per l'I/O asincrono. \begin{figure}[!htb] @@ -454,8 +454,8 @@ essere specificato l'indirizzo del buffer usato per l'I/O, ed in Il campo \var{aio\_reqprio} permette di impostare la priorità delle operazioni di I/O.\footnote{in generale perché ciò sia possibile occorre che la piattaforma supporti questa caratteristica, questo viene indicato definendo - le macro \const{\_POSIX\_PRIORITIZED\_IO}, e - \const{\_POSIX\_PRIORITY\_SCHEDULING}.} La priorità viene impostata a + le macro \macro{\_POSIX\_PRIORITIZED\_IO}, e + \macro{\_POSIX\_PRIORITY\_SCHEDULING}.} La priorità viene impostata a partire da quella del processo chiamante (vedi \secref{sec:proc_priority}), cui viene sottratto il valore di questo campo. diff --git a/filedir.tex b/filedir.tex index 1e99a28..650eb53 100644 --- a/filedir.tex +++ b/filedir.tex @@ -210,8 +210,8 @@ nello stesso filesystem) si usa invece la funzione \func{rename},\footnote{la errore, nel qual caso il file non viene toccato. La variabile \var{errno} viene impostata secondo i seguenti codici di errore: \begin{errlist} - \item[\errcode{EISDIR}] \var{newpath} è una directory mentre \var{oldpath} non - è una directory. + \item[\errcode{EISDIR}] \var{newpath} è una directory mentre \var{oldpath} + non è una directory. \item[\errcode{EXDEV}] \var{oldpath} e \var{newpath} non sono sullo stesso filesystem. \item[\errcode{ENOTEMPTY}] \var{newpath} è una directory già esistente e non @@ -454,15 +454,17 @@ accedere ai tipi usati da queste funzioni si deve includere il file \bodydesc{La funzione restituisce zero in caso di successo e -1 per un errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{EEXIST}] Un file (o una directory) con quel nome esiste di già. + \item[\errcode{EEXIST}] Un file (o una directory) con quel nome esiste di + già. \item[\errcode{EACCESS}] Non c'è il permesso di scrittura per la directory in cui si vuole inserire la nuova directory. - \item[\errcode{EMLINK}] La directory in cui si vuole creare la nuova directory - contiene troppi file. Sotto Linux questo normalmente non avviene perché il - filesystem standard consente la creazione di un numero di file maggiore di - quelli che possono essere contenuti nel disco, ma potendo avere a che - fare anche con filesystem di altri sistemi questo errore può presentarsi. + \item[\errcode{EMLINK}] La directory in cui si vuole creare la nuova + directory contiene troppi file. Sotto Linux questo normalmente non avviene + perché il filesystem standard consente la creazione di un numero di file + maggiore di quelli che possono essere contenuti nel disco, ma potendo + avere a che fare anche con filesystem di altri sistemi questo errore può + presentarsi. \item[\errcode{ENOSPC}] Non c'è abbastanza spazio sul file system per creare la nuova directory o si è esaurita la quota disco dell'utente. \end{errlist} @@ -493,9 +495,9 @@ suo prototipo directory, oppure la directory che contiene \var{dirname} ha lo sticky bit impostato e l'userid effettivo del processo non corrisponde al proprietario della directory. - \item[\errcode{EACCESS}] Non c'è il permesso di scrittura per la directory che - contiene la directory che si vuole cancellare, o non c'è il permesso di - attraversare (esecuzione) una delle directory specificate in + \item[\errcode{EACCESS}] Non c'è il permesso di scrittura per la directory + che contiene la directory che si vuole cancellare, o non c'è il permesso + di attraversare (esecuzione) una delle directory specificate in \var{dirname}. \item[\errcode{EBUSY}] La directory specificata è la directory di lavoro o la radice di qualche processo. @@ -690,8 +692,8 @@ appunto per \textit{change directory}, il suo prototipo nel qual caso \var{errno} assumerà i valori: \begin{errlist} \item[\errcode{ENOTDIR}] Non si è specificata una directory. - \item[\errcode{EACCESS}] Manca il permesso di ricerca su uno dei componenti di - \param{path}. + \item[\errcode{EACCESS}] Manca il permesso di ricerca su uno dei componenti + di \param{path}. \end{errlist} ed inoltre \const{EFAULT}, \const{ENAMETOOLONG}, \const{ENOENT}, \const{ENOMEM}, \const{ELOOP} e \const{EIO}.} diff --git a/fileintro.tex b/fileintro.tex index dfedd39..a84918a 100644 --- a/fileintro.tex +++ b/fileintro.tex @@ -1,4 +1,4 @@ -%% fileintro.tex +% fileintro.tex %% %% Copyright (C) 2000-2002 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free diff --git a/filestd.tex b/filestd.tex index 670e55b..9a5ecc6 100644 --- a/filestd.tex +++ b/filestd.tex @@ -366,7 +366,7 @@ una \func{sync} (vedi \secref{sec:file_sync}). Linux supporta anche una altra funzione, \func{fcloseall}, come estensione GNU implementata dalle \acr{glibc}, accessibile avendo definito -\const{\_GNU\_SOURCE}, il suo prototipo è: +\macro{\_GNU\_SOURCE}, il suo prototipo è: \begin{prototype}{stdio.h}{int fcloseall(void)} Chiude tutti gli stream. @@ -856,7 +856,7 @@ che eccede le dimensioni del buffer. Per questo motivo le \acr{glibc} prevedono, come estensione GNU, due nuove funzioni per la gestione dell'input/output di linea, il cui uso permette di risolvere questi problemi. L'uso di queste funzioni deve -essere attivato definendo la macro \const{\_GNU\_SOURCE} prima di +essere attivato definendo la macro \macro{\_GNU\_SOURCE} prima di includere \file{stdio.h}. La prima delle due, \func{getline}, serve per leggere una linea terminata da un newline esattamente allo stesso modo di \func{fgets}, il suo prototipo è: @@ -1140,7 +1140,7 @@ scritti sulla stringa di destinazione: Per eliminare alla radice questi problemi, le \acr{glibc} supportano una specifica estensione GNU che alloca dinamicamente tutto lo spazio necessario; -l'estensione si attiva al solito definendo \const{\_GNU\_SOURCE}, le due +l'estensione si attiva al solito definendo \macro{\_GNU\_SOURCE}, le due funzioni sono: \begin{functions} \headdecl{stdio.h} @@ -1509,8 +1509,8 @@ scelta, si pu \func{write}.} \end{prototype} \noindent anche di questa funzione esiste una analoga -\func{fflush\_unlocked}\footnote{accessibile definendo \const{\_BSD\_SOURCE} o - \const{\_SVID\_SOURCE} o \const{\_GNU\_SOURCE}.} che non effettua il blocco +\func{fflush\_unlocked}\footnote{accessibile definendo \macro{\_BSD\_SOURCE} o + \macro{\_SVID\_SOURCE} o \macro{\_GNU\_SOURCE}.} che non effettua il blocco dello stream. Se \param{stream} è \val{NULL} lo scarico dei dati è forzato per tutti gli @@ -1565,7 +1565,7 @@ Ci sono comunque situazioni in cui questo non basta, come quando un thread necessita di compiere più di una operazione sullo stream atomicamente, per questo motivo le librerie provvedono anche delle funzioni che permettono la gestione esplicita dei blocchi sugli stream; queste funzioni sono disponibili -definendo \const{\_POSIX\_THREAD\_SAFE\_FUNCTIONS} ed i loro prototipi sono: +definendo \macro{\_POSIX\_THREAD\_SAFE\_FUNCTIONS} ed i loro prototipi sono: \begin{functions} \headdecl{stdio.h} diff --git a/fileunix.tex b/fileunix.tex index dde9889..f0243d4 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -135,11 +135,11 @@ posto di questi valori numerici: \textbf{Costante} & \textbf{Significato} \\ \hline \hline - \macro{STDIN\_FILENO} & \textit{file descriptor} dello \textit{standard + \const{STDIN\_FILENO} & \textit{file descriptor} dello \textit{standard input} \\ - \macro{STDOUT\_FILENO} & \textit{file descriptor} dello \textit{standard + \const{STDOUT\_FILENO} & \textit{file descriptor} dello \textit{standard output} \\ - \macro{STDERR\_FILENO} & \textit{file descriptor} dello \textit{standard + \const{STDERR\_FILENO} & \textit{file descriptor} dello \textit{standard error}\\ \hline \end{tabular} @@ -197,26 +197,26 @@ prototipo caso di errore. In questo caso la variabile \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\macro{EEXIST}] \var{pathname} esiste e si è specificato - \macro{O\_CREAT} e \macro{O\_EXCL}. - \item[\macro{EISDIR}] \var{pathname} indica una directory e si è tentato + \item[\errcode{EEXIST}] \var{pathname} esiste e si è specificato + \const{O\_CREAT} e \const{O\_EXCL}. + \item[\errcode{EISDIR}] \var{pathname} indica una directory e si è tentato l'accesso in scrittura. - \item[\macro{ENOTDIR}] si è specificato \macro{O\_DIRECTORY} e \var{pathname} + \item[\errcode{ENOTDIR}] si è specificato \const{O\_DIRECTORY} e \var{pathname} non è una directory. - \item[\macro{ENXIO}] si sono impostati \macro{O\_NOBLOCK} o \macro{O\_WRONLY} + \item[\errcode{ENXIO}] si sono impostati \const{O\_NOBLOCK} o \const{O\_WRONLY} ed il file è una fifo che non viene letta da nessun processo o \var{pathname} è un file di dispositivo ma il dispositivo è assente. - \item[\macro{ENODEV}] \var{pathname} si riferisce a un file di dispositivo + \item[\errcode{ENODEV}] \var{pathname} si riferisce a un file di dispositivo che non esiste. - \item[\macro{ETXTBSY}] si è cercato di accedere in scrittura all'immagine di - un programma in esecuzione. - \item[\macro{ELOOP}] si sono incontrati troppi link simbolici nel risolvere - pathname o si è indicato \macro{O\_NOFOLLOW} e \var{pathname} è un link + \item[\errcode{ETXTBSY}] si è cercato di accedere in scrittura all'immagine + di un programma in esecuzione. + \item[\errcode{ELOOP}] si sono incontrati troppi link simbolici nel risolvere + pathname o si è indicato \const{O\_NOFOLLOW} e \var{pathname} è un link simbolico. \end{errlist} - ed inoltre \macro{EACCES}, \macro{ENAMETOOLONG}, \macro{ENOENT}, - \macro{EROFS}, \macro{EFAULT}, \macro{ENOSPC}, \macro{ENOMEM}, - \macro{EMFILE} e \macro{ENFILE}.} + ed inoltre \const{EACCES}, \const{ENAMETOOLONG}, \const{ENOENT}, + \const{EROFS}, \const{EFAULT}, \const{ENOSPC}, \const{ENOMEM}, + \const{EMFILE} e \const{ENFILE}.} \end{functions} La funzione apre il file, usando il primo file descriptor libero, e crea @@ -231,69 +231,69 @@ sempre il file descriptor con il valore pi \textbf{Flag} & \textbf{Descrizione} \\ \hline \hline % modalità di accesso al file - \macro{O\_RDONLY} & apre il file in sola lettura. \\ - \macro{O\_WRONLY} & apre il file in sola scrittura. \\ - \macro{O\_RDWR} & apre il file in lettura/scrittura. \\ + \const{O\_RDONLY} & apre il file in sola lettura. \\ + \const{O\_WRONLY} & apre il file in sola scrittura. \\ + \const{O\_RDWR} & apre il file in lettura/scrittura. \\ \hline % modalità di apertura del file \hline - \macro{O\_CREAT} & se il file non esiste verrà creato, con le regole di + \const{O\_CREAT} & se il file non esiste verrà creato, con le regole di titolarità del file viste in \secref{sec:file_ownership}. Il parametro \var{mode} deve essere specificato. \\ - \macro{O\_EXCL} & usato in congiunzione con \macro{O\_CREAT} fa sì che + \const{O\_EXCL} & usato in congiunzione con \const{O\_CREAT} fa sì che l'esistenza del file diventi un errore\protect\footnotemark\ che fa fallire - \func{open} con \macro{EEXIST}. \\ - \macro{O\_NONBLOCK} & apre il file in modalità non bloccante. Questo + \func{open} con \errcode{EEXIST}. \\ + \const{O\_NONBLOCK} & apre il file in modalità non bloccante. Questo valore specifica anche una modalità di operazione (vedi sotto), e comporta che \func{open} ritorni immediatamente (l'opzione ha senso solo per le fifo, torneremo questo in \secref{sec:ipc_named_pipe}). \\ - \macro{O\_NOCTTY} & se \var{pathname} si riferisce ad un device di + \const{O\_NOCTTY} & se \var{pathname} si riferisce ad un device di terminale, questo non diventerà il terminale di controllo, anche se il processo non ne ha ancora uno (si veda \secref{sec:sess_ctrl_term}). \\ - \macro{O\_SHLOCK} & opzione di BSD, acquisisce uno shared lock (vedi + \const{O\_SHLOCK} & opzione di BSD, acquisisce uno shared lock (vedi \secref{sec:file_locking}) sul file. Non è disponibile in Linux. \\ - \macro{O\_EXLOCK} & opzione di BSD, acquisisce uno lock esclusivo (vedi + \const{O\_EXLOCK} & opzione di BSD, acquisisce uno lock esclusivo (vedi \secref{sec:file_locking}) sul file. Non è disponibile in Linux. \\ - \macro{O\_TRUNC} & se il file esiste ed è un file di dati e la modalità di + \const{O\_TRUNC} & se il file esiste ed è un file di dati e la modalità di apertura consente la scrittura, allora la sua lunghezza verrà troncata a zero. Se il file è un terminale o una fifo il flag verrà ignorato, negli altri casi il comportamento non è specificato. \\ - \macro{O\_NOFOLLOW} & se \var{pathname} è un link simbolico la chiamata + \const{O\_NOFOLLOW} & se \var{pathname} è un link simbolico la chiamata fallisce. Questa è un'estensione BSD aggiunta in Linux dal kernel 2.1.126. Nelle versioni precedenti i link simbolici sono sempre seguiti, e questa opzione è ignorata. \\ - \macro{O\_DIRECTORY} & se \var{pathname} non è una directory la chiamata + \const{O\_DIRECTORY} & se \var{pathname} non è una directory la chiamata fallisce. Questo flag è specifico di Linux ed è stato introdotto con il kernel 2.1.126 per evitare dei \textit{DoS}\index{DoS}\protect\footnotemark\ quando \func{opendir} viene chiamata su una fifo o su un device di unità a nastri, non deve essere utilizzato al di fuori dell'implementazione di \func{opendir}. \\ - \macro{O\_LARGEFILE} & nel caso di sistemi a 32 bit che supportano file di + \const{O\_LARGEFILE} & nel caso di sistemi a 32 bit che supportano file di grandi dimensioni consente di aprire file le cui dimensioni non possono essere rappresentate da numeri a 31 bit. \\ \hline \hline % modalità di operazione col file - \macro{O\_APPEND} & il file viene aperto in append mode. Prima di ciascuna + \const{O\_APPEND} & il file viene aperto in append mode. Prima di ciascuna scrittura la posizione corrente viene sempre impostata alla fine del file. Può causare corruzione del file con NFS se più di un processo scrive allo stesso tempo.\footnotemark\\ - \macro{O\_NONBLOCK} & il file viene aperto in modalità non bloccante per + \const{O\_NONBLOCK} & il file viene aperto in modalità non bloccante per le operazioni di I/O (che tratteremo in \secref{sec:file_noblocking}): questo significa il fallimento di \func{read} in assenza di dati da leggere e quello di \func{write} in caso di impossibilità di scrivere immediatamente. Questa modalità ha senso solo per le fifo e per alcuni file di dispositivo. \\ - \macro{O\_NDELAY} & in Linux\footnotemark\ è sinonimo di - \macro{O\_NONBLOCK}.\\ - \macro{O\_ASYNC} & apre il file per l'I/O in modalità + \const{O\_NDELAY} & in Linux\footnotemark\ è sinonimo di + \const{O\_NONBLOCK}.\\ + \const{O\_ASYNC} & apre il file per l'I/O in modalità asincrona (vedi \secref{sec:file_asyncronous_io}). Quando è impostato viene - generato il segnale \macro{SIGIO} tutte le volte che sono disponibili + generato il segnale \const{SIGIO} tutte le volte che sono disponibili dati in input sul file. \\ - \macro{O\_SYNC} & apre il file per l'input/output sincrono, ogni + \const{O\_SYNC} & apre il file per l'input/output sincrono, ogni \func{write} bloccherà fino al completamento della scrittura di tutti dati sul sull'hardware sottostante.\\ - \macro{O\_FSYNC} & sinonimo di \macro{O\_SYNC}. \\ - \macro{O\_NOATIME} & blocca l'aggiornamento dei tempi dei di accesso dei + \const{O\_FSYNC} & sinonimo di \const{O\_SYNC}. \\ + \const{O\_NOATIME} & blocca l'aggiornamento dei tempi dei di accesso dei file (vedi \secref{sec:file_file_times}). In Linux questa opzione non è disponibile per il singolo file ma come opzione per il filesystem in fase di montaggio.\\ @@ -373,7 +373,7 @@ secondo le tre modalit ciascuno di questi bit. Dette costanti possono essere combinate fra di loro con un OR aritmetico per costruire il valore (in forma di maschera binaria) dell'argomento \param{flags} da passare alla \func{open} per specificarne il -comportamento. I due flag \macro{O\_NOFOLLOW} e \macro{O\_DIRECTORY} sono +comportamento. I due flag \const{O\_NOFOLLOW} e \const{O\_DIRECTORY} sono estensioni specifiche di Linux, e deve essere definita la macro \macro{\_GNU\_SOURCE} per poterli usare. @@ -401,10 +401,10 @@ descriptor ritorna disponibile; il suo prototipo \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di errore, ed in questo caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\macro{EBADF}] \var{fd} non è un descrittore valido. - \item[\macro{EINTR}] la funzione è stata interrotta da un segnale. + \item[\errcode{EBADF}] \var{fd} non è un descrittore valido. + \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale. \end{errlist} - ed inoltre \macro{EIO}.} + ed inoltre \const{EIO}.} \end{prototype} La chiusura di un file rilascia ogni blocco (il \textit{file locking} è @@ -445,7 +445,7 @@ positivo come numero di byte dall'inizio del file. Tutte le operazioni di lettura e scrittura avvengono a partire da questa posizione che viene automaticamente spostata in avanti del numero di byte letti o scritti. -In genere (a meno di non avere richiesto la modalità \macro{O\_APPEND}) questa +In genere (a meno di non avere richiesto la modalità \const{O\_APPEND}) questa posizione viene impostata a zero all'apertura del file. È possibile impostarla ad un valore qualsiasi con la funzione \func{lseek}, il cui prototipo è: \begin{functions} @@ -458,25 +458,25 @@ ad un valore qualsiasi con la funzione \func{lseek}, il cui prototipo successo e -1 in caso di errore nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\macro{ESPIPE}] \param{fd} è una pipe, un socket o una fifo. - \item[\macro{EINVAL}] \param{whence} non è un valore valido. + \item[\errcode{ESPIPE}] \param{fd} è una pipe, un socket o una fifo. + \item[\errcode{EINVAL}] \param{whence} non è un valore valido. \end{errlist} - ed inoltre \macro{EBADF}.} + ed inoltre \const{EBADF}.} \end{functions} La nuova posizione è impostata usando il valore specificato da \param{offset}, sommato al riferimento dato da \param{whence}; quest'ultimo può assumere i seguenti valori\footnote{per compatibilità con alcune vecchie notazioni questi valori possono essere rimpiazzati rispettivamente con 0, 1 e 2 o con - \macro{L\_SET}, \macro{L\_INCR} e \macro{L\_XTND}.}: + \const{L\_SET}, \const{L\_INCR} e \const{L\_XTND}.}: \begin{basedescript}{\desclabelwidth{2.0cm}} -\item[\macro{SEEK\_SET}] si fa riferimento all'inizio del file: il valore +\item[\const{SEEK\_SET}] si fa riferimento all'inizio del file: il valore (sempre positivo) di \param{offset} indica direttamente la nuova posizione corrente. -\item[\macro{SEEK\_CUR}] si fa riferimento alla posizione corrente del file: +\item[\const{SEEK\_CUR}] si fa riferimento alla posizione corrente del file: ad essa viene sommato \param{offset} (che può essere negativo e positivo) per ottenere la nuova posizione corrente. -\item[\macro{SEEK\_END}] si fa riferimento alla fine del file: alle dimensioni +\item[\const{SEEK\_END}] si fa riferimento alla fine del file: alle dimensioni del file viene sommato \param{offset} (che può essere negativo e positivo) per ottenere la nuova posizione corrente. \end{basedescript} @@ -491,7 +491,7 @@ Dato che la funzione ritorna la nuova posizione, usando il valore zero per \param{offset} si può riottenere la posizione corrente nel file chiamando la funzione con \code{lseek(fd, 0, SEEK\_CUR)}. -Si tenga presente inoltre che usare \macro{SEEK\_END} non assicura affatto che +Si tenga presente inoltre che usare \const{SEEK\_END} non assicura affatto che la successiva scrittura avvenga alla fine del file, infatti se questo è stato aperto anche da un altro processo che vi ha scritto, la fine del file può essersi spostata, ma noi scriveremo alla posizione impostata in precedenza @@ -499,10 +499,10 @@ essersi spostata, ma noi scriveremo alla posizione impostata in precedenza \index{race condition}, vedi \secref{sec:file_atomic}). Non tutti i file supportano la capacità di eseguire una \func{lseek}, in -questo caso la funzione ritorna l'errore \macro{EPIPE}. Questo, oltre che per +questo caso la funzione ritorna l'errore \errcode{EPIPE}. Questo, oltre che per i tre casi citati nel prototipo, vale anche per tutti quei dispositivi che non supportano questa funzione, come ad esempio per i file di -terminale.\footnote{altri sistemi, usando \macro{SEEK\_SET}, in questo caso +terminale.\footnote{altri sistemi, usando \const{SEEK\_SET}, in questo caso ritornano il numero di caratteri che vi sono stati scritti.} Lo standard POSIX però non specifica niente in proposito. Infine alcuni file speciali, ad esempio \file{/dev/null}, non causano un errore ma restituiscono un valore @@ -523,13 +523,13 @@ prototipo \bodydesc{La funzione ritorna il numero di byte letti in caso di successo e -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\macro{EINTR}] la funzione è stata interrotta da un segnale prima di + \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale prima di aver potuto leggere qualsiasi dato. - \item[\macro{EAGAIN}] la funzione non aveva nessun dato da restituire e si - era aperto il file in modalità \macro{O\_NONBLOCK}. + \item[\errcode{EAGAIN}] la funzione non aveva nessun dato da restituire e si + era aperto il file in modalità \const{O\_NONBLOCK}. \end{errlist} - ed inoltre \macro{EBADF}, \macro{EIO}, \macro{EISDIR}, \macro{EBADF}, - \macro{EINVAL} e \macro{EFAULT} ed eventuali altri errori dipendenti dalla + ed inoltre \const{EBADF}, \const{EIO}, \const{EISDIR}, \const{EBADF}, + \const{EINVAL} e \const{EFAULT} ed eventuali altri errori dipendenti dalla natura dell'oggetto connesso a \var{fd}.} \end{prototype} @@ -569,18 +569,18 @@ come vedremo in \secref{sec:sock_io_behav}), o per la lettura da certi file di dispositivo, come le unità a nastro, che restituiscono sempre i dati ad un singolo blocco alla volta. -In realtà anche le due condizioni segnalate dagli errori \macro{EINTR} e -\macro{EAGAIN} non sono errori. La prima si verifica quando la \func{read} è +In realtà anche le due condizioni segnalate dagli errori \errcode{EINTR} e +\errcode{EAGAIN} non sono errori. La prima si verifica quando la \func{read} è bloccata in attesa di dati in ingresso e viene interrotta da un segnale; in tal caso l'azione da intraprendere è quella di rieseguire la funzione. Torneremo in dettaglio sull'argomento in \secref{sec:sig_gen_beha}. La seconda si verifica quando il file è in modalità non bloccante (vedi \secref{sec:file_noblocking}) e non ci sono dati in ingresso: la funzione -allora ritorna immediatamente con un errore \macro{EAGAIN}\footnote{sotto BSD - per questo errore viene usata la costante \macro{EWOULDBLOCK}, in Linux, con - le glibc, questa è sinonima di \macro{EAGAIN}.} che indica soltanto che -occorrerà provare a ripetere la lettura. +allora ritorna immediatamente con un errore \errcode{EAGAIN}\footnote{sotto + BSD per questo errore viene usata la costante \errcode{EWOULDBLOCK}, in + Linux, con le glibc, questa è sinonima di \errcode{EAGAIN}.} che indica +soltanto che occorrerà provare a ripetere la lettura. La funzione \func{read} è una delle system call fondamentali, esistenti fin dagli albori di Unix, ma nella seconda versione delle \textit{Single Unix @@ -627,29 +627,29 @@ scrivere su di esso utilizzando la funzione \func{write}, il cui prototipo \bodydesc{La funzione ritorna il numero di byte scritti in caso di successo e -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\macro{EINVAL}] \var{fd} è connesso ad un oggetto che non consente la + \item[\errcode{EINVAL}] \var{fd} è connesso ad un oggetto che non consente la scrittura. - \item[\macro{EFBIG}] si è cercato di scrivere oltre la dimensione massima + \item[\errcode{EFBIG}] si è cercato di scrivere oltre la dimensione massima consentita dal filesystem o il limite per le dimensioni dei file del processo o su una posizione oltre il massimo consentito. - \item[\macro{EPIPE}] \var{fd} è connesso ad una pipe il cui altro capo è + \item[\errcode{EPIPE}] \var{fd} è connesso ad una pipe il cui altro capo è chiuso in lettura; in questo caso viene anche generato il segnale - \macro{SIGPIPE}, se questo viene gestito (o bloccato o ignorato) la + \const{SIGPIPE}, se questo viene gestito (o bloccato o ignorato) la funzione ritorna questo errore. - \item[\macro{EINTR}] la funzione è stata interrotta da un segnale prima di + \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale prima di aver potuto scrivere qualsiasi dato. - \item[\macro{EAGAIN}] la funzione non aveva nessun dato da restituire e si - era aperto il file in modalità \macro{O\_NONBLOCK}. + \item[\errcode{EAGAIN}] la funzione non aveva nessun dato da restituire e si + era aperto il file in modalità \const{O\_NONBLOCK}. \end{errlist} - ed inoltre \macro{EBADF}, \macro{EIO}, \macro{EISDIR}, \macro{EBADF}, - \macro{ENOSPC}, \macro{EINVAL} e \macro{EFAULT} ed eventuali altri errori + ed inoltre \const{EBADF}, \const{EIO}, \const{EISDIR}, \const{EBADF}, + \const{ENOSPC}, \const{EINVAL} e \const{EFAULT} ed eventuali altri errori dipendenti dalla natura dell'oggetto connesso a \var{fd}.} \end{prototype} Come nel caso di \func{read} la funzione tenta di scrivere \var{count} byte a partire dalla posizione corrente nel file e sposta automaticamente la posizione in avanti del numero di byte scritti. Se il file è aperto in -modalità \macro{O\_APPEND} i dati vengono sempre scritti alla fine del file. +modalità \const{O\_APPEND} i dati vengono sempre scritti alla fine del file. Lo standard POSIX richiede che i dati scritti siano immediatamente disponibili ad una \func{read} chiamata dopo che la \func{write} che li ha scritti è ritornata; ma dati i meccanismi di caching non è detto che tutti i filesystem @@ -720,7 +720,7 @@ stesso file, in particolare occorre tenere presente che: \func{write} la posizione corrente sarà cambiata solo nel processo. Se la scrittura eccede la dimensione corrente del file questo verrà esteso automaticamente con l'aggiornamento del campo \var{i\_size} nell'inode. -\item se un file è in modalità \macro{O\_APPEND} tutte le volte che viene +\item se un file è in modalità \const{O\_APPEND} tutte le volte che viene effettuata una scrittura la posizione corrente viene prima impostata alla dimensione corrente del file letta dall'inode. Dopo la scrittura il file viene automaticamente esteso. @@ -756,7 +756,7 @@ Si noti inoltre che anche i flag di stato del file (quelli impostati dall'argomento \param{flag} di \func{open}) essendo tenuti nella voce della \textit{file table}\footnote{per la precisione nel campo \var{f\_flags} di \var{file}.}, vengono in questo caso condivisi. Ai file però sono associati -anche altri flag, dei quali l'unico usato al momento è \macro{FD\_CLOEXEC}, +anche altri flag, dei quali l'unico usato al momento è \const{FD\_CLOEXEC}, detti \textit{file descriptor flags}. Questi ultimi sono tenuti invece in \var{file\_struct}, e perciò sono specifici di ciascun processo e non vengono modificati dalle azioni degli altri anche in caso di condivisione della stessa @@ -792,7 +792,7 @@ sovrascriver Il problema è che usare due system call in successione non è un'operazione atomica; il problema è stato risolto introducendo la modalità -\macro{O\_APPEND}. In questo caso infatti, come abbiamo descritto in +\const{O\_APPEND}. In questo caso infatti, come abbiamo descritto in precedenza, è il kernel che aggiorna automaticamente la posizione alla fine del file prima di effettuare la scrittura, e poi estende il file. Tutto questo avviene all'interno di una singola system call (la \func{write}) che non @@ -807,7 +807,7 @@ parte di un altro processo che crea lo stesso file fra il controllo e la creazione. Per questo motivo sono stati introdotti per \func{open} i due flag -\macro{O\_CREAT} e \macro{O\_EXCL}. In questo modo l'operazione di controllo +\const{O\_CREAT} e \const{O\_EXCL}. In questo modo l'operazione di controllo dell'esistenza del file (con relativa uscita dalla funzione con un errore) e creazione in caso di assenza, diventa atomica essendo svolta tutta all'interno di una singola system call (per i dettagli sull'uso di questa caratteristica @@ -865,10 +865,10 @@ usare le due funzioni \func{fsync} e \func{fdatasync}, i cui prototipi sono: \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di errore, nel qual caso \var{errno} assume i valori: \begin{errlist} - \item[\macro{EINVAL}] \param{fd} è un file speciale che non supporta la + \item[\errcode{EINVAL}] \param{fd} è un file speciale che non supporta la sincronizzazione. \end{errlist} - ed inoltre \macro{EBADF}, \macro{EROFS} e \macro{EIO}.} + ed inoltre \const{EBADF}, \const{EROFS} e \const{EIO}.} \end{functions} Entrambe le funzioni forzano la sincronizzazione col disco di tutti i dati del @@ -901,8 +901,8 @@ prototipo -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\macro{EBADF}] \param{oldfd} non è un file aperto. - \item[\macro{EMFILE}] si è raggiunto il numero massimo consentito di file + \item[\errcode{EBADF}] \param{oldfd} non è un file aperto. + \item[\errcode{EMFILE}] si è raggiunto il numero massimo consentito di file descriptor aperti. \end{errlist}} \end{prototype} @@ -954,9 +954,9 @@ prototipo \bodydesc{La funzione ritorna il nuovo file descriptor in caso di successo e -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\macro{EBADF}] \param{oldfd} non è un file aperto o \param{newfd} ha un - valore fuori dall'intervallo consentito per i file descriptor. - \item[\macro{EMFILE}] si è raggiunto il numero massimo consentito di file + \item[\errcode{EBADF}] \param{oldfd} non è un file aperto o \param{newfd} ha + un valore fuori dall'intervallo consentito per i file descriptor. + \item[\errcode{EMFILE}] si è raggiunto il numero massimo consentito di file descriptor aperti. \end{errlist}} \end{prototype} @@ -966,7 +966,7 @@ sar La duplicazione dei file descriptor può essere effettuata anche usando la funzione di controllo dei file \func{fnctl} (che esamineremo in -\secref{sec:file_fcntl}) con il parametro \macro{F\_DUPFD}. +\secref{sec:file_fcntl}) con il parametro \const{F\_DUPFD}. L'operazione ha la sintassi \code{fnctl(oldfd, F\_DUPFD, newfd)} e se si usa 0 come valore per \param{newfd} diventa equivalente a \func{dup}. La sola @@ -997,7 +997,7 @@ file descriptor viene usata la funzione \func{fcntl} il cui prototipo codice dell'errore è restituito nella variabile \var{errno}; i codici possibili dipendono dal tipo di operazione, l'unico valido in generale è: \begin{errlist} - \item[\macro{EBADF}] \param{fd} non è un file aperto. + \item[\errcode{EBADF}] \param{fd} non è un file aperto. \end{errlist}} \end{functions} @@ -1006,68 +1006,68 @@ Il comportamento di questa funzione un esempio per la duplicazione dei file descriptor, una lista dei possibili valori è riportata di seguito: \begin{basedescript}{\desclabelwidth{2.0cm}} -\item[\macro{F\_DUPFD}] trova il primo file descriptor disponibile di valore +\item[\const{F\_DUPFD}] trova il primo file descriptor disponibile di valore maggiore o uguale ad \param{arg} e ne fa una copia di \var{fd}. In caso di successo ritorna il nuovo file descriptor. Gli errori possibili sono - \macro{EINVAL} se \param{arg} è negativo o maggiore del massimo consentito o - \macro{EMFILE} se il processo ha già raggiunto il massimo numero di + \errcode{EINVAL} se \param{arg} è negativo o maggiore del massimo consentito + o \errcode{EMFILE} se il processo ha già raggiunto il massimo numero di descrittori consentito. -\item[\macro{F\_SETFD}] imposta il valore del \textit{file descriptor flag} al +\item[\const{F\_SETFD}] imposta il valore del \textit{file descriptor flag} al valore specificato con \param{arg}. Al momento l'unico bit usato è quello di \textit{close-on-exec}\index{close-on-exec}, identificato dalla costante - \macro{FD\_CLOEXEC}, che serve a richiedere che il file venga chiuso nella + \const{FD\_CLOEXEC}, che serve a richiedere che il file venga chiuso nella esecuzione di una \func{exec} (vedi \secref{sec:proc_exec}). -\item[\macro{F\_GETFD}] ritorna il valore del \textit{file descriptor flag} di - \var{fd}, se \macro{FD\_CLOEXEC} è impostato i file descriptor aperti +\item[\const{F\_GETFD}] ritorna il valore del \textit{file descriptor flag} di + \var{fd}, se \const{FD\_CLOEXEC} è impostato i file descriptor aperti vengono chiusi attraverso una \func{exec} altrimenti (il comportamento predefinito) restano aperti. -\item[\macro{F\_GETFL}] ritorna il valore del \textit{file status flag}, +\item[\const{F\_GETFL}] ritorna il valore del \textit{file status flag}, permette cioè di rileggere quei bit impostati da \func{open} all'apertura del file che vengono memorizzati (quelli riportati nella prima e terza sezione di \tabref{tab:file_open_flags}). -\item[\macro{F\_SETFL}] imposta il \textit{file status flag} al valore +\item[\const{F\_SETFL}] imposta il \textit{file status flag} al valore specificato da \param{arg}, possono essere impostati solo i bit riportati nella terza sezione di \tabref{tab:file_open_flags}.\footnote{la pagina di - manuale riporta come impostabili solo \macro{O\_APPEND}, - \macro{O\_NONBLOCK} e \macro{O\_ASYNC}.} -\item[\macro{F\_GETLK}] richiede un controllo sul file lock specificato da + manuale riporta come impostabili solo \const{O\_APPEND}, + \const{O\_NONBLOCK} e \const{O\_ASYNC}.} +\item[\const{F\_GETLK}] richiede un controllo sul file lock specificato da \param{lock}, sovrascrivendo la struttura da esso puntata con il risultato (questa funzionalità è trattata in dettaglio in \secref{sec:file_posix_lock}). -\item[\macro{F\_SETLK}] richiede o rilascia un file lock a seconda di quanto +\item[\const{F\_SETLK}] richiede o rilascia un file lock a seconda di quanto specificato nella struttura puntata da \param{lock}. Se il lock è tenuto da qualcun'altro ritorna immediatamente restituendo -1 e imposta \var{errno} a - \macro{EACCES} o \macro{EAGAIN} (questa funzionalità è trattata in dettaglio - in \secref{sec:file_posix_lock}). -\item[\macro{F\_SETLKW}] identica a \macro{F\_SETLK} eccetto per il fatto che + \errcode{EACCES} o \errcode{EAGAIN} (questa funzionalità è trattata in + dettaglio in \secref{sec:file_posix_lock}). +\item[\const{F\_SETLKW}] identica a \const{F\_SETLK} eccetto per il fatto che la funzione non ritorna subito ma attende che il blocco sia rilasciato. Se l'attesa viene interrotta da un segnale la funzione restituisce -1 e imposta - \var{errno} a \macro{EINTR} (questa funzionalità è trattata in dettaglio in + \var{errno} a \errcode{EINTR} (questa funzionalità è trattata in dettaglio in \secref{sec:file_posix_lock}). -\item[\macro{F\_GETOWN}] restituisce il \acr{pid} del processo o il process - group che è preposto alla ricezione dei segnali \macro{SIGIO} e - \macro{SIGURG} per gli eventi associati al file descriptor \var{fd}. Il +\item[\const{F\_GETOWN}] restituisce il \acr{pid} del processo o il process + group che è preposto alla ricezione dei segnali \const{SIGIO} e + \const{SIGURG} per gli eventi associati al file descriptor \var{fd}. Il process group è restituito come valore negativo. -\item[\macro{F\_SETOWN}] imposta il processo o process group che riceverà i - segnali \macro{SIGIO} e \macro{SIGURG} per gli eventi associati al file +\item[\const{F\_SETOWN}] imposta il processo o process group che riceverà i + segnali \const{SIGIO} e \const{SIGURG} per gli eventi associati al file descriptor \var{fd}. I process group sono impostati usando valori negativi. -\item[\macro{F\_GETSIG}] restituisce il valore del segnale mandato quando ci +\item[\const{F\_GETSIG}] restituisce il valore del segnale mandato quando ci sono dati disponibili in input su un file descriptor aperto o impostato in I/O asincrono. Il valore 0 indica il valore predefinito (che è - \macro{SIGIO}), un valore diverso da zero indica il segnale richiesto, (che - può essere lo stesso \macro{SIGIO}). -\item[\macro{F\_SETSIG}] imposta il segnale da inviare quando diventa + \const{SIGIO}), un valore diverso da zero indica il segnale richiesto, (che + può essere lo stesso \const{SIGIO}). +\item[\const{F\_SETSIG}] imposta il segnale da inviare quando diventa possibile effettuare I/O sul file descriptor in caso di I/O asincrono. Il - valore zero indica di usare il segnale predefinito, \macro{SIGIO}. Un altro - valore (compreso lo stesso \macro{SIGIO}) specifica il segnale voluto; l'uso + valore zero indica di usare il segnale predefinito, \const{SIGIO}. Un altro + valore (compreso lo stesso \const{SIGIO}) specifica il segnale voluto; l'uso di un valore diverso da zero permette inoltre, se si è installato il manipolatore del segnale come \var{sa\_sigaction} usando - \macro{SA\_SIGINFO}, (vedi \secref{sec:sig_sigaction}), di rendere + \const{SA\_SIGINFO}, (vedi \secref{sec:sig_sigaction}), di rendere disponibili al manipolatore informazioni ulteriori informazioni riguardo il file che ha generato il segnale attraverso i valori restituiti in \type{siginfo\_t} (come vedremo in - \secref{sec:file_asyncronous_io}).\footnote{i due comandi \macro{F\_SETSIG} - e \macro{F\_GETSIG} sono una estensione specifica di Linux.} + \secref{sec:file_asyncronous_io}).\footnote{i due comandi \const{F\_SETSIG} + e \const{F\_GETSIG} sono una estensione specifica di Linux.} \end{basedescript} La maggior parte delle funzionalità di \func{fcntl} sono troppo avanzate per @@ -1078,11 +1078,11 @@ riprenderemo le tematiche relative all'I/O asincrono in \secref{sec:file_locking}). Per determinare le modalità di accesso inoltre è necessario estrarre i bit di -accesso (ottenuti con il comando \macro{F\_GETFL}); infatti la definizione -corrente non assegna bit separati a \macro{O\_RDONLY}, \macro{O\_WRONLY} e -\macro{O\_RDWR},\footnote{posti rispettivamente ai valori 0, 1 e 2.} per cui il +accesso (ottenuti con il comando \const{F\_GETFL}); infatti la definizione +corrente non assegna bit separati a \const{O\_RDONLY}, \const{O\_WRONLY} e +\const{O\_RDWR},\footnote{posti rispettivamente ai valori 0, 1 e 2.} per cui il valore si ottiene eseguendo un AND binario del valore di ritorno di -\func{fcntl} con la maschera \macro{O\_ACCMODE} anch'essa definita in +\func{fcntl} con la maschera \const{O\_ACCMODE} anch'essa definita in \file{fcntl.h}. @@ -1112,12 +1112,13 @@ per ogni singolo dispositivo. Il prototipo di questa funzione caso di errore viene sempre restituito -1 ed \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\macro{ENOTTY}] il file \param{fd} non è associato con un device, o la - richiesta non è applicabile all'oggetto a cui fa riferimento \param{fd}. - \item[\macro{EINVAL}] gli argomenti \param{request} o \param{argp} non sono + \item[\errcode{ENOTTY}] il file \param{fd} non è associato con un device, o + la richiesta non è applicabile all'oggetto a cui fa riferimento + \param{fd}. + \item[\errcode{EINVAL}] gli argomenti \param{request} o \param{argp} non sono validi. \end{errlist} - ed inoltre \macro{EBADF} e \macro{EFAULT}.} + ed inoltre \const{EBADF} e \const{EFAULT}.} \end{prototype} La funzione serve in sostanza per fare tutte quelle operazioni che non si @@ -1155,10 +1156,10 @@ specifici (ad esempio la gestione dei terminali \func{ioctl} in quasi tutte le implementazioni di Unix), qui riportiamo solo i valori che sono definiti per ogni file: \begin{basedescript}{\desclabelwidth{2.0cm}} -\item[\macro{FIOCLEX}] Imposta il bit di \textit{close on exec}. -\item[\macro{FIONCLEX}] Cancella il bit di \textit{close on exec}. -\item[\macro{FIOASYNC}] Abilita l'I/O asincrono. -\item[\macro{FIONBIO}] Abilita l'I/O in modalità non bloccante. +\item[\const{FIOCLEX}] Imposta il bit di \textit{close on exec}. +\item[\const{FIONCLEX}] Cancella il bit di \textit{close on exec}. +\item[\const{FIOASYNC}] Abilita l'I/O asincrono. +\item[\const{FIONBIO}] Abilita l'I/O in modalità non bloccante. \end{basedescript} relativi ad operazioni comunque eseguibili anche attraverso \func{fcntl}. diff --git a/intro.tex b/intro.tex index f3b6575..2330e66 100644 --- a/intro.tex +++ b/intro.tex @@ -631,12 +631,12 @@ propri header file. Le macro disponibili per i vari standard sono le seguenti: \begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}} -\item[\const{\_POSIX\_SOURCE}] definendo questa macro si rendono disponibili +\item[\macro{\_POSIX\_SOURCE}] definendo questa macro si rendono disponibili tutte le funzionalità dello standard POSIX.1 (la versione IEEE Standard 1003.1) insieme a tutte le funzionalità dello standard ISO C. Se viene anche - definita con un intero positivo la macro \const{\_POSIX\_C\_SOURCE} lo stato + definita con un intero positivo la macro \macro{\_POSIX\_C\_SOURCE} lo stato di questa non viene preso in considerazione. -\item[\const{\_POSIX\_C\_SOURCE}] definendo questa macro ad un valore intero +\item[\macro{\_POSIX\_C\_SOURCE}] definendo questa macro ad un valore intero positivo si controlla quale livello delle funzionalità specificate da POSIX viene messa a disposizione; più alto è il valore maggiori sono le funzionalità. Se è uguale a '1' vengono attivate le funzionalità specificate @@ -647,7 +647,7 @@ Le macro disponibili per i vari standard sono le seguenti: Standard 1003.1b-1993). Un valore maggiore o uguale a `199506L' attiva le funzionalità POSIX.1 specificate nell'edizione del 1996 (ISO/IEC 9945-1: 1996). Valori superiori abiliteranno ulteriori estensioni. -\item[\const{\_BSD\_SOURCE}] definendo questa macro si attivano le +\item[\macro{\_BSD\_SOURCE}] definendo questa macro si attivano le funzionalità derivate da BSD4.3, insieme a quelle previste dagli standard ISO C, POSIX.1 e POSIX.2. Alcune delle funzionalità previste da BSD sono però in conflitto con le corrispondenti definite nello standard POSIX.1, in @@ -658,29 +658,29 @@ Le macro disponibili per i vari standard sono le seguenti: questo caso occorre pertanto anche usare l'opzione \cmd{-lbsd-compat} con il compilatore per indicargli di utilizzare le versioni nella libreria di compatibilità prima di quelle normali. -\item[\const{\_SVID\_SOURCE}] definendo questa macro si attivano le +\item[\macro{\_SVID\_SOURCE}] definendo questa macro si attivano le funzionalità derivate da SVID. Esse comprendono anche quelle definite negli standard ISO C, POSIX.1, POSIX.2, and X/Open. -\item[\const{\_XOPEN\_SOURCE}] definendo questa macro si attivano le +\item[\macro{\_XOPEN\_SOURCE}] definendo questa macro si attivano le funzionalità descritte nella \textit{X/Open Portability Guide}. Anche queste sono un soprainsieme di quelle definite in POSIX.1 e POSIX.2 ed in effetti - sia \const{\_POSIX\_SOURCE} che \const{\_POSIX\_C\_SOURCE} vengono + sia \macro{\_POSIX\_SOURCE} che \macro{\_POSIX\_C\_SOURCE} vengono automaticamente definite. Sono incluse anche ulteriori funzionalità disponibili in BSD e SVID. Se il valore della macro è posto a 500 questo include anche le nuove definizioni introdotte con la \textit{Single UNIX Specification, version 2}, cioè Unix98. -\item[\const{\_XOPEN\_SOURCE\_EXTENDED}] definendo questa macro si attivano le +\item[\macro{\_XOPEN\_SOURCE\_EXTENDED}] definendo questa macro si attivano le ulteriori funzionalità necessarie ad essere conformi al rilascio del marchio \textit{X/Open Unix}. -\item[\const{\_ISOC99\_SOURCE}] definendo questa macro si attivano le +\item[\macro{\_ISOC99\_SOURCE}] definendo questa macro si attivano le funzionalità previste per la revisione delle librerie standard del C denominato ISO C99. Dato che lo standard non è ancora adottato in maniera ampia queste non sono abilitate automaticamente, ma le \acr{glibc} hanno già un'implementazione completa che può essere attivata definendo questa macro. -\item[\const{\_LARGEFILE\_SOURCE}] definendo questa macro si attivano le +\item[\macro{\_LARGEFILE\_SOURCE}] definendo questa macro si attivano le funzionalità per il supporto dei file di grandi dimensioni (il \textit{Large File Support} o LFS) con indici e dimensioni a 64 bit. -\item[\const{\_GNU\_SOURCE}] definendo questa macro si attivano tutte le +\item[\macro{\_GNU\_SOURCE}] definendo questa macro si attivano tutte le funzionalità disponibili: ISO C89, ISO C99, POSIX.1, POSIX.2, BSD, SVID, X/Open, LFS più le estensioni specifiche GNU. Nel caso in cui BSD e POSIX confliggano viene data la precedenza a POSIX. @@ -689,7 +689,7 @@ Le macro disponibili per i vari standard sono le seguenti: In particolare è da sottolineare che le \acr{glibc} supportano alcune estensioni specifiche GNU, che non sono comprese in nessuno degli standard citati. Per poterle utilizzare esse devono essere attivate -esplicitamente definendo la macro \const{\_GNU\_SOURCE} prima di +esplicitamente definendo la macro \macro{\_GNU\_SOURCE} prima di includere i vari header file. diff --git a/ipc.tex b/ipc.tex index 0da0c53..2a4c3bb 100644 --- a/ipc.tex +++ b/ipc.tex @@ -56,8 +56,8 @@ associati ad una \textit{pipe} Crea una coppia di file descriptor associati ad una \textit{pipe}. \bodydesc{La funzione restituisce zero in caso di successo e -1 per un - errore, nel qual caso \var{errno} potrà assumere i valori \macro{EMFILE}, - \macro{ENFILE} e \macro{EFAULT}.} + errore, nel qual caso \var{errno} potrà assumere i valori \const{EMFILE}, + \const{ENFILE} e \const{EFAULT}.} \end{prototype} La funzione restituisce la coppia di file descriptor nel vettore @@ -66,7 +66,7 @@ accennato concetto di funzionamento di una pipe scrive nel file descriptor aperto in scrittura viene ripresentato tale e quale nel file descriptor aperto in lettura. I file descriptor infatti non sono connessi a nessun file reale, ma ad un buffer nel kernel, la cui dimensione è -specificata dal parametro di sistema \macro{PIPE\_BUF}, (vedi +specificata dal parametro di sistema \const{PIPE\_BUF}, (vedi \secref{sec:sys_file_limits}). Lo schema di funzionamento di una pipe è illustrato in \figref{fig:ipc_pipe_singular}, in cui sono illustrati i due capi della pipe, associati a ciascun file descriptor, con le frecce che @@ -112,11 +112,11 @@ essere bloccante (qualora non siano presenti dati), inoltre se si legge da una pipe il cui capo in scrittura è stato chiuso, si avrà la ricezione di un EOF (vale a dire che la funzione \func{read} ritornerà restituendo 0). Se invece si esegue una scrittura su una pipe il cui capo in lettura non è aperto il -processo riceverà il segnale \macro{EPIPE}, e la funzione di scrittura -restituirà un errore di \macro{EPIPE} (al ritorno del manipolatore, o qualora +processo riceverà il segnale \errcode{EPIPE}, e la funzione di scrittura +restituirà un errore di \errcode{EPIPE} (al ritorno del manipolatore, o qualora il segnale sia ignorato o bloccato). -La dimensione del buffer della pipe (\macro{PIPE\_BUF}) ci dà inoltre un'altra +La dimensione del buffer della pipe (\const{PIPE\_BUF}) ci dà inoltre un'altra importante informazione riguardo il comportamento delle operazioni di lettura e scrittura su di una pipe; esse infatti sono atomiche fintanto che la quantità di dati da scrivere non supera questa dimensione. Qualora ad esempio @@ -331,9 +331,9 @@ restituisce, lo standard input o lo standard output nella pipe collegata allo stream restituito come valore di ritorno. \bodydesc{La funzione restituisce l'indirizzo dello stream associato alla pipe - in caso di successo e \macro{NULL} per un errore, nel qual caso \var{errno} + in caso di successo e \val{NULL} per un errore, nel qual caso \var{errno} potrà assumere i valori relativi alle sottostanti invocazioni di \func{pipe} - e \func{fork} o \macro{EINVAL} se \param{type} non è valido.} + e \func{fork} o \errcode{EINVAL} se \param{type} non è valido.} \end{prototype} La funzione crea una pipe, esegue una \func{fork}, ed invoca il programma @@ -386,12 +386,12 @@ originarie del codice a barre e produce un JPEG di dimensioni corrette. Questo approccio però non funziona, per via di una delle caratteristiche principali delle pipe. Per poter effettuare la conversione di un PDF infatti è necessario, per la struttura del formato, potersi spostare (con \func{lseek}) -all'interno del file da convertire; se si esegue la conversione con \cmd{gs} su -un file regolare non ci sono problemi, una pipe però è rigidamente +all'interno del file da convertire; se si esegue la conversione con \cmd{gs} +su un file regolare non ci sono problemi, una pipe però è rigidamente sequenziale, e l'uso di \func{lseek} su di essa fallisce sempre con un errore -di \macro{ESPIPE}, rendendo impossibile la conversione. Questo ci dice che in -generale la concatenazione di vari programmi funzionerà soltanto quando tutti -prevedono una lettura sequenziale del loro input. +di \errcode{ESPIPE}, rendendo impossibile la conversione. Questo ci dice che +in generale la concatenazione di vari programmi funzionerà soltanto quando +tutti prevedono una lettura sequenziale del loro input. Per questo motivo si è dovuto utilizzare un procedimento diverso, eseguendo prima la conversione (sempre con \cmd{gs}) del PS in un altro formato @@ -518,7 +518,7 @@ eseguita quando l'altro capo non Le fifo però possono essere anche aperte in modalità \textsl{non-bloccante}, nel qual caso l'apertura del capo in lettura avrà successo solo quando anche l'altro capo è aperto, mentre l'apertura del capo in scrittura restituirà -l'errore di \macro{ENXIO} fintanto che non verrà aperto il capo in lettura. +l'errore di \errcode{ENXIO} fintanto che non verrà aperto il capo in lettura. In Linux è possibile aprire le fifo anche in lettura/scrittura,\footnote{lo standard POSIX lascia indefinito il comportamento in questo caso.} @@ -536,7 +536,7 @@ piuttosto frequente l'utilizzo di una fifo come canale di comunicazione nelle situazioni un processo deve ricevere informazioni da altri. In questo caso è fondamentale che le operazioni di scrittura siano atomiche; per questo si deve sempre tenere presente che questo è vero soltanto fintanto che non si supera -il limite delle dimensioni di \macro{PIPE\_BUF} (si ricordi quanto detto in +il limite delle dimensioni di \const{PIPE\_BUF} (si ricordi quanto detto in \secref{sec:ipc_pipes}). A parte il caso precedente, che resta probabilmente il più comune, Stevens @@ -693,7 +693,7 @@ effettuando richieste) con la fifo chiusa sul lato in lettura e a questo punto restituendo un end-of-file.\footnote{Si è usata questa tecnica per compatibilità, Linux infatti supporta l'apertura delle fifo in lettura/scrittura, per cui si sarebbe potuto effettuare una singola apertura - con \macro{O\_RDWR}, la doppia apertura comunque ha il vantaggio che non si + con \const{O\_RDWR}, la doppia apertura comunque ha il vantaggio che non si può scrivere per errore sul capo aperto in sola lettura.} Per questo motivo, dopo aver eseguito l'apertura in lettura (\texttt{\small @@ -792,7 +792,7 @@ Inoltrata la richiesta si pu si apre (\texttt{\small 26--30}) la fifo appena creata, da cui si deve riceverla, dopo di che si effettua una lettura (\texttt{\small 31}) nell'apposito buffer; si è supposto, come è ragionevole, che le frasi inviate -dal server siano sempre di dimensioni inferiori a \macro{PIPE\_BUF}, +dal server siano sempre di dimensioni inferiori a \const{PIPE\_BUF}, tralasciamo la gestione del caso in cui questo non è vero. Infine si stampa (\texttt{\small 32}) a video la risposta, si chiude (\texttt{\small 33}) la fifo e si cancella (\texttt{\small 34}) il relativo file. @@ -806,7 +806,7 @@ complessa e continua ad avere vari inconvenienti\footnote{lo stesso Stevens, che esamina questa architettura in \cite{APUE}, nota come sia impossibile per il server sapere se un client è andato in crash, con la possibilità di far restare le fifo temporanee sul filesystem, di come sia necessario - intercettare \macro{SIGPIPE} dato che un client può terminare dopo aver + intercettare \const{SIGPIPE} dato che un client può terminare dopo aver fatto una richiesta, ma prima che la risposta sia inviata (cosa che nel nostro esempio non è stata fatta).}; in generale infatti l'interfaccia delle fifo non è adatta a risolvere questo tipo di problemi, che possono essere @@ -852,12 +852,12 @@ entrambe le direzioni. Il prototipo della funzione \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[\macro{EAFNOSUPPORT}] I socket locali non sono supportati. - \item[\macro{EPROTONOSUPPORT}] Il protocollo specificato non è supportato. - \item[\macro{EOPNOTSUPP}] Il protocollo specificato non supporta la + \item[\errcode{EAFNOSUPPORT}] I socket locali non sono supportati. + \item[\errcode{EPROTONOSUPPORT}] Il protocollo specificato non è supportato. + \item[\errcode{EOPNOTSUPP}] Il protocollo specificato non supporta la creazione di coppie di socket. \end{errlist} - ed inoltre \macro{EMFILE}, \macro{EFAULT}. + ed inoltre \const{EMFILE}, \const{EFAULT}. } \end{functions} @@ -867,7 +867,7 @@ sull'altro e viceversa. I parametri \param{domain}, \param{type} e \param{protocol} derivano dall'interfaccia dei socket (che è quella che fornisce il substrato per connettere i due descrittori), ma in questo caso i soli valori validi che possono essere specificati sono rispettivamente -\macro{AF\_UNIX}, \macro{SOCK\_STREAM} e \var{0}. +\const{AF\_UNIX}, \const{SOCK\_STREAM} e \var{0}. L'utilità di chiamare questa funzione per evitare due chiamate a \func{pipe} può sembrare limitata; in realtà l'utilizzo di questa funzione (e dei socket @@ -1046,8 +1046,8 @@ propriamente un permesso di modifica). I valori di \var{mode} sono gli stessi ed hanno lo stesso significato di quelli riportati in \secref{tab:file_mode_flags}\footnote{se però si vogliono usare le costanti simboliche ivi definite occorrerà includere il file \file{sys/stat.h}, - alcuni sistemi definiscono le costanti \macro{MSG\_R} (\texttt{0400}) e - \macro{MSG\_W} (\texttt{0200}) per indicare i permessi base di lettura e + alcuni sistemi definiscono le costanti \const{MSG\_R} (\texttt{0400}) e + \const{MSG\_W} (\texttt{0200}) per indicare i permessi base di lettura e scrittura per il proprietario, da utilizzare, con gli opportuni shift, pure per il gruppo e gli altri, in Linux, visto la loro scarsa utilità, queste costanti non sono definite.} e come per i file definiscono gli accessi per @@ -1124,8 +1124,8 @@ assumere tutti i valori possibili, rendendo molto pi un identificatore può venire riutilizzato. Il sistema dispone sempre di un numero fisso di oggetti di IPC,\footnote{fino - al kernel 2.2.x questi valori, definiti dalle costanti \macro{MSGMNI}, - \macro{SEMMNI} e \macro{SHMMNI}, potevano essere cambiati (come tutti gli + al kernel 2.2.x questi valori, definiti dalle costanti \const{MSGMNI}, + \const{SEMMNI} e \const{SHMMNI}, potevano essere cambiati (come tutti gli altri limiti relativi al \textit{SysV IPC}) solo con una ricompilazione del kernel, andando a modificarne la definizione nei relativi header file. A partire dal kernel 2.4.x è possibile cambiare questi valori a sistema attivo @@ -1138,7 +1138,7 @@ precedenza per restituire l'identificatore al numero di oggetti presenti viene sommato il valore di \var{seq} moltiplicato per il numero massimo di oggetti di quel tipo,\footnote{questo vale fino ai kernel della serie 2.2.x, dalla serie 2.4.x viene usato lo stesso fattore per tutti gli oggetti, esso è dato - dalla costante \macro{IPCMNI}, definita in \file{include/linux/ipc.h}, che + dalla costante \const{IPCMNI}, definita in \file{include/linux/ipc.h}, che indica il limite massimo per il numero di tutti oggetti di IPC, ed il cui valore è 32768.} si evita così il riutilizzo degli stessi numeri, e si fa sì che l'identificatore assuma tutti i valori possibili. @@ -1243,18 +1243,18 @@ una \bodydesc{La funzione restituisce l'identificatore (un intero positivo) o -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\macro{EACCES}] Il processo chiamante non ha i privilegi per accedere + \item[\errcode{EACCES}] Il processo chiamante non ha i privilegi per accedere alla coda richiesta. - \item[\macro{EEXIST}] Si è richiesta la creazione di una coda che già - esiste, ma erano specificati sia \macro{IPC\_CREAT} che \macro{IPC\_EXCL}. - \item[\macro{EIDRM}] La coda richiesta è marcata per essere cancellata. - \item[\macro{ENOENT}] Si è cercato di ottenere l'identificatore di una coda - di messaggi specificando una chiave che non esiste e \macro{IPC\_CREAT} + \item[\errcode{EEXIST}] Si è richiesta la creazione di una coda che già + esiste, ma erano specificati sia \const{IPC\_CREAT} che \const{IPC\_EXCL}. + \item[\errcode{EIDRM}] La coda richiesta è marcata per essere cancellata. + \item[\errcode{ENOENT}] Si è cercato di ottenere l'identificatore di una coda + di messaggi specificando una chiave che non esiste e \const{IPC\_CREAT} non era specificato. - \item[\macro{ENOSPC}] Si è cercato di creare una coda di messaggi quando è - stato superato il limite massimo di code (\macro{MSGMNI}). + \item[\errcode{ENOSPC}] Si è cercato di creare una coda di messaggi quando è + stato superato il limite massimo di code (\const{MSGMNI}). \end{errlist} - ed inoltre \macro{ENOMEM}. + ed inoltre \const{ENOMEM}. } \end{functions} @@ -1262,33 +1262,34 @@ Le funzione (come le analoghe che si usano per gli altri oggetti) serve sia a ottenere l'identificatore di una coda di messaggi esistente, che a crearne una nuova. L'argomento \param{key} specifica la chiave che è associata all'oggetto, eccetto il caso in cui si specifichi il valore -\macro{IPC\_PRIVATE}, nel qual caso la coda è creata ex-novo e non vi è +\const{IPC\_PRIVATE}, nel qual caso la coda è creata ex-novo e non vi è associata alcuna chiave, il processo (ed i suoi eventuali figli) potranno farvi riferimento solo attraverso l'identificatore. -Se invece si specifica un valore diverso da \macro{IPC\_PRIVATE}\footnote{in +Se invece si specifica un valore diverso da \const{IPC\_PRIVATE}\footnote{in Linux questo significa un valore diverso da zero.} l'effetto della funzione dipende dal valore di \param{flag}, se questo è nullo la funzione si limita ad effettuare una ricerca sugli oggetti esistenti, restituendo l'identificatore -se trova una corrispondenza, o fallendo con un errore di \macro{ENOENT} se non -esiste o di \macro{EACCESS} se si sono specificati dei permessi non validi. +se trova una corrispondenza, o fallendo con un errore di \errcode{ENOENT} se +non esiste o di \errcode{EACCESS} se si sono specificati dei permessi non +validi. Se invece si vuole creare una nuova coda di messaggi \param{flag} non può essere nullo e deve essere fornito come maschera binaria, impostando il bit -corrispondente al valore \macro{IPC\_CREAT}. In questo caso i nove bit meno +corrispondente al valore \const{IPC\_CREAT}. In questo caso i nove bit meno significativi di \param{flag} saranno usati come permessi per il nuovo oggetto, secondo quanto illustrato in \secref{sec:ipc_sysv_access_control}. -Se si imposta anche il bit corrispondente a \macro{IPC\_EXCL} la funzione avrà +Se si imposta anche il bit corrispondente a \const{IPC\_EXCL} la funzione avrà successo solo se l'oggetto non esiste già, fallendo con un errore di -\macro{EEXIST} altrimenti. +\errcode{EEXIST} altrimenti. -Si tenga conto che l'uso di \macro{IPC\_PRIVATE} non impedisce ad altri +Si tenga conto che l'uso di \const{IPC\_PRIVATE} non impedisce ad altri processi di accedere alla coda (se hanno privilegi sufficienti) una volta che questi possano indovinare o ricavare (ad esempio per tentativi) l'identificatore ad essa associato. Per come sono implementati gli oggetti di IPC infatti non esiste una maniera che garantisca l'accesso esclusivo ad una -coda di messaggi. Usare \macro{IPC\_PRIVATE} o macro{IPC\_CREAT} e -\macro{IPC\_EXCL} per \param{flag} comporta solo la creazione di una nuova +coda di messaggi. Usare \const{IPC\_PRIVATE} o const{IPC\_CREAT} e +\const{IPC\_EXCL} per \param{flag} comporta solo la creazione di una nuova coda. \begin{table}[htb] @@ -1300,11 +1301,11 @@ coda. & \textbf{Significato} \\ \hline \hline - \macro{MSGMNI}& 16& \file{msgmni} & Numero massimo di code di + \const{MSGMNI}& 16& \file{msgmni} & Numero massimo di code di messaggi. \\ - \macro{MSGMAX}& 8192& \file{msgmax} & Dimensione massima di un singolo + \const{MSGMAX}& 8192& \file{msgmax} & Dimensione massima di un singolo messaggio.\\ - \macro{MSGMNB}&16384& \file{msgmnb} & Dimensione massima del contenuto di + \const{MSGMNB}&16384& \file{msgmnb} & Dimensione massima del contenuto di una coda.\\ \hline \end{tabular} @@ -1399,9 +1400,9 @@ gli altri campi invece: viene inizializzato al tempo corrente. \item il campo \var{msg\_qbytes} che esprime la dimensione massima del contenuto della coda (in byte) viene inizializzato al valore preimpostato - del sistema (\macro{MSGMNB}). + del sistema (\const{MSGMNB}). \item i campi \var{msg\_first} e \var{msg\_last} che esprimono l'indirizzo del - primo e ultimo messaggio sono inizializzati a \macro{NULL} e + primo e ultimo messaggio sono inizializzati a \val{NULL} e \var{msg\_cbytes}, che esprime la dimensione in byte dei messaggi presenti è inizializzato a zero. Questi campi sono ad uso interno dell'implementazione e non devono essere utilizzati da programmi in user space). @@ -1423,15 +1424,15 @@ prototipo \bodydesc{La funzione restituisce 0 in caso di successo o -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\macro{EACCES}] Si è richiesto \macro{IPC\_STAT} ma processo chiamante - non ha i privilegi di lettura sulla coda. - \item[\macro{EIDRM}] La coda richiesta è stata cancellata. - \item[\macro{EPERM}] Si è richiesto \macro{IPC\_SET} o \macro{IPC\_RMID} ma + \item[\errcode{EACCES}] Si è richiesto \const{IPC\_STAT} ma processo + chiamante non ha i privilegi di lettura sulla coda. + \item[\errcode{EIDRM}] La coda richiesta è stata cancellata. + \item[\errcode{EPERM}] Si è richiesto \const{IPC\_SET} o \const{IPC\_RMID} ma il processo non ha i privilegi, o si è richiesto di aumentare il valore di - \var{msg\_qbytes} oltre il limite \macro{MSGMNB} senza essere + \var{msg\_qbytes} oltre il limite \const{MSGMNB} senza essere amministratore. \end{errlist} - ed inoltre \macro{EFAULT} ed \macro{EINVAL}. + ed inoltre \const{EFAULT} ed \const{EINVAL}. } \end{functions} @@ -1441,24 +1442,24 @@ dall'identificatore \param{msqid}. Il comportamento della funzione dipende dal valore dell'argomento \param{cmd}, che specifica il tipo di azione da eseguire; i valori possibili sono: \begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}} -\item[\macro{IPC\_STAT}] Legge le informazioni riguardo la coda nella +\item[\const{IPC\_STAT}] Legge le informazioni riguardo la coda nella struttura indicata da \param{buf}. Occorre avere il permesso di lettura sulla coda. -\item[\macro{IPC\_RMID}] Rimuove la coda, cancellando tutti i dati, con +\item[\const{IPC\_RMID}] Rimuove la coda, cancellando tutti i dati, con effetto immediato. Tutti i processi che cercheranno di accedere alla coda - riceveranno un errore di \macro{EIDRM}, e tutti processi in attesa su + riceveranno un errore di \errcode{EIDRM}, e tutti processi in attesa su funzioni di di lettura o di scrittura sulla coda saranno svegliati ricevendo il medesimo errore. Questo comando può essere eseguito solo da un processo con userid effettivo corrispondente al creatore o al proprietario della coda, o all'amministratore. -\item[\macro{IPC\_SET}] Permette di modificare i permessi ed il proprietario +\item[\const{IPC\_SET}] Permette di modificare i permessi ed il proprietario della coda, ed il limite massimo sulle dimensioni del totale dei messaggi in essa contenuti (\var{msg\_qbytes}). I valori devono essere passati in una struttura \var{msqid\_ds} puntata da \param{buf}. Per modificare i valori di \var{msg\_perm.mode}, \var{msg\_perm.uid} e \var{msg\_perm.gid} occorre essere il proprietario o il creatore della coda, oppure l'amministratore; lo stesso vale per \var{msg\_qbytes}, ma l'amministratore ha la facoltà di - incrementarne il valore a limiti superiori a \macro{MSGMNB}. + incrementarne il valore a limiti superiori a \const{MSGMNB}. \end{basedescript} @@ -1478,17 +1479,17 @@ messaggio su una coda si utilizza la funzione \func{msgsnd}; il suo prototipo \bodydesc{La funzione restituisce 0, e -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\macro{EACCES}] Non si hanno i privilegi di accesso sulla coda. - \item[\macro{EIDRM}] La coda è stata cancellata. - \item[\macro{EAGAIN}] Il messaggio non può essere inviato perché si è + \item[\errcode{EACCES}] Non si hanno i privilegi di accesso sulla coda. + \item[\errcode{EIDRM}] La coda è stata cancellata. + \item[\errcode{EAGAIN}] Il messaggio non può essere inviato perché si è superato il limite \var{msg\_qbytes} sul numero massimo di byte presenti - sulla coda, e si è richiesto \macro{IPC\_NOWAIT} in \param{flag}. - \item[\macro{EINTR}] La funzione è stata interrotta da un segnale. - \item[\macro{EINVAL}] Si è specificato un \param{msgid} invalido, o un + sulla coda, e si è richiesto \const{IPC\_NOWAIT} in \param{flag}. + \item[\errcode{EINTR}] La funzione è stata interrotta da un segnale. + \item[\errcode{EINVAL}] Si è specificato un \param{msgid} invalido, o un valore non positivo per \param{mtype}, o un valore di \param{msgsz} - maggiore di \macro{MSGMAX}. + maggiore di \const{MSGMAX}. \end{errlist} - ed inoltre \macro{EFAULT} ed \macro{ENOMEM}. + ed inoltre \const{EFAULT} ed \const{ENOMEM}. } \end{functions} @@ -1498,7 +1499,7 @@ l'argomento \param{msgp}. Quest'ultimo deve venire passato sempre come puntatore ad una struttura \var{msgbuf} analoga a quella riportata in \figref{fig:ipc_msbuf} che è quella che deve contenere effettivamente il messaggio. La dimensione massima per il testo di un messaggio non può -comunque superare il limite \macro{MSGMAX}. +comunque superare il limite \const{MSGMAX}. La struttura di \figref{fig:ipc_msbuf} è comunque solo un modello, tanto che la definizione contenuta in \file{sys/msg.h} usa esplicitamente per il secondo @@ -1521,7 +1522,7 @@ argomento cioè \var{message} è una propria struttura che si passa alla funzione, \param{msgsz} dovrà essere uguale a \code{sizeof(message)-sizeof(long)}, (se consideriamo il caso dell'esempio in \figref{fig:ipc_msbuf}, \param{msgsz} -dovrà essere pari a \macro{LENGTH}). +dovrà essere pari a \const{LENGTH}). \begin{figure}[!htb] \footnotesize \centering @@ -1554,16 +1555,16 @@ della funzione. Di norma, quando si specifica un valore nullo, la funzione ritorna immediatamente a meno che si sia ecceduto il valore di \var{msg\_qbytes}, o il limite di sistema sul numero di messaggi, nel qual caso si blocca mandando il processo in stato di \textit{sleep}. Se si -specifica per \param{flag} il valore \macro{IPC\_NOWAIT} la funzione opera in +specifica per \param{flag} il valore \const{IPC\_NOWAIT} la funzione opera in modalità non bloccante, ed in questi casi ritorna immediatamente con un errore -di \macro{EAGAIN}. +di \errcode{EAGAIN}. -Se non si specifica \macro{IPC\_NOWAIT} la funzione resterà bloccata fintanto +Se non si specifica \const{IPC\_NOWAIT} la funzione resterà bloccata fintanto che non si liberano risorse sufficienti per poter inserire nella coda il messaggio, nel qual caso ritornerà normalmente. La funzione può ritornare, con una condizione di errore anche in due altri casi: quando la coda viene rimossa -(nel qual caso si ha un errore di \macro{EIDRM}) o quando la funzione viene -interrotta da un segnale (nel qual caso si ha un errore di \macro{EINTR}). +(nel qual caso si ha un errore di \errcode{EIDRM}) o quando la funzione viene +interrotta da un segnale (nel qual caso si ha un errore di \errcode{EINTR}). Una volta completato con successo l'invio del messaggio sulla coda, la funzione aggiorna i dati mantenuti in \var{msqid\_ds}, in particolare vengono @@ -1591,16 +1592,16 @@ La funzione che viene utilizzata per estrarre un messaggio da una coda successo, e -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\macro{EACCES}] Non si hanno i privilegi di accesso sulla coda. - \item[\macro{EIDRM}] La coda è stata cancellata. - \item[\macro{E2BIG}] Il testo del messaggio è più lungo di \param{msgsz} e - non si è specificato \macro{MSG\_NOERROR} in \param{msgflg}. - \item[\macro{EINTR}] La funzione è stata interrotta da un segnale mentre era - in attesa di ricevere un messaggio. - \item[\macro{EINVAL}] Si è specificato un \param{msgid} invalido o un valore - di \param{msgsz} negativo. + \item[\errcode{EACCES}] Non si hanno i privilegi di accesso sulla coda. + \item[\errcode{EIDRM}] La coda è stata cancellata. + \item[\errcode{E2BIG}] Il testo del messaggio è più lungo di \param{msgsz} e + non si è specificato \const{MSG\_NOERROR} in \param{msgflg}. + \item[\errcode{EINTR}] La funzione è stata interrotta da un segnale mentre + era in attesa di ricevere un messaggio. + \item[\errcode{EINVAL}] Si è specificato un \param{msgid} invalido o un + valore di \param{msgsz} negativo. \end{errlist} - ed inoltre \macro{EFAULT}. + ed inoltre \const{EFAULT}. } \end{functions} @@ -1608,14 +1609,14 @@ La funzione legge un messaggio dalla coda specificata, scrivendolo sulla struttura puntata da \param{msgp}, che dovrà avere un formato analogo a quello di \figref{fig:ipc_msbuf}. Una volta estratto, il messaggio sarà rimosso dalla coda. L'argomento \param{msgsz} indica la lunghezza massima del testo del -messaggio (equivalente al valore del parametro \macro{LENGTH} nell'esempio di +messaggio (equivalente al valore del parametro \const{LENGTH} nell'esempio di \figref{fig:ipc_msbuf}). Se il testo del messaggio ha lunghezza inferiore a \param{msgsz} esso viene rimosso dalla coda; in caso contrario, se \param{msgflg} è impostato a -\macro{MSG\_NOERROR}, il messaggio viene troncato e la parte in eccesso viene +\const{MSG\_NOERROR}, il messaggio viene troncato e la parte in eccesso viene perduta, altrimenti il messaggio non viene estratto e la funzione ritorna con -un errore di \macro{E2BIG}. +un errore di \errcode{E2BIG}. L'argomento \param{msgtyp} permette di restringere la ricerca ad un sottoinsieme dei messaggi presenti sulla coda; la ricerca infatti è fatta con @@ -1636,20 +1637,20 @@ coda, Il valore di \param{msgflg} permette di controllare il comportamento della funzione, esso può essere nullo o una maschera binaria composta da uno o più -valori. Oltre al precedente \macro{MSG\_NOERROR}, sono possibili altri due -valori: \macro{MSG\_EXCEPT}, che permette, quando \param{msgtyp} è positivo, +valori. Oltre al precedente \const{MSG\_NOERROR}, sono possibili altri due +valori: \const{MSG\_EXCEPT}, che permette, quando \param{msgtyp} è positivo, di leggere il primo messaggio nella coda con tipo diverso da \param{msgtyp}, e -\macro{IPC\_NOWAIT} che causa il ritorno immediato della funzione quando non +\const{IPC\_NOWAIT} che causa il ritorno immediato della funzione quando non ci sono messaggi sulla coda. Il comportamento usuale della funzione infatti, se non ci sono messaggi disponibili per la lettura, è di bloccare il processo in stato di -\textit{sleep}. Nel caso però si sia specificato \macro{IPC\_NOWAIT} la -funzione ritorna immediatamente con un errore \macro{ENOMSG}. Altrimenti la +\textit{sleep}. Nel caso però si sia specificato \const{IPC\_NOWAIT} la +funzione ritorna immediatamente con un errore \errcode{ENOMSG}. Altrimenti la funzione ritorna normalmente non appena viene inserito un messaggio del tipo desiderato, oppure ritorna con errore qualora la coda sia rimossa (con -\var{errno} impostata a \macro{EIDRM}) o se il processo viene interrotto da un -segnale (con \var{errno} impostata a \macro{EINTR}). +\var{errno} impostata a \errcode{EIDRM}) o se il processo viene interrotto da +un segnale (con \var{errno} impostata a \errcode{EINTR}). Una volta completata con successo l'estrazione del messaggio dalla coda, la funzione aggiorna i dati mantenuti in \var{msqid\_ds}, in particolare vengono @@ -1781,7 +1782,7 @@ principale (\texttt{\small 32--41}). Questo inizia (\texttt{\small 33}) con il porsi in attesa di un messaggio di richiesta da parte di un client; si noti infatti come \func{msgrcv} richieda un messaggio con \var{mtype} uguale a 1: questo è il valore usato per le richieste dato che corrisponde al \acr{pid} di -\cmd{init}, che non può essere un client. L'uso del flag \macro{MSG\_NOERROR} +\cmd{init}, che non può essere un client. L'uso del flag \const{MSG\_NOERROR} è solo per sicurezza, dato che i messaggi di richiesta sono di dimensione fissa (e contengono solo il \acr{pid} del client). @@ -1931,18 +1932,18 @@ permette di creare o ottenere l'identificatore di un insieme di semafori \bodydesc{La funzione restituisce l'identificatore (un intero positivo) o -1 in caso di errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\macro{ENOSPC}] Si è cercato di creare una insieme di semafori + \item[\errcode{ENOSPC}] Si è cercato di creare una insieme di semafori quando è stato superato o il limite per il numero totale di semafori - (\macro{SEMMNS}) o quello per il numero totale degli insiemi - (\macro{SEMMNI}) nel sistema. - \item[\macro{EINVAL}] L'argomento \param{nsems} è minore di zero o + (\const{SEMMNS}) o quello per il numero totale degli insiemi + (\const{SEMMNI}) nel sistema. + \item[\errcode{EINVAL}] L'argomento \param{nsems} è minore di zero o maggiore del limite sul numero di semafori per ciascun insieme - (\macro{SEMMSL}), o se l'insieme già esiste, maggiore del numero di + (\const{SEMMSL}), o se l'insieme già esiste, maggiore del numero di semafori che contiene. - \item[\macro{ENOMEM}] Il sistema non ha abbastanza memoria per poter + \item[\errcode{ENOMEM}] Il sistema non ha abbastanza memoria per poter contenere le strutture per un nuovo insieme di semafori. \end{errlist} - ed inoltre \macro{EACCES}, \macro{ENOENT}, \macro{EEXIST}, \macro{EIDRM}, + ed inoltre \const{EACCES}, \const{ENOENT}, \const{EEXIST}, \const{EIDRM}, con lo stesso significato che hanno per \func{msgget}.} \end{functions} @@ -2061,16 +2062,16 @@ indicano rispettivamente: \textbf{Costante} & \textbf{Valore} & \textbf{Significato} \\ \hline \hline - \macro{SEMMNI}& 128 & Numero massimo di insiemi di semafori. \\ - \macro{SEMMSL}& 250 & Numero massimo di semafori per insieme.\\ - \macro{SEMMNS}&\macro{SEMMNI}*\macro{SEMMSL}& Numero massimo di semafori + \const{SEMMNI}& 128 & Numero massimo di insiemi di semafori. \\ + \const{SEMMSL}& 250 & Numero massimo di semafori per insieme.\\ + \const{SEMMNS}&\const{SEMMNI}*\const{SEMMSL}& Numero massimo di semafori nel sistema .\\ - \macro{SEMVMX}& 32767 & Massimo valore per un semaforo.\\ - \macro{SEMOPM}& 32 & Massimo numero di operazioni per chiamata a + \const{SEMVMX}& 32767 & Massimo valore per un semaforo.\\ + \const{SEMOPM}& 32 & Massimo numero di operazioni per chiamata a \func{semop}. \\ - \macro{SEMMNU}&\macro{SEMMNS}& Massimo numero di strutture di ripristino.\\ - \macro{SEMUME}&\macro{SEMOPM}& Massimo numero di voci di ripristino.\\ - \macro{SEMAEM}&\macro{SEMVMX}& valore massimo per l'aggiustamento + \const{SEMMNU}&\const{SEMMNS}& Massimo numero di strutture di ripristino.\\ + \const{SEMUME}&\const{SEMOPM}& Massimo numero di voci di ripristino.\\ + \const{SEMAEM}&\const{SEMVMX}& valore massimo per l'aggiustamento all'uscita. \\ \hline \end{tabular} @@ -2103,16 +2104,16 @@ loro inizializzazione) quattro. In caso di errore restituisce -1, ed \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\macro{EACCES}] Il processo non ha i privilegi per eseguire + \item[\errcode{EACCES}] Il processo non ha i privilegi per eseguire l'operazione richiesta. - \item[\macro{EIDRM}] L'insieme di semafori è stato cancellato. - \item[\macro{EPERM}] Si è richiesto \macro{IPC\_SET} o \macro{IPC\_RMID} ma - il processo non ha privilegi sufficienti ad eseguire l'operazione. - \item[\macro{ERANGE}] Si è richiesto \macro{SETALL} \macro{SETVAL} ma il + \item[\errcode{EIDRM}] L'insieme di semafori è stato cancellato. + \item[\errcode{EPERM}] Si è richiesto \const{IPC\_SET} o \const{IPC\_RMID} + ma il processo non ha privilegi sufficienti ad eseguire l'operazione. + \item[\errcode{ERANGE}] Si è richiesto \const{SETALL} \const{SETVAL} ma il valore a cui si vuole impostare il semaforo è minore di zero o maggiore - di \macro{SEMVMX}. + di \const{SEMVMX}. \end{errlist} - ed inoltre \macro{EFAULT} ed \macro{EINVAL}. + ed inoltre \const{EFAULT} ed \const{EINVAL}. } \end{functions} @@ -2149,61 +2150,61 @@ assumere, Come già accennato sia il comportamento della funzione che il numero di parametri con cui deve essere invocata, dipendono dal valore dell'argomento \param{cmd}, che specifica l'azione da intraprendere; i valori validi (che -cioè non causano un errore di \macro{EINVAL}) per questo argomento sono i +cioè non causano un errore di \errcode{EINVAL}) per questo argomento sono i seguenti: \begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}} -\item[\macro{IPC\_STAT}] Legge i dati dell'insieme di semafori, copiando il +\item[\const{IPC\_STAT}] Legge i dati dell'insieme di semafori, copiando il contenuto della relativa struttura \var{semid\_ds} all'indirizzo specificato con \var{arg.buf}. Occorre avere il permesso di lettura. L'argomento \param{semnum} viene ignorato. -\item[\macro{IPC\_RMID}] Rimuove l'insieme di semafori e le relative strutture +\item[\const{IPC\_RMID}] Rimuove l'insieme di semafori e le relative strutture dati, con effetto immediato. Tutti i processi che erano stato di - \textit{sleep} vengono svegliati, ritornando con un errore di \macro{EIDRM}. - L'userid effettivo del processo deve corrispondere o al creatore o al - proprietario dell'insieme, o all'amministratore. L'argomento \param{semnum} - viene ignorato. -\item[\macro{IPC\_SET}] Permette di modificare i permessi ed il proprietario + \textit{sleep} vengono svegliati, ritornando con un errore di + \errcode{EIDRM}. L'userid effettivo del processo deve corrispondere o al + creatore o al proprietario dell'insieme, o all'amministratore. L'argomento + \param{semnum} viene ignorato. +\item[\const{IPC\_SET}] Permette di modificare i permessi ed il proprietario dell'insieme. I valori devono essere passati in una struttura \var{semid\_ds} puntata da \param{arg.buf} di cui saranno usati soltanto i campi \var{sem\_perm.uid}, \var{sem\_perm.gid} e i nove bit meno significativi di \var{sem\_perm.mode}. L'userid effettivo del processo deve corrispondere o al creatore o al proprietario dell'insieme, o all'amministratore. L'argomento \param{semnum} viene ignorato. -\item[\macro{GETALL}] Restituisce il valore corrente di ciascun semaforo +\item[\const{GETALL}] Restituisce il valore corrente di ciascun semaforo dell'insieme (corrispondente al campo \var{semval} di \var{sem}) nel vettore indicato da \param{arg.array}. Occorre avere il permesso di lettura. L'argomento \param{semnum} viene ignorato. -\item[\macro{GETNCNT}] Restituisce come valore di ritorno della funzione il +\item[\const{GETNCNT}] Restituisce come valore di ritorno della funzione il numero di processi in attesa che il semaforo \param{semnum} dell'insieme \param{semid} venga incrementato (corrispondente al campo \var{semncnt} di \var{sem}); va invocata con tre argomenti. Occorre avere il permesso di lettura. -\item[\macro{GETPID}] Restituisce come valore di ritorno della funzione il +\item[\const{GETPID}] Restituisce come valore di ritorno della funzione il \acr{pid} dell'ultimo processo che ha compiuto una operazione sul semaforo \param{semnum} dell'insieme \param{semid} (corrispondente al campo \var{sempid} di \var{sem}); va invocata con tre argomenti. Occorre avere il permesso di lettura. -\item[\macro{GETVAL}] Restituisce come valore di ritorno della funzione il il +\item[\const{GETVAL}] Restituisce come valore di ritorno della funzione il il valore corrente del semaforo \param{semnum} dell'insieme \param{semid} (corrispondente al campo \var{semval} di \var{sem}); va invocata con tre argomenti. Occorre avere il permesso di lettura. -\item[\macro{GETZCNT}] Restituisce come valore di ritorno della funzione il +\item[\const{GETZCNT}] Restituisce come valore di ritorno della funzione il numero di processi in attesa che il valore del semaforo \param{semnum} dell'insieme \param{semid} diventi nullo (corrispondente al campo \var{semncnt} di \var{sem}); va invocata con tre argomenti. Occorre avere il permesso di lettura. -\item[\macro{SETALL}] Inizializza il valore di tutti i semafori dell'insieme, +\item[\const{SETALL}] Inizializza il valore di tutti i semafori dell'insieme, aggiornando il campo \var{sem\_ctime} di \var{semid\_ds}. I valori devono essere passati nel vettore indicato da \param{arg.array}. Si devono avere i privilegi di scrittura sul semaforo. L'argomento \param{semnum} viene ignorato. -\item[\macro{SETVAL}] Inizializza il semaforo \param{semnum} al valore passato +\item[\const{SETVAL}] Inizializza il semaforo \param{semnum} al valore passato dall'argomento \param{arg.val}, aggiornando il campo \var{sem\_ctime} di \var{semid\_ds}. Si devono avere i privilegi di scrittura sul semaforo. \end{basedescript} Quando si imposta il valore di un semaforo (sia che lo si faccia per tutto -l'insieme con \macro{SETALL}, che per un solo semaforo con \macro{SETVAL}), i +l'insieme con \const{SETALL}, che per un solo semaforo con \const{SETVAL}), i processi in attesa su di esso reagiscono di conseguenza al cambiamento di valore. Inoltre la coda delle operazioni di ripristino viene cancellata per tutti i semafori il cui valore viene modificato. @@ -2216,10 +2217,10 @@ tutti i semafori il cui valore viene modificato. \textbf{Operazione} & \textbf{Valore restituito} \\ \hline \hline - \macro{GETNCNT}& valore di \var{semncnt}.\\ - \macro{GETPID} & valore di \var{sempid}.\\ - \macro{GETVAL} & valore di \var{semval}.\\ - \macro{GETZCNT}& valore di \var{semzcnt}.\\ + \const{GETNCNT}& valore di \var{semncnt}.\\ + \const{GETPID} & valore di \var{sempid}.\\ + \const{GETVAL} & valore di \var{semval}.\\ + \const{GETZCNT}& valore di \var{semzcnt}.\\ \hline \end{tabular} \caption{Valori di ritorno della funzione \func{semctl}.} @@ -2248,21 +2249,21 @@ vengono effettuate con la funzione \func{semop}, il cui prototipo \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[\macro{EACCES}] Il processo non ha i privilegi per eseguire + \item[\errcode{EACCES}] Il processo non ha i privilegi per eseguire l'operazione richiesta. - \item[\macro{EIDRM}] L'insieme di semafori è stato cancellato. - \item[\macro{ENOMEM}] Si è richiesto un \macro{SEM\_UNDO} ma il sistema + \item[\errcode{EIDRM}] L'insieme di semafori è stato cancellato. + \item[\errcode{ENOMEM}] Si è richiesto un \const{SEM\_UNDO} ma il sistema non ha le risorse per allocare la struttura di ripristino. - \item[\macro{EAGAIN}] Un'operazione comporterebbe il blocco del processo, - ma si è specificato \macro{IPC\_NOWAIT} in \var{sem\_flg}. - \item[\macro{EINTR}] La funzione, bloccata in attesa dell'esecuzione + \item[\errcode{EAGAIN}] Un'operazione comporterebbe il blocco del processo, + ma si è specificato \const{IPC\_NOWAIT} in \var{sem\_flg}. + \item[\errcode{EINTR}] La funzione, bloccata in attesa dell'esecuzione dell'operazione, viene interrotta da un segnale. - \item[\macro{E2BIG}] L'argomento \param{nsops} è maggiore del numero - massimo di operazioni \macro{SEMOPM}. - \item[\macro{ERANGE}] Per alcune operazioni il valore risultante del - semaforo viene a superare il limite massimo \macro{SEMVMX}. + \item[\errcode{E2BIG}] L'argomento \param{nsops} è maggiore del numero + massimo di operazioni \const{SEMOPM}. + \item[\errcode{ERANGE}] Per alcune operazioni il valore risultante del + semaforo viene a superare il limite massimo \const{SEMVMX}. \end{errlist} - ed inoltre \macro{EFAULT} ed \macro{EINVAL}. + ed inoltre \const{EFAULT} ed \const{EINVAL}. } \end{functions} @@ -2303,11 +2304,11 @@ vettore, per cui il primo semaforo corrisponde ad un valore nullo di \var{sem\_num}. Il campo \var{sem\_flg} è un flag, mantenuto come maschera binaria, per il -quale possono essere impostati i due valori \macro{IPC\_NOWAIT} e -\macro{SEM\_UNDO}. Impostando \macro{IPC\_NOWAIT} si fa si che, invece di +quale possono essere impostati i due valori \const{IPC\_NOWAIT} e +\const{SEM\_UNDO}. Impostando \const{IPC\_NOWAIT} si fa si che, invece di bloccarsi (in tutti quei casi in cui l'esecuzione di una operazione richiede che il processo vada in stato di \textit{sleep}), \func{semop} ritorni -immediatamente con un errore di \macro{EAGAIN}. Impostando \macro{SEM\_UNDO} +immediatamente con un errore di \errcode{EAGAIN}. Impostando \const{SEM\_UNDO} si richiede invece che l'operazione venga registrata in modo che il valore del semaforo possa essere ripristinato all'uscita del processo. @@ -2317,26 +2318,26 @@ possibili: \begin{basedescript}{\desclabelwidth{2.0cm}} \item[\var{sem\_op}$>0$] In questo caso il valore di \var{sem\_op} viene aggiunto al valore corrente di \var{semval}. La funzione ritorna - immediatamente (con un errore di \macro{ERANGE} qualora si sia superato il - limite \macro{SEMVMX}) ed il processo non viene bloccato in nessun caso. - Specificando \macro{SEM\_UNDO} si aggiorna il contatore per il ripristino + immediatamente (con un errore di \errcode{ERANGE} qualora si sia superato il + limite \const{SEMVMX}) ed il processo non viene bloccato in nessun caso. + Specificando \const{SEM\_UNDO} si aggiorna il contatore per il ripristino del valore del semaforo. Al processo chiamante è richiesto il privilegio di alterazione (scrittura) sull'insieme di semafori. \item[\var{sem\_op}$=0$] Nel caso \var{semval} sia zero l'esecuzione procede immediatamente. Se \var{semval} è diverso da zero il comportamento è - controllato da \var{sem\_flg}, se è stato impostato \macro{IPC\_NOWAIT} la - funzione ritorna con un errore di \macro{EAGAIN}, altrimenti viene + controllato da \var{sem\_flg}, se è stato impostato \const{IPC\_NOWAIT} la + funzione ritorna con un errore di \errcode{EAGAIN}, altrimenti viene incrementato \var{semzcnt} di uno ed il processo resta in stato di \textit{sleep} fintanto che non si ha una delle condizioni seguenti: \begin{itemize*} \item \var{semval} diventa zero, nel qual caso \var{semzcnt} viene decrementato di uno. \item l'insieme di semafori viene rimosso, nel qual caso \func{semop} ritorna - un errore di \macro{EIDRM}. + un errore di \errcode{EIDRM}. \item il processo chiamante riceve un segnale, nel qual caso \var{semzcnt} viene decrementato di uno e \func{semop} ritorna un errore di - \macro{EINTR}. + \errcode{EINTR}. \end{itemize*} Al processo chiamante è richiesto il privilegio di lettura dell'insieme dei semafori. @@ -2344,24 +2345,24 @@ possibili: \item[\var{sem\_op}$<0$] Nel caso in cui \var{semval} è maggiore o uguale del valore assoluto di \var{sem\_op} (se cioè la somma dei due valori resta positiva o nulla) i valori vengono sommati e la funzione ritorna - immediatamente; qualora si sia impostato \macro{SEM\_UNDO} viene anche + immediatamente; qualora si sia impostato \const{SEM\_UNDO} viene anche aggiornato il contatore per il ripristino del valore del semaforo. In caso contrario (quando cioè la somma darebbe luogo ad un valore di \var{semval} - negativo) se si è impostato \macro{IPC\_NOWAIT} la funzione ritorna con un - errore di \macro{EAGAIN}, altrimenti viene incrementato di uno \var{semncnt} - ed il processo resta in stato di \textit{sleep} fintanto che non si ha una - delle condizioni seguenti: + negativo) se si è impostato \const{IPC\_NOWAIT} la funzione ritorna con un + errore di \errcode{EAGAIN}, altrimenti viene incrementato di uno + \var{semncnt} ed il processo resta in stato di \textit{sleep} fintanto che + non si ha una delle condizioni seguenti: \begin{itemize*} \item \var{semval} diventa maggiore o uguale del valore assoluto di \var{sem\_op}, nel qual caso \var{semncnt} viene decrementato di uno, il valore di \var{sem\_op} viene sommato a \var{semval}, e se era stato - impostato \macro{SEM\_UNDO} viene aggiornato il contatore per il + impostato \const{SEM\_UNDO} viene aggiornato il contatore per il ripristino del valore del semaforo. - \item l'insieme di semafori viene rimosso, nel qual caso \func{semop} ritorna - un errore di \macro{EIDRM}. + \item l'insieme di semafori viene rimosso, nel qual caso \func{semop} + ritorna un errore di \errcode{EIDRM}. \item il processo chiamante riceve un segnale, nel qual caso \var{semncnt} viene decrementato di uno e \func{semop} ritorna un errore di - \macro{EINTR}. + \errcode{EINTR}. \end{itemize*} Al processo chiamante è richiesto il privilegio di alterazione (scrittura) sull'insieme di semafori. @@ -2375,7 +2376,7 @@ vengono pure aggiornati al tempo corrente i campi \var{sem\_otime} e Dato che, come già accennato in precedenza, in caso di uscita inaspettata i semafori possono restare occupati, abbiamo visto come \func{semop} permetta di attivare un meccanismo di ripristino attraverso l'uso del flag -\macro{SEM\_UNDO}. Il meccanismo è implementato tramite una apposita struttura +\const{SEM\_UNDO}. Il meccanismo è implementato tramite una apposita struttura \var{sem\_undo}, associata ad ogni processo per ciascun semaforo che esso ha modificato; all'uscita i semafori modificati vengono ripristinati, e le strutture disallocate. Per mantenere coerente il comportamento queste @@ -2421,7 +2422,7 @@ viene ripetuto fin quando non ci sono pi svuotata la coda. Per gestire il meccanismo del ripristino tutte le volte che per un'operazione -si è specificato il flag \macro{SEM\_UNDO} viene mantenuta per ciascun insieme +si è specificato il flag \const{SEM\_UNDO} viene mantenuta per ciascun insieme di semafori una apposita struttura \var{sem\_undo} che contiene (nel vettore puntato dal campo \var{semadj}) un valore di aggiustamento per ogni semaforo cui viene sommato l'opposto del valore usato per l'operazione. @@ -2528,11 +2529,11 @@ int MutexUnlock(int sem_id) La prima funzione (\texttt{\small 1--17}) è \func{MutexCreate} che data una chiave crea il semaforo usato per il mutex e lo inizializza, restituendone l'identificatore. Il primo passo (\texttt{\small 8}) è chiamare \func{semget} -con \macro{IPC\_CREATE} per creare il semaforo qualora non esista, +con \const{IPC\_CREATE} per creare il semaforo qualora non esista, assegnandogli i privilegi di lettura e scrittura per tutti. In caso di errore (\texttt{\small 9--11}) si ritorna subito il risultato di \func{semget}, altrimenti (\texttt{\small 12}) si inizializza il semaforo chiamando -\func{semctl} con il comando \macro{SETVAL}, utilizzando l'unione +\func{semctl} con il comando \const{SETVAL}, utilizzando l'unione \var{semunion} dichiarata ed avvalorata in precedenza (\texttt{\small 6}) ad 1 per significare che risorsa è libera. In caso di errore (\texttt{\small 13--16}) si restituisce il valore di ritorno di \func{semctl}, altrimenti si @@ -2552,7 +2553,7 @@ funzione. La terza funzione (\texttt{\small 25--31}) è \func{MutexRead} che, dato l'identificatore, restituisce il valore del mutex. Anche in questo caso la funzione è un \textit{wrapper} per la chiamata di \func{semctl}, questa volta -con il comando \macro{GETVAL}, che permette di restituire il valore del +con il comando \const{GETVAL}, che permette di restituire il valore del semaforo. La quarta e la quinta funzione (\texttt{\small 43--56}) sono \func{MutexLock}, @@ -2560,7 +2561,7 @@ e \func{MutexUnlock}, che permettono rispettivamente di bloccare e sbloccare il mutex. Entrambe fanno da wrapper per \func{semop}, utilizzando le due strutture \var{sem\_lock} e \var{sem\_unlock} definite in precedenza (\texttt{\small 32--42}). Si noti come per queste ultime si sia fatto uso -dell'opzione \macro{SEM\_UNDO} per evitare che il semaforo resti bloccato in +dell'opzione \const{SEM\_UNDO} per evitare che il semaforo resti bloccato in caso di terminazione imprevista del processo.%% Si noti infine come, essendo %% tutte le funzioni riportate in \figref{fig:ipc_mutex_create} estremamente %% semplici, se si sono definite tutte come \ctyp{inline}.\footnote{la direttiva @@ -2612,17 +2613,17 @@ ed il suo prototipo \bodydesc{La funzione restituisce l'identificatore (un intero positivo) o -1 in caso di errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\macro{ENOSPC}] Si è superato il limite (\macro{SHMMNI}) sul numero + \item[\errcode{ENOSPC}] Si è superato il limite (\const{SHMMNI}) sul numero di segmenti di memoria nel sistema, o cercato di allocare un segmento le - cui dimensioni fanno superare il limite di sistema (\macro{SHMALL}) per + cui dimensioni fanno superare il limite di sistema (\const{SHMALL}) per la memoria ad essi riservata. - \item[\macro{EINVAL}] Si è richiesta una dimensione per un nuovo segmento - maggiore di \macro{SHMMAX} o minore di \macro{SHMMIN}, o se il segmento + \item[\errcode{EINVAL}] Si è richiesta una dimensione per un nuovo segmento + maggiore di \const{SHMMAX} o minore di \const{SHMMIN}, o se il segmento già esiste \param{size} è maggiore delle sue dimensioni. - \item[\macro{ENOMEM}] Il sistema non ha abbastanza memoria per poter + \item[\errcode{ENOMEM}] Il sistema non ha abbastanza memoria per poter contenere le strutture per un nuovo segmento di memoria condivisa. \end{errlist} - ed inoltre \macro{EACCES}, \macro{ENOENT}, \macro{EEXIST}, \macro{EIDRM}, + ed inoltre \const{EACCES}, \const{ENOENT}, \const{EEXIST}, \const{EIDRM}, con lo stesso significato che hanno per \func{msgget}.} \end{functions} @@ -2630,7 +2631,7 @@ La funzione, come \func{semget}, identico è l'uso degli argomenti \param{key} e \param{flag} per cui non ripeteremo quanto detto al proposito in \secref{sec:ipc_sysv_mq}. L'argomento \param{size} specifica invece la dimensione, in byte, del segmento, che viene -comunque arrotondata al multiplo superiore di \macro{PAGE\_SIZE}. +comunque arrotondata al multiplo superiore di \const{PAGE\_SIZE}. La memoria condivisa è la forma più veloce di comunicazione fra due processi, in quanto permette agli stessi di vedere nel loro spazio di indirizzi una @@ -2715,21 +2716,21 @@ che permettono di cambiarne il valore. & \textbf{Significato} \\ \hline \hline - \macro{SHMALL}& 0x200000&\file{shmall}& Numero massimo di pagine che + \const{SHMALL}& 0x200000&\file{shmall}& Numero massimo di pagine che possono essere usate per i segmenti di memoria condivisa. \\ - \macro{SHMMAX}&0x2000000&\file{shmmax}& Dimensione massima di un segmento + \const{SHMMAX}&0x2000000&\file{shmmax}& Dimensione massima di un segmento di memoria condivisa.\\ - \macro{SHMMNI}& 4096&\file{msgmni}& Numero massimo di segmenti di + \const{SHMMNI}& 4096&\file{msgmni}& Numero massimo di segmenti di memoria condivisa presenti nel kernel.\\ - \macro{SHMMIN}& 1& --- & Dimensione minima di un segmento di + \const{SHMMIN}& 1& --- & Dimensione minima di un segmento di memoria condivisa. \\ - \macro{SHMLBA}&\macro{PAGE\_SIZE}&--- & Limite inferiore per le dimensioni + \const{SHMLBA}&\const{PAGE\_SIZE}&--- & Limite inferiore per le dimensioni minime di un segmento (deve essere allineato alle dimensioni di una pagina di memoria). \\ - \macro{SHMSEG}& --- & --- & Numero massimo di segmenti di + \const{SHMSEG}& --- & --- & Numero massimo di segmenti di memoria condivisa per ciascun processo.\\ @@ -2755,42 +2756,42 @@ un segmento di memoria condivisa \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\macro{EACCES}] Si è richiesto \macro{IPC\_STAT} ma i permessi non + \item[\errcode{EACCES}] Si è richiesto \const{IPC\_STAT} ma i permessi non consentono l'accesso in lettura al segmento. - \item[\macro{EINVAL}] O \param{shmid} o \param{cmd} hanno valori non + \item[\errcode{EINVAL}] O \param{shmid} o \param{cmd} hanno valori non validi. - \item[\macro{EIDRM}] L'argomento \param{shmid} fa riferimento ad un + \item[\errcode{EIDRM}] L'argomento \param{shmid} fa riferimento ad un segmento che è stato cancellato. - \item[\macro{EPERM}] Si è specificato un comando con \macro{IPC\_SET} o - \macro{IPC\_RMID} senza i permessi necessari. - \item[\macro{EOVERFLOW}] L'argomento \param{shmid} fa riferimento ad un + \item[\errcode{EPERM}] Si è specificato un comando con \const{IPC\_SET} o + \const{IPC\_RMID} senza i permessi necessari. + \item[\errcode{EOVERFLOW}] L'argomento \param{shmid} fa riferimento ad un segmento che è stato cancellato. \end{errlist} - ed inoltre \macro{EFAULT}.} + ed inoltre \const{EFAULT}.} \end{functions} Il comportamento della funzione dipende dal valore del comando passato attraverso l'argomento \param{cmd}, i valori possibili sono i seguenti: \begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}} -\item[\macro{IPC\_STAT}] Legge le informazioni riguardo il segmento di memoria +\item[\const{IPC\_STAT}] Legge le informazioni riguardo il segmento di memoria condivisa nella struttura \var{shmid\_ds} puntata da \param{buf}. Occorre avere il permesso di lettura sulla coda. -\item[\macro{IPC\_RMID}] Marca il segmento di memoria condivisa per la +\item[\const{IPC\_RMID}] Marca il segmento di memoria condivisa per la rimozione, questo verrà cancellato effettivamente solo quando l'ultimo processo ad esso agganciato si sarà staccato. Questo comando può essere eseguito solo da un processo con userid effettivo corrispondente o al creatore della coda, o al proprietario della coda, o all'amministratore. -\item[\macro{IPC\_SET}] Permette di modificare i permessi ed il proprietario +\item[\const{IPC\_SET}] Permette di modificare i permessi ed il proprietario del segmento. Per modificare i valori di \var{shm\_perm.mode}, \var{shm\_perm.uid} e \var{shm\_perm.gid} occorre essere il proprietario o il creatore della coda, oppure l'amministratore. Compiuta l'operazione aggiorna anche il valore del campo \var{shm\_ctime}. -\item[\macro{SHM\_LOCK}] Abilita il \textit{memory locking}\index{memory +\item[\const{SHM\_LOCK}] Abilita il \textit{memory locking}\index{memory locking}\footnote{impedisce cioè che la memoria usata per il segmento venga salvata su disco dal meccanismo della memoria virtuale; si ricordi quanto trattato in \secref{sec:proc_mem_lock}.} sul segmento di memoria condivisa. Solo l'amministratore può utilizzare questo comando. -\item[\macro{SHM\_UNLOCK}] Disabilita il \textit{memory locking} sul segmento +\item[\const{SHM\_UNLOCK}] Disabilita il \textit{memory locking} sul segmento di memoria condivisa. Solo l'amministratore può utilizzare questo comando. \end{basedescript} i primi tre comandi sono gli stessi già visti anche per le code ed i semafori, @@ -2811,13 +2812,13 @@ indirizzi; il suo prototipo successo, e -1 in caso di errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\macro{EACCES}] Il processo non ha i privilegi per accedere al + \item[\errcode{EACCES}] Il processo non ha i privilegi per accedere al segmento nella modalità richiesta. - \item[\macro{EINVAL}] Si è specificato un identificatore invalido per + \item[\errcode{EINVAL}] Si è specificato un identificatore invalido per \param{shmid}, o un indirizzo non allineato sul confine di una pagina per \param{shmaddr}. \end{errlist} - ed inoltre \macro{ENOMEM}.} + ed inoltre \const{ENOMEM}.} \end{functions} La funzione inserisce un segmento di memoria condivisa all'interno dello @@ -2844,14 +2845,14 @@ L'argomento \param{shmaddr} specifica a quale indirizzo\footnote{Lo standard \acr{libc4} e le \acr{libc5}, con il passaggio alle \acr{glibc} il tipo di \param{shmaddr} è divenuto un \ctyp{const void *} e quello del valore di ritorno un \ctyp{void *}.} deve essere associato il segmento, se il valore -specificato è \macro{NULL} è il sistema a scegliere opportunamente un'area di +specificato è \val{NULL} è il sistema a scegliere opportunamente un'area di memoria libera (questo è il modo più portabile e sicuro di usare la funzione). Altrimenti il kernel aggancia il segmento all'indirizzo specificato da \param{shmaddr}; questo però può avvenire solo se l'indirizzo coincide con il limite di una pagina, cioè se è un multiplo esatto del parametro di sistema -\macro{SHMLBA}, che in Linux è sempre uguale \macro{PAGE\_SIZE}. +\const{SHMLBA}, che in Linux è sempre uguale \const{PAGE\_SIZE}. -Si tenga presente però che quando si usa \macro{NULL} come valore di +Si tenga presente però che quando si usa \val{NULL} come valore di \param{shmaddr}, l'indirizzo restituito da \func{shmat} può cambiare da processo a processo; pertanto se nell'area di memoria condivisa si salvano anche degli indirizzi, si deve avere cura di usare valori relativi (in genere @@ -2859,19 +2860,19 @@ riferiti all'indirizzo di partenza del segmento). L'argomento \param{shmflg} permette di cambiare il comportamento della funzione; esso va specificato come maschera binaria, i bit utilizzati sono -solo due e sono identificati dalle costanti \macro{SHM\_RND} e -\macro{SHM\_RDONLY}, che vanno combinate con un OR aritmetico. Specificando -\macro{SHM\_RND} si evita che \func{shmat} ritorni un errore quando +solo due e sono identificati dalle costanti \const{SHM\_RND} e +\const{SHM\_RDONLY}, che vanno combinate con un OR aritmetico. Specificando +\const{SHM\_RND} si evita che \func{shmat} ritorni un errore quando \param{shmaddr} non è allineato ai confini di una pagina. Si può quindi usare un valore qualunque per \param{shmaddr}, e il segmento verrà comunque -agganciato, ma al più vicino multiplo di \macro{SHMLBA} (il nome della +agganciato, ma al più vicino multiplo di \const{SHMLBA} (il nome della costante sta infatti per \textit{rounded}, e serve per specificare un -indirizzo come arrotondamento, in Linux è equivalente a \macro{PAGE\_SIZE}). +indirizzo come arrotondamento, in Linux è equivalente a \const{PAGE\_SIZE}). -L'uso di \macro{SHM\_RDONLY} permette di agganciare il segmento in sola +L'uso di \const{SHM\_RDONLY} permette di agganciare il segmento in sola lettura (si ricordi che anche le pagine di memoria hanno dei permessi), in tal caso un tentativo di scrivere sul segmento comporterà una violazione di -accesso con l'emissione di un segnale di \macro{SIGSEGV}. Il comportamento +accesso con l'emissione di un segnale di \const{SIGSEGV}. Il comportamento usuale di \func{shmat} è quello di agganciare il segmento con l'accesso in lettura e scrittura (ed il processo deve aver questi permessi in \var{shm\_perm}), non è prevista la possibilità di agganciare un segmento in @@ -2910,7 +2911,7 @@ dell'interfaccia, \func{shmdt}, il cui prototipo \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di errore, la funzione fallisce solo quando non c'è un segmento agganciato all'indirizzo \func{shmaddr}, con \var{errno} che assume il valore - \macro{EINVAL}.} + \const{EINVAL}.} \end{functions} La funzione sgancia dallo spazio degli indirizzi del processo un segmento di @@ -2998,8 +2999,8 @@ usa la caratteristica della funzione \func{open} (illustrata in standard POSIX.1, ciò non toglie che in alcune implementazioni questa tecnica possa non funzionare; in particolare per Linux, nel caso di NFS, si è comunque soggetti alla possibilità di una race condition.} che essa -ritorni un errore quando usata con i flag di \macro{O\_CREAT} e -\macro{O\_EXCL}. In tal modo la creazione di un \textsl{file di lock} può +ritorni un errore quando usata con i flag di \const{O\_CREAT} e +\const{O\_EXCL}. In tal modo la creazione di un \textsl{file di lock} può essere eseguita atomicamente, il processo che crea il file con successo si può considerare come titolare del lock (e della risorsa ad esso associata) mentre il rilascio si può eseguire con una chiamata ad \func{unlink}. @@ -3182,11 +3183,11 @@ evitare l'uso di una memoria condivisa facendo ricorso al cosiddetto Abbiamo visto in \secref{sec:file_memory_map} che è possibile mappare il contenuto di un file nella memoria di un processo, e che, quando viene usato -il flag \macro{MAP\_SHARED}, le modifiche effettuate al contenuto del file +il flag \const{MAP\_SHARED}, le modifiche effettuate al contenuto del file vengono viste da tutti i processi che lo hanno mappato. Utilizzare questa tecnica per creare una memoria condivisa fra processi diversi è estremamente inefficiente, in quanto occorre passare attraverso il disco. Però abbiamo -visto anche che se si esegue la mappatura con il flag \macro{MAP\_ANONYMOUS} +visto anche che se si esegue la mappatura con il flag \const{MAP\_ANONYMOUS} la regione mappata non viene associata a nessun file, anche se quanto scritto rimane in memoria e può essere riletto; allora, dato che un processo figlio mantiene nel suo spazio degli indirizzi anche le regioni mappate, esso sarà diff --git a/process.tex b/process.tex index a90c4ed..d708c2e 100644 --- a/process.tex +++ b/process.tex @@ -115,8 +115,8 @@ valore dello stato di uscita incorrere nel caso in cui restituendo un codice di errore 256, si otterrebbe uno stato di uscita uguale a zero, che verrebbe interpretato come un successo. -In \file{stdlib.h} sono definite, seguendo lo standard POSIX, le due macro -\macro{EXIT\_SUCCESS} e \macro{EXIT\_FAILURE}, da usare sempre per specificare +In \file{stdlib.h} sono definite, seguendo lo standard POSIX, le due costanti +\const{EXIT\_SUCCESS} e \const{EXIT\_FAILURE}, da usare sempre per specificare lo stato di uscita di un processo. In Linux esse sono poste rispettivamente ai valori di tipo \ctyp{int} 0 e 1. @@ -156,7 +156,7 @@ non vengono salvati e le eventuali funzioni registrate con \func{atexit} e 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 ereditato da \cmd{init} (vedi -\secref{cha:process_handling}), manda un segnale \macro{SIGCHLD} al processo +\secref{cha:process_handling}), manda un segnale \const{SIGCHLD} al processo padre (vedi \secref{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 \secref{sec:proc_wait}). @@ -332,7 +332,7 @@ commette quando si chiamato un \textit{segmentation fault}. Se si tenta cioè di leggere o scrivere da un indirizzo per il quale non esiste un'associazione della pagina virtuale, il kernel risponde al relativo \textit{page fault}\index{page fault} -mandando un segnale \macro{SIGSEGV} al processo, che normalmente ne causa la +mandando un segnale \const{SIGSEGV} al processo, che normalmente ne causa la terminazione immediata. È pertanto importante capire come viene strutturata \textsl{la memoria @@ -467,20 +467,20 @@ prototipi sono i seguenti: La funzione restituisce il puntatore alla zona di memoria allocata in caso di successo e \val{NULL} in caso di fallimento, nel qual caso - \var{errno} assumerà il valore \macro{ENOMEM}. + \var{errno} assumerà il valore \const{ENOMEM}. \funcdecl{void *malloc(size\_t size)} Alloca \var{size} byte nello heap. La memoria non viene inizializzata. La funzione restituisce il puntatore alla zona di memoria allocata in caso di successo e \val{NULL} in caso di fallimento, nel qual caso - \var{errno} assumerà il valore \macro{ENOMEM}. + \var{errno} assumerà il valore \const{ENOMEM}. \funcdecl{void *realloc(void *ptr, size\_t size)} Cambia la dimensione del blocco allocato all'indirizzo \var{ptr} portandola a \var{size}. La funzione restituisce il puntatore alla zona di memoria allocata in caso di successo e \val{NULL} in caso di fallimento, nel qual caso - \var{errno} assumerà il valore \macro{ENOMEM}. + \var{errno} assumerà il valore \const{ENOMEM}. \funcdecl{void free(void *ptr)} Disalloca lo spazio di memoria puntato da \var{ptr}. @@ -543,10 +543,10 @@ operazione. Le \acr{glibc} hanno un'implementazione delle routine di allocazione che è controllabile dall'utente attraverso alcune variabili di ambiente, in particolare diventa possibile tracciare questo tipo di errori usando la -variabile \macro{MALLOC\_CHECK\_} che quando viene definita mette in uso una -versione meno efficiente delle funzioni suddette, che però è più tollerante -nei confronti di piccoli errori come quello di chiamate doppie a \func{free}. -In particolare: +variabile d'ambiente \val{MALLOC\_CHECK\_} che quando viene definita mette in +uso una versione meno efficiente delle funzioni suddette, che però è più +tollerante nei confronti di piccoli errori come quello di chiamate doppie a +\func{free}. In particolare: \begin{itemize} \item se la variabile è posta a zero gli errori vengono ignorati. \item se è posta ad 1 viene stampato un avviso sullo \textit{standard error} @@ -627,7 +627,7 @@ stack della funzione corrente. La sintassi La funzione restituisce il puntatore alla zona di memoria allocata in caso di successo e \val{NULL} in caso di fallimento, nel qual caso - \var{errno} assumerà il valore \macro{ENOMEM}. + \var{errno} assumerà il valore \const{ENOMEM}. \end{prototype} \noindent ma in questo caso non è più necessario liberare la memoria (e quindi non esiste un analogo della \func{free}) in quanto essa viene rilasciata @@ -679,7 +679,7 @@ analoghe system call a cui fanno da interfaccia. I loro prototipi sono: \var{end\_data\_segment}. La funzione restituisce 0 in caso di successo e -1 in caso di - fallimento, nel qual caso \var{errno} assumerà il valore \macro{ENOMEM}. + fallimento, nel qual caso \var{errno} assumerà il valore \const{ENOMEM}. \funcdecl{void *sbrk(ptrdiff\_t increment)} Incrementa lo spazio dati di un programma di \var{increment}. Un valore zero restituisce l'attuale posizione @@ -687,7 +687,7 @@ analoghe system call a cui fanno da interfaccia. I loro prototipi sono: La funzione restituisce il puntatore all'inizio della nuova zona di memoria allocata in caso di successo e \val{NULL} in caso di fallimento, nel qual - caso \macro{errno} assumerà il valore \macro{ENOMEM}. + caso \var{errno} assumerà il valore \const{ENOMEM}. \end{functions} \noindent in genere si usa \func{sbrk} con un valore zero per ottenere l'attuale posizione della fine del segmento dati. @@ -768,9 +768,9 @@ relative alla propria memoria. Il sistema pone dei limiti all'ammontare di memoria di un processo che può essere bloccata e al totale di memoria fisica che può dedicare a questo, lo -standard POSIX.1 richiede che sia definita in \file{unistd.h} la costante +standard POSIX.1 richiede che sia definita in \file{unistd.h} la macro \macro{\_POSIX\_MEMLOCK\_RANGE} per indicare la capacità di eseguire il -\textit{memory locking} e la costante \macro{PAGESIZE} in \file{limits.h} per +\textit{memory locking} e la costante \const{PAGESIZE} in \file{limits.h} per indicare la dimensione di una pagina in byte. Le funzioni per bloccare e sbloccare singole sezioni di memoria sono @@ -791,12 +791,12 @@ Le funzioni per bloccare e sbloccare singole sezioni di memoria sono caso di errore, nel qual caso \var{errno} assumerà uno dei valori seguenti: \begin{errlist} - \item[\macro{ENOMEM}] alcuni indirizzi dell'intervallo specificato non + \item[\errcode{ENOMEM}] alcuni indirizzi dell'intervallo specificato non corrispondono allo spazio di indirizzi del processo o si è ecceduto il numero massimo consentito di pagine bloccate. - \item[\macro{EINVAL}] \var{len} non è un valore positivo. + \item[\errcode{EINVAL}] \var{len} non è un valore positivo. \end{errlist} - e, per \func{mlock}, anche \macro{EPERM} quando il processo non ha i + e, per \func{mlock}, anche \const{EPERM} quando il processo non ha i privilegi richiesti per l'operazione.} \end{functions} @@ -821,9 +821,9 @@ Il parametro \var{flags} di \func{mlockall} permette di controllarne il comportamento; esso può essere specificato come l'OR aritmetico delle due costanti: \begin{basedescript}{\desclabelwidth{2.5cm}} -\item[\macro{MCL\_CURRENT}] blocca tutte le pagine correntemente mappate nello +\item[\const{MCL\_CURRENT}] blocca tutte le pagine correntemente mappate nello spazio di indirizzi del processo. -\item[\macro{MCL\_FUTURE}] blocca tutte le pagine che saranno mappate nello +\item[\const{MCL\_FUTURE}] blocca tutte le pagine che saranno mappate nello spazio di indirizzi del processo. \end{basedescript} @@ -1009,7 +1009,7 @@ Normalmente \func{getopt} compie una permutazione degli elementi di \var{argv} cosicché alla fine della scansione gli elementi che non sono opzioni sono spostati in coda al vettore. Oltre a questa esistono altre due modalità di gestire gli elementi di \var{argv}; se \var{optstring} inizia con il carattere -\texttt{'+'} (o è impostata la variabile di ambiente \macro{POSIXLY\_CORRECT}) +\texttt{'+'} (o è impostata la variabile di ambiente \val{POSIXLY\_CORRECT}) la scansione viene fermata non appena si incontra un elemento che non è un'opzione. L'ultima modalità, usata quando un programma può gestire la mescolanza fra opzioni e argomenti, ma se li aspetta in un ordine definito, si @@ -1096,20 +1096,20 @@ controllare \cmd{man environ}. & \textbf{Linux} & \textbf{Descrizione} \\ \hline \hline - \macro{USER} & $\bullet$ & $\bullet$ & $\bullet$ & Nome utente\\ - \macro{LOGNAME} & $\bullet$ & $\bullet$ & $\bullet$ & Nome di login\\ - \macro{HOME} & $\bullet$ & $\bullet$ & $\bullet$ & + \val{USER} & $\bullet$ & $\bullet$ & $\bullet$ & Nome utente\\ + \val{LOGNAME} & $\bullet$ & $\bullet$ & $\bullet$ & Nome di login\\ + \val{HOME} & $\bullet$ & $\bullet$ & $\bullet$ & Directory base dell'utente\\ - \macro{LANG} & $\bullet$ & $\bullet$ & $\bullet$ & Localizzazione\\ - \macro{PATH} & $\bullet$ & $\bullet$ & $\bullet$ & Elenco delle directory + \val{LANG} & $\bullet$ & $\bullet$ & $\bullet$ & Localizzazione\\ + \val{PATH} & $\bullet$ & $\bullet$ & $\bullet$ & Elenco delle directory dei programmi\\ - \macro{PWD} & $\bullet$ & $\bullet$ & $\bullet$ & Directory corrente\\ - \macro{SHELL} & $\bullet$ & $\bullet$ & $\bullet$ & Shell in uso\\ - \macro{TERM} & $\bullet$ & $\bullet$ & $\bullet$ & Tipo di terminale\\ - \macro{PAGER} & $\bullet$ & $\bullet$ & $\bullet$ & Programma per vedere i + \val{PWD} & $\bullet$ & $\bullet$ & $\bullet$ & Directory corrente\\ + \val{SHELL} & $\bullet$ & $\bullet$ & $\bullet$ & Shell in uso\\ + \val{TERM} & $\bullet$ & $\bullet$ & $\bullet$ & Tipo di terminale\\ + \val{PAGER} & $\bullet$ & $\bullet$ & $\bullet$ & Programma per vedere i testi\\ - \macro{EDITOR} & $\bullet$ & $\bullet$ & $\bullet$ & Editor preferito\\ - \macro{BROWSER} & $\bullet$ & $\bullet$ & $\bullet$ & Browser preferito\\ + \val{EDITOR} & $\bullet$ & $\bullet$ & $\bullet$ & Editor preferito\\ + \val{BROWSER} & $\bullet$ & $\bullet$ & $\bullet$ & Browser preferito\\ \hline \end{tabular} \caption{Variabili di ambiente più comuni definite da vari standard.} @@ -1174,7 +1174,7 @@ ambiente, i loro prototipi sono i seguenti: all'ambiente. \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e -1 per un - errore, che è sempre \macro{ENOMEM}.} + errore, che è sempre \const{ENOMEM}.} \end{functions} \noindent la terza, \func{unsetenv}, serve a cancellare una variabile di ambiente; il suo prototipo è: diff --git a/prochand.tex b/prochand.tex index 583011a..0277d64 100644 --- a/prochand.tex +++ b/prochand.tex @@ -150,7 +150,7 @@ interrupt,\footnote{pi parte.} (ma può essere anche attivato esplicitamente). Il timer di sistema provvede comunque a che esso sia invocato periodicamente, generando un interrupt periodico secondo la frequenza specificata dalla costante -\macro{HZ}, definita in \file{asm/param.h}, ed il cui valore è espresso in +\const{HZ}, definita in \file{asm/param.h}, ed il cui valore è espresso in Hertz.\footnote{Il valore usuale di questa costante è 100, per tutte le architetture eccetto l'alpha, per la quale è 1000. Occorre fare attenzione a non confondere questo valore con quello dei clock tick (vedi @@ -236,7 +236,7 @@ un nuovo processo viene creato, fino ad un limite che, essendo il \acr{pid} un numero positivo memorizzato in un intero a 16 bit, arriva ad un massimo di 32768. Oltre questo valore l'assegnazione riparte dal numero più basso disponibile a partire da un minimo di 300,\footnote{questi valori, fino al - kernel 2.4.x, sono definiti dalla macro \macro{PID\_MAX} in \file{threads.h} + kernel 2.4.x, sono definiti dalla macro \const{PID\_MAX} in \file{threads.h} e direttamente in \file{fork.c}, con il kernel 2.5.x e la nuova interfaccia per i thread creata da Ingo Molnar anche il meccanismo di allocazione dei \acr{pid} è stato modificato.} che serve a riservare i \acr{pid} più bassi @@ -300,10 +300,10 @@ prototipo della funzione zero al figlio; ritorna -1 al padre (senza creare il figlio) in caso di errore; \var{errno} può assumere i valori: \begin{errlist} - \item[\macro{EAGAIN}] non ci sono risorse sufficienti per creare un'altro + \item[\errcode{EAGAIN}] non ci sono risorse sufficienti per creare un'altro processo (per allocare la tabella delle pagine e le strutture del task) o si è esaurito il numero di processi disponibili. - \item[\macro{ENOMEM}] non è stato possibile allocare la memoria per le + \item[\errcode{ENOMEM}] non è stato possibile allocare la memoria per le strutture necessarie al kernel per creare il nuovo processo. \end{errlist}} \end{functions} @@ -696,7 +696,7 @@ modalit chiamare la funzione \func{abort} per invocare una chiusura anomala, o essere terminato da un segnale. In realtà anche la prima modalità si riconduce alla seconda, dato che \func{abort} si limita a generare il segnale -\macro{SIGABRT}. +\const{SIGABRT}. Qualunque sia la modalità di conclusione di un processo, il kernel esegue comunque una serie di operazioni: chiude tutti i file aperti, rilascia la @@ -707,15 +707,15 @@ eseguite alla chiusura di un processo \item viene memorizzato lo stato di terminazione del processo. \item ad ogni processo figlio viene assegnato un nuovo padre (in genere \cmd{init}). -\item viene inviato il segnale \macro{SIGCHLD} al processo padre (vedi +\item viene inviato il segnale \const{SIGCHLD} al processo padre (vedi \secref{sec:sig_sigchld}). \item se il processo è un leader di sessione ed il suo terminale di controllo - è quello della sessione viene mandato un segnale di \macro{SIGHUP} a tutti i + è quello della sessione viene mandato un segnale di \const{SIGHUP} a tutti i processi del gruppo di foreground e il terminale di controllo viene disconnesso (vedi \secref{sec:sess_ctrl_term}). \item se la conclusione di un processo rende orfano un \textit{process group} ciascun membro del gruppo viene bloccato, e poi gli vengono - inviati in successione i segnali \macro{SIGHUP} e \macro{SIGCONT} + inviati in successione i segnali \const{SIGHUP} e \const{SIGCONT} (vedi ancora \secref{sec:sess_ctrl_term}). \end{itemize*} @@ -869,7 +869,7 @@ segnale termina il processo o chiama una funzione di gestione. \bodydesc{La funzione restituisce il \acr{pid} del figlio in caso di successo e -1 in caso di errore; \var{errno} può assumere i valori: \begin{errlist} - \item[\macro{EINTR}] la funzione è stata interrotta da un segnale. + \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale. \end{errlist}} \end{functions} \noindent @@ -903,19 +903,19 @@ funzione, il cui prototipo Attende la conclusione di un processo figlio. \bodydesc{La funzione restituisce il \acr{pid} del processo che è uscito, 0 se - è stata specificata l'opzione \macro{WNOHANG} e il processo non è uscito e + è stata specificata l'opzione \const{WNOHANG} e il processo non è uscito e -1 per un errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\macro{EINTR}] se non è stata specificata l'opzione \macro{WNOHANG} e + \item[\errcode{EINTR}] se non è stata specificata l'opzione \const{WNOHANG} e la funzione è stata interrotta da un segnale. - \item[\macro{ECHILD}] il processo specificato da \param{pid} non esiste o + \item[\errcode{ECHILD}] il processo specificato da \param{pid} non esiste o non è figlio del processo chiamante. \end{errlist}} \end{functions} Le differenze principali fra le due funzioni sono che \func{wait} si blocca sempre fino a che un processo figlio non termina, mentre \func{waitpid} ha la -possibilità si specificare un'opzione \macro{WNOHANG} che ne previene il +possibilità si specificare un'opzione \const{WNOHANG} che ne previene il blocco; inoltre \func{waitpid} può specificare quale processo attendere sulla base del valore fornito dall'argomento \param{pid}, secondo lo specchietto riportato in \tabref{tab:proc_waidpid_pid}: @@ -930,9 +930,9 @@ specchietto riportato in \tabref{tab:proc_waidpid_pid}: $<-1$& -- & attende per un figlio il cui \textit{process group} (vedi \secref{sec:sess_proc_group}) è uguale al valore assoluto di \var{pid}. \\ - $-1$ & \macro{WAIT\_ANY} & attende per un figlio qualsiasi, usata in + $-1$ & \const{WAIT\_ANY} & attende per un figlio qualsiasi, usata in questa maniera è equivalente a \func{wait}.\\ - $0$ & \macro{WAIT\_MYPGRP} & attende per un figlio il cui \textit{process + $0$ & \const{WAIT\_MYPGRP} & attende per un figlio il cui \textit{process group} è uguale a quello del processo chiamante. \\ $>0$ & -- &attende per un figlio il cui \acr{pid} è uguale al valore di \var{pid}.\\ @@ -945,8 +945,8 @@ specchietto riportato in \tabref{tab:proc_waidpid_pid}: Il comportamento di \func{waitpid} può inoltre essere modificato passando delle opportune opzioni tramite l'argomento \param{option}. I valori possibili -sono il già citato \macro{WNOHANG}, che previene il blocco della funzione -quando il processo figlio non è terminato, e \macro{WUNTRACED}. Quest'ultimo +sono il già citato \const{WNOHANG}, che previene il blocco della funzione +quando il processo figlio non è terminato, e \const{WUNTRACED}. Quest'ultimo viene generalmente usato per il controllo di sessione, (trattato in \secref{sec:sess_job_control}) in quanto permette di identificare i processi bloccati. La funzione infatti in tal caso ritorna, restituendone il \acr{pid}, @@ -961,7 +961,7 @@ La terminazione di un processo figlio rispetto all'esecuzione di un programma e può avvenire in un qualunque momento. Per questo motivo, come accennato nella sezione precedente, una delle azioni prese dal kernel alla conclusione di un processo è quella di mandare un -segnale di \macro{SIGCHLD} al padre. L'azione predefinita (si veda +segnale di \const{SIGCHLD} al padre. L'azione predefinita (si veda \secref{sec:sig_base}) per questo segnale è di essere ignorato, ma la sua generazione costituisce il meccanismo di comunicazione asincrona con cui il kernel avverte il processo padre che uno dei suoi figli è terminato. @@ -971,7 +971,7 @@ conclusione di un processo per proseguire, specie se tutto questo serve solo per leggerne lo stato di chiusura (ed evitare la presenza di \textit{zombie}), per questo la modalità più usata per chiamare queste funzioni è quella di utilizzarle all'interno di un \textit{signal handler} (vedremo un esempio di -come gestire \macro{SIGCHLD} con i segnali in \secref{sec:sig_example}). In +come gestire \const{SIGCHLD} con i segnali in \secref{sec:sig_example}). In questo caso infatti, dato che il segnale è generato dalla terminazione di un figlio, avremo la certezza che la chiamata a \func{wait} non si bloccherà. @@ -1090,26 +1090,26 @@ famiglia di funzioni) che possono essere usate per questo compito, in realt \bodydesc{La funzione ritorna solo in caso di errore, restituendo -1; nel qual caso \var{errno} può assumere i valori: \begin{errlist} - \item[\macro{EACCES}] il file non è eseguibile, oppure il filesystem è + \item[\errcode{EACCES}] il file non è eseguibile, oppure il filesystem è montato in \cmd{noexec}, oppure non è un file regolare o un interprete. - \item[\macro{EPERM}] il file ha i bit \acr{suid} o \acr{sgid}, l'utente non + \item[\errcode{EPERM}] il file ha i bit \acr{suid} o \acr{sgid}, l'utente non è root, e o il processo viene tracciato, o il filesystem è montato con l'opzione \cmd{nosuid}. - \item[\macro{ENOEXEC}] il file è in un formato non eseguibile o non + \item[\errcode{ENOEXEC}] il file è in un formato non eseguibile o non riconosciuto come tale, o compilato per un'altra architettura. - \item[\macro{ENOENT}] il file o una delle librerie dinamiche o l'interprete + \item[\errcode{ENOENT}] il file o una delle librerie dinamiche o l'interprete necessari per eseguirlo non esistono. - \item[\macro{ETXTBSY}] L'eseguibile è aperto in scrittura da uno o più + \item[\errcode{ETXTBSY}] L'eseguibile è aperto in scrittura da uno o più processi. - \item[\macro{EINVAL}] L'eseguibile ELF ha più di un segmento - \macro{PF\_INTERP}, cioè chiede di essere eseguito da più di un + \item[\errcode{EINVAL}] L'eseguibile ELF ha più di un segmento + \const{PF\_INTERP}, cioè chiede di essere eseguito da più di un interprete. - \item[\macro{ELIBBAD}] Un interprete ELF non è in un formato + \item[\errcode{ELIBBAD}] Un interprete ELF non è in un formato riconoscibile. \end{errlist} - ed inoltre anche \macro{EFAULT}, \macro{ENOMEM}, \macro{EIO}, - \macro{ENAMETOOLONG}, \macro{E2BIG}, \macro{ELOOP}, \macro{ENOTDIR}, - \macro{ENFILE}, \macro{EMFILE}.} + ed inoltre anche \const{EFAULT}, \const{ENOMEM}, \const{EIO}, + \const{ENAMETOOLONG}, \const{E2BIG}, \const{ELOOP}, \const{ENOTDIR}, + \const{ENFILE}, \const{EMFILE}.} \end{prototype} La funzione \func{exec} esegue il file o lo script indicato da @@ -1199,10 +1199,10 @@ viene eseguita automaticamente una ricerca fra i file presenti nella lista di directory specificate dalla variabile di ambiente \var{PATH}. Il file che viene posto in esecuzione è il primo che viene trovato. Se si ha un errore relativo a permessi di accesso insufficienti (cioè l'esecuzione della -sottostante \func{execve} ritorna un \macro{EACCESS}), la ricerca viene +sottostante \func{execve} ritorna un \errcode{EACCESS}), la ricerca viene proseguita nelle eventuali ulteriori directory indicate in \var{PATH}; solo se non viene trovato nessun altro file viene finalmente restituito -\macro{EACCESS}. +\errcode{EACCESS}. Le altre quattro funzioni si limitano invece a cercare di eseguire il file indicato dal parametro \var{path}, che viene interpretato come il @@ -1218,7 +1218,7 @@ indicato dal parametro \var{path}, che viene interpretato come il La terza differenza è come viene passata la lista delle variabili di ambiente. Con lo mnemonico \code{e} vengono indicate quelle funzioni che necessitano di un vettore di parametri \var{envp[]} analogo a quello usato per gli argomenti -a riga di comando (terminato quindi da un \macro{NULL}), le altre usano il +a riga di comando (terminato quindi da un \val{NULL}), le altre usano il valore della variabile \var{environ} (vedi \secref{sec:proc_environ}) del processo di partenza per costruire l'ambiente. @@ -1249,8 +1249,8 @@ la lista completa Inoltre i segnali che sono stati impostati per essere ignorati nel processo chiamante mantengono la stessa impostazione pure nel nuovo programma, tutti gli altri segnali vengono impostati alla loro azione predefinita. Un caso -speciale è il segnale \macro{SIGCHLD} che, quando impostato a -\macro{SIG\_IGN}, può anche non essere reimpostato a \macro{SIG\_DFL} (si veda +speciale è il segnale \const{SIGCHLD} che, quando impostato a +\const{SIG\_IGN}, può anche non essere reimpostato a \const{SIG\_DFL} (si veda \secref{sec:sig_gen_beha}). La gestione dei file aperti dipende dal valore che ha il flag di @@ -1280,7 +1280,7 @@ Se il file da eseguire condivise, viene lanciato il \textit{linker} dinamico \cmd{ld.so} prima del programma per caricare le librerie necessarie ed effettuare il link dell'eseguibile. Se il programma è in formato ELF per caricare le librerie -dinamiche viene usato l'interprete indicato nel segmento \macro{PT\_INTERP}, +dinamiche viene usato l'interprete indicato nel segmento \const{PT\_INTERP}, in genere questo è \file{/lib/ld-linux.so.1} per programmi linkati con le \acr{libc5}, e \file{/lib/ld-linux.so.2} per programmi linkati con le \acr{glibc}. Infine nel caso il file sia uno script esso deve iniziare con @@ -1492,7 +1492,7 @@ corrente. corrente. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso - di fallimento: l'unico errore possibile è \macro{EPERM}.} + di fallimento: l'unico errore possibile è \const{EPERM}.} \end{functions} Il funzionamento di queste due funzioni è analogo, per cui considereremo solo @@ -1507,7 +1507,7 @@ sistema) allora tutti gli identificatori (\textit{real}, \textit{effective} e altrimenti viene impostato solo l'\textsl{userid effettivo}, e soltanto se il valore specificato corrisponde o all'\textsl{userid reale} o all'\textsl{userid salvato}. Negli altri casi viene segnalato un errore (con -\macro{EPERM}). +\errcode{EPERM}). Come accennato l'uso principale di queste funzioni è quello di poter consentire ad un programma con i bit \acr{suid} o \acr{sgid} impostati (vedi @@ -1592,7 +1592,7 @@ specificati da \var{ruid} e \var{euid}. specificati da \var{rgid} e \var{egid}. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso - di fallimento: l'unico errore possibile è \macro{EPERM}.} + di fallimento: l'unico errore possibile è \const{EPERM}.} \end{functions} La due funzioni sono analoghe ed il loro comportamento è identico; quanto @@ -1644,7 +1644,7 @@ corrente a \var{uid}. corrente a \var{gid}. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso - di fallimento: l'unico errore possibile è \macro{EPERM}.} + di fallimento: l'unico errore possibile è \const{EPERM}.} \end{functions} Come per le precedenti le due funzioni sono identiche, per cui tratteremo solo @@ -1675,7 +1675,7 @@ corrente ai valori specificati rispettivamente da \var{rgid}, \var{egid} e \var{sgid}. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso - di fallimento: l'unico errore possibile è \macro{EPERM}.} + di fallimento: l'unico errore possibile è \const{EPERM}.} \end{functions} Le due funzioni sono identiche, quanto detto per la prima riguardo gli userid @@ -1700,7 +1700,7 @@ groupid reale, il groupid effettivo e il groupid salvato del processo corrente. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso di - fallimento: l'unico errore possibile è \macro{EFAULT} se gli indirizzi delle + fallimento: l'unico errore possibile è \const{EFAULT} se gli indirizzi delle variabili di ritorno non sono validi.} \end{functions} @@ -1747,7 +1747,7 @@ processo corrente a \var{fsuid}. processo corrente a \var{fsgid}. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso - di fallimento: l'unico errore possibile è \macro{EPERM}.} + di fallimento: l'unico errore possibile è \const{EPERM}.} \end{functions} \noindent queste funzioni hanno successo solo se il processo chiamante ha i privilegi di amministratore o, per gli altri utenti, se il valore specificato @@ -1759,7 +1759,7 @@ coincide con uno dei di quelli del gruppo \textit{real}, \textit{effective} o \label{sec:proc_setgroups} Le ultime funzioni che esamineremo sono quelle che permettono di operare sui -gruppi supplementari. Ogni processo può avere fino a \macro{NGROUPS\_MAX} +gruppi supplementari. Ogni processo può avere fino a \const{NGROUPS\_MAX} gruppi supplementari in aggiunta al gruppo primario, questi vengono ereditati dal processo padre e possono essere cambiati con queste funzioni. @@ -1777,8 +1777,8 @@ questa funzione successo e -1 in caso di fallimento, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\macro{EFAULT}] \param{list} non ha un indirizzo valido. - \item[\macro{EINVAL}] il valore di \param{size} è diverso da zero ma + \item[\errcode{EFAULT}] \param{list} non ha un indirizzo valido. + \item[\errcode{EINVAL}] il valore di \param{size} è diverso da zero ma minore del numero di gruppi supplementari del processo. \end{errlist}} \end{functions} @@ -1818,10 +1818,10 @@ delle due \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di fallimento, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\macro{EFAULT}] \param{list} non ha un indirizzo valido. - \item[\macro{EPERM}] il processo non ha i privilegi di amministratore. - \item[\macro{EINVAL}] il valore di \param{size} è maggiore del valore - massimo (\macro{NGROUPS}, che per Linux è 32). + \item[\errcode{EFAULT}] \param{list} non ha un indirizzo valido. + \item[\errcode{EPERM}] il processo non ha i privilegi di amministratore. + \item[\errcode{EINVAL}] il valore di \param{size} è maggiore del valore + massimo (\const{NGROUPS}, che per Linux è 32). \end{errlist}} \end{functions} @@ -1837,7 +1837,7 @@ un utente specifico, si pu \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di fallimento, nel qual caso \var{errno} assumerà gli stessi valori di - \func{setgroups} più \macro{ENOMEM} quando non c'è memoria sufficiente per + \func{setgroups} più \const{ENOMEM} quando non c'è memoria sufficiente per allocare lo spazio per informazioni dei gruppi.} \end{functions} @@ -1921,7 +1921,7 @@ fintanto che esso si trova in uno qualunque degli altri stati. attesa di un risposta dal sistema (in genere per I/O), e non può essere interrotto in nessuna circostanza. \\ \textbf{Stopped} & \texttt{T} & Il processo è stato fermato con un - \macro{SIGSTOP}, o è tracciato.\\ + \const{SIGSTOP}, o è tracciato.\\ \textbf{Zombie} & \texttt{Z} & Il processo è terminato ma il suo stato di terminazione non è ancora stato letto dal padre. \\ \hline @@ -2032,14 +2032,14 @@ solo attraverso la funzione \func{nice}, il cui prototipo \bodydesc{La funzione ritorna zero in caso di successo e -1 in caso di errore, nel qual caso \var{errno} può assumere i valori: \begin{errlist} - \item[\macro{EPERM}] un processo senza i privilegi di amministratore ha + \item[\errcode{EPERM}] un processo senza i privilegi di amministratore ha specificato un valore di \param{inc} negativo. \end{errlist}} \end{prototype} L'argomento \param{inc} indica l'incremento del valore di \var{nice}: -quest'ultimo può assumere valori compresi fra \macro{PRIO\_MIN} e -\macro{PRIO\_MAX} (che nel caso di Linux sono $-19$ e $20$), ma per +quest'ultimo può assumere valori compresi fra \const{PRIO\_MIN} e +\const{PRIO\_MAX} (che nel caso di Linux sono $-19$ e $20$), ma per \param{inc} si può specificare un valore qualunque, positivo o negativo, ed il sistema provvederà a troncare il risultato nell'intervallo consentito. Valori positivi comportano maggiore \textit{cortesia} e cioè una diminuzione della @@ -2058,9 +2058,9 @@ Restituisce il valore di \var{nice} per l'insieme dei processi specificati. \bodydesc{La funzione ritorna la priorità in caso di successo e -1 in caso di errore, nel qual caso \var{errno} può assumere i valori: \begin{errlist} - \item[\macro{ESRCH}] non c'è nessun processo che corrisponda ai valori di + \item[\errcode{ESRCH}] non c'è nessun processo che corrisponda ai valori di \param{which} e \param{who}. - \item[\macro{EINVAL}] il valore di \param{which} non è valido. + \item[\errcode{EINVAL}] il valore di \param{which} non è valido. \end{errlist}} \end{prototype} \noindent (in vecchie versioni può essere necessario includere anche @@ -2081,9 +2081,9 @@ quest'ultimo indica il processo, il gruppo di processi o l'utente correnti. \param{which} & \param{who} & \textbf{Significato} \\ \hline \hline - \macro{PRIO\_PROCESS} & \type{pid\_t} & processo \\ - \macro{PRIO\_PRGR} & \type{pid\_t} & process group \\ - \macro{PRIO\_USER} & \type{uid\_t} & utente \\ + \const{PRIO\_PROCESS} & \type{pid\_t} & processo \\ + \const{PRIO\_PRGR} & \type{pid\_t} & process group \\ + \const{PRIO\_USER} & \type{uid\_t} & utente \\ \hline \end{tabular} \caption{Legenda del valore dell'argomento \param{which} e del tipo @@ -2107,12 +2107,12 @@ impostare la priorit \bodydesc{La funzione ritorna la priorità in caso di successo e -1 in caso di errore, nel qual caso \var{errno} può assumere i valori: \begin{errlist} - \item[\macro{ESRCH}] non c'è nessun processo che corrisponda ai valori di + \item[\errcode{ESRCH}] non c'è nessun processo che corrisponda ai valori di \param{which} e \param{who}. - \item[\macro{EINVAL}] il valore di \param{which} non è valido. - \item[\macro{EPERM}] un processo senza i privilegi di amministratore ha + \item[\errcode{EINVAL}] il valore di \param{which} non è valido. + \item[\errcode{EPERM}] un processo senza i privilegi di amministratore ha specificato un valore di \param{inc} negativo. - \item[\macro{EACCESS}] un processo senza i privilegi di amministratore ha + \item[\errcode{EACCESS}] un processo senza i privilegi di amministratore ha cercato di modificare la priorità di un processo di un altro utente. \end{errlist}} \end{prototype} @@ -2185,12 +2185,12 @@ prototipo \bodydesc{La funzione ritorna la priorità in caso di successo e -1 in caso di errore, nel qual caso \var{errno} può assumere i valori: \begin{errlist} - \item[\macro{ESRCH}] il processo \param{pid} non esiste. - \item[\macro{EINVAL}] il valore di \param{policy} non esiste o il relativo + \item[\errcode{ESRCH}] il processo \param{pid} non esiste. + \item[\errcode{EINVAL}] il valore di \param{policy} non esiste o il relativo valore di \param{p} non è valido. - \item[\macro{EPERM}] il processo non ha i privilegi per attivare la - politica richiesta (vale solo per \macro{SCHED\_FIFO} e - \macro{SCHED\_RR}). + \item[\errcode{EPERM}] il processo non ha i privilegi per attivare la + politica richiesta (vale solo per \const{SCHED\_FIFO} e + \const{SCHED\_RR}). \end{errlist}} \end{prototype} @@ -2210,10 +2210,10 @@ la politica di scheduling corrente. \textbf{Policy} & \textbf{Significato} \\ \hline \hline - \macro{SCHED\_FIFO} & Scheduling real-time con politica \textit{FIFO} \\ - \macro{SCHED\_RR} & Scheduling real-time con politica \textit{Round + \const{SCHED\_FIFO} & Scheduling real-time con politica \textit{FIFO} \\ + \const{SCHED\_RR} & Scheduling real-time con politica \textit{Round Robin} \\ - \macro{SCHED\_OTHER}& Scheduling ordinario\\ + \const{SCHED\_OTHER}& Scheduling ordinario\\ \hline \end{tabular} \caption{Valori dell'argomento \param{policy} per la funzione @@ -2261,13 +2261,13 @@ e \func{sched\_get\_priority\_min}, i cui prototipi sono: \bodydesc{La funzioni ritornano il valore della priorità in caso di successo e -1 in caso di errore, nel qual caso \var{errno} può assumere i valori: \begin{errlist} - \item[\macro{EINVAL}] il valore di \param{policy} è invalido. + \item[\errcode{EINVAL}] il valore di \param{policy} è invalido. \end{errlist}} \end{functions} -I processi con politica di scheduling \macro{SCHED\_OTHER} devono specificare -un valore nullo (altrimenti si avrà un errore \macro{EINVAL}), questo valore +I processi con politica di scheduling \const{SCHED\_OTHER} devono specificare +un valore nullo (altrimenti si avrà un errore \errcode{EINVAL}), questo valore infatti non ha niente a che vedere con la priorità dinamica determinata dal valore di \var{nice}, che deve essere impostato con le funzioni viste in precedenza. @@ -2275,7 +2275,7 @@ precedenza. Il kernel mantiene i processi con la stessa priorità assoluta in una lista, ed esegue sempre il primo della lista, mentre un nuovo processo che torna in stato \textit{runnable} viene sempre inserito in coda alla lista. Se la -politica scelta è \macro{SCHED\_FIFO} quando il processo viene eseguito viene +politica scelta è \const{SCHED\_FIFO} quando il processo viene eseguito viene automaticamente rimesso in coda alla lista, e la sua esecuzione continua fintanto che non viene bloccato da una richiesta di I/O, o non rilascia volontariamente la CPU (in tal caso, tornando nello stato \textit{runnable} @@ -2291,8 +2291,8 @@ La priorit \bodydesc{La funzione ritorna la politica di scheduling in caso di successo e -1 in caso di errore, nel qual caso \var{errno} può assumere i valori: \begin{errlist} - \item[\macro{ESRCH}] il processo \param{pid} non esiste. - \item[\macro{EINVAL}] il valore di \param{pid} è negativo. + \item[\errcode{ESRCH}] il processo \param{pid} non esiste. + \item[\errcode{EINVAL}] il valore di \param{pid} è negativo. \end{errlist}} \end{prototype} @@ -2318,8 +2318,8 @@ prototipi sono: \bodydesc{La funzione ritorna la priorità in caso di successo e -1 in caso di errore, nel qual caso \var{errno} può assumere i valori: \begin{errlist} - \item[\macro{ESRCH}] il processo \param{pid} non esiste. - \item[\macro{EINVAL}] il valore di \param{pid} è negativo. + \item[\errcode{ESRCH}] il processo \param{pid} non esiste. + \item[\errcode{EINVAL}] il valore di \param{pid} è negativo. \end{errlist}} \end{functions} @@ -2328,7 +2328,7 @@ L'uso di \func{sched\_setparam} che \func{sched\_setscheduler} specificando 0 come valore di \param{pid} si opera sul processo corrente. La disponibilità di entrambe le funzioni può essere verificata controllando la macro \macro{\_POSIX\_PRIORITY\_SCHEDULING} che è -definita nell'header \macro{sched.h}. +definita nell'header \file{sched.h}. L'ultima funzione che permette di leggere le informazioni relative ai processi real-time è \func{sched\_rr\_get\_interval}, che permette di ottenere la @@ -2341,8 +2341,8 @@ il suo prototipo \bodydesc{La funzione ritorna 0in caso di successo e -1 in caso di errore, nel qual caso \var{errno} può assumere i valori: \begin{errlist} - \item[\macro{ESRCH}] il processo \param{pid} non esiste. - \item[\macro{ENOSYS}] la system call non è stata implementata. + \item[\errcode{ESRCH}] il processo \param{pid} non esiste. + \item[\errcode{ENOSYS}] la system call non è stata implementata. \end{errlist}} \end{prototype} diff --git a/session.tex b/session.tex index 98a308a..90ecc48 100644 --- a/session.tex +++ b/session.tex @@ -103,7 +103,7 @@ Di norma la shell si cura anche di notificare all'utente (di solito prima della stampa a video del prompt) lo stato dei vari processi; essa infatti sarà in grado, grazie all'uso di \func{waitpid}, di rilevare sia i processi che sono terminati, sia i raggruppamenti che sono bloccati (in questo caso usando -l'opzione \macro{WUNTRACED}, secondo quanto illustrato in +l'opzione \const{WUNTRACED}, secondo quanto illustrato in \secref{sec:proc_wait}). @@ -138,7 +138,7 @@ i cui prototipi sono: \bodydesc{Le funzioni restituiscono il \acr{pgid} del processo, \func{getpgrp} ha sempre successo, mentre \func{getpgid} restituisce -1 - ponendo \var{errno} a \macro{ESRCH} se il processo selezionato non esiste.} + ponendo \var{errno} a \const{ESRCH} se il processo selezionato non esiste.} \end{functions} La funzione \func{getpgid} permette di specificare il \acr{pid} del processo @@ -161,8 +161,8 @@ funzione \func{getsid}, che per caso di successo, e -1 in caso di errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\macro{ESRCH}] Il processo selezionato non esiste. - \item[\macro{EPERM}] In alcune implementazioni viene restituito quando il + \item[\errcode{ESRCH}] Il processo selezionato non esiste. + \item[\errcode{EPERM}] In alcune implementazioni viene restituito quando il processo selezionato non fa parte della stessa sessione del processo corrente. \end{errlist} @@ -205,10 +205,10 @@ cui prototipo \bodydesc{La funzione ritorna il valore del nuovo \textit{process group}, e -1 in caso di errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\macro{ESRCH}] Il processo selezionato non esiste. - \item[\macro{EPERM}] Il cambiamento non è consentito. - \item[\macro{EACCESS}] Il processo ha già eseguito una \func{exec}. - \item[\macro{EINVAL}] Il valore di \param{pgid} è negativo. + \item[\errcode{ESRCH}] Il processo selezionato non esiste. + \item[\errcode{EPERM}] Il cambiamento non è consentito. + \item[\errcode{EACCESS}] Il processo ha già eseguito una \func{exec}. + \item[\errcode{EINVAL}] Il valore di \param{pgid} è negativo. \end{errlist} } \end{prototype} @@ -243,7 +243,7 @@ sessione ad un processo \acr{pgid}. \bodydesc{La funzione ritorna il valore del nuovo \acr{sid}, e -1 in caso di - errore, il solo errore possibile è \macro{EPERM}, che si ha quando il + errore, il solo errore possibile è \const{EPERM}, che si ha quando il \acr{pgid} e \acr{pid} del processo coincidono.} \end{prototype} @@ -304,9 +304,9 @@ divenuto un nuovo leader di sessione dovr sempre vera.}, un terminale di controllo. In generale questo viene fatto automaticamente dal sistema\footnote{a meno di non avere richiesto esplicitamente che questo non diventi un terminale di controllo con il flag - \macro{O\_NOCTTY} (vedi \secref{sec:file_open}). In questo Linux segue la + \const{O\_NOCTTY} (vedi \secref{sec:file_open}). In questo Linux segue la semantica di SVr4; BSD invece richiede che il terminale venga allocato - esplicitamente con una \func{ioctl} con il comando \macro{TIOCSCTTY}.} + esplicitamente con una \func{ioctl} con il comando \const{TIOCSCTTY}.} quando viene aperto il primo terminale (cioè uno dei vari file di dispositivo \file{/dev/tty*}) che diventa automaticamente il terminale di controllo, mentre il processo diventa il \textsl{processo di controllo} di quella @@ -329,13 +329,13 @@ funzione \func{tcsetpgrp}, il cui prototipo \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\macro{ENOTTY}] Il file \param{fd} non corrisponde al terminale di + \item[\errcode{ENOTTY}] Il file \param{fd} non corrisponde al terminale di controllo del processo chiamante. - \item[\macro{ENOSYS}] Il sistema non supporta il job control. - \item[\macro{EPERM}] Il \textit{process group} specificato non è nella + \item[\errcode{ENOSYS}] Il sistema non supporta il job control. + \item[\errcode{EPERM}] Il \textit{process group} specificato non è nella stessa sessione del processo chiamante. \end{errlist} - ed inoltre \macro{EBADF} ed \macro{EINVAL}. + ed inoltre \const{EBADF} ed \const{EINVAL}. } \end{functions} \noindent la funzione può essere eseguita con successo solo da @@ -345,7 +345,7 @@ Come accennato in \secref{sec:sess_job_control_overview}, tutti i processi (e relativi raggruppamenti) che non fanno parte del gruppo di \textit{foreground} sono detti in \textit{background}; se uno si essi cerca di accedere al terminale di controllo provocherà l'invio da parte del kernel di uno dei due -segnali \macro{SIGTTIN} o \macro{SIGTTOU} (a seconda che l'accesso sia stato +segnali \const{SIGTTIN} o \const{SIGTTOU} (a seconda che l'accesso sia stato in lettura o scrittura) a tutto il suo \textit{process group}; dato che il comportamento di default di questi segnali (si riveda quanto esposto in \secref{sec:sig_job_control}) è di fermare il processo, di norma questo @@ -353,7 +353,7 @@ comporta che tutti i membri del gruppo verranno fermati, ma non si avranno condizioni di errore.\footnote{la shell in genere notifica comunque un avvertimento, avvertendo la presenza di processi bloccati grazie all'uso di \func{waitpid}.} Se però si bloccano o ignorano i due segnali citati, le -funzioni di lettura e scrittura falliranno con un errore di \macro{EIO}. +funzioni di lettura e scrittura falliranno con un errore di \errcode{EIO}. Un processo può controllare qual'è il gruppo di \textit{foreground} associato ad un terminale con la funzione \func{tcgetpgrp}, il cui prototipo è: @@ -366,10 +366,10 @@ ad un terminale con la funzione \func{tcgetpgrp}, il cui prototipo gruppo di \textit{foreground}, e -1 in caso di errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\macro{ENOTTY}] Non c'è un terminale di controllo o \param{fd} non + \item[\errcode{ENOTTY}] Non c'è un terminale di controllo o \param{fd} non corrisponde al terminale di controllo del processo chiamante. \end{errlist} - ed inoltre \macro{EBADF} ed \macro{ENOSYS}. + ed inoltre \const{EBADF} ed \const{ENOSYS}. } \end{functions} @@ -387,22 +387,22 @@ decifrare, ma deve poi leggere la password dal terminale. Un'altra caratteristica del terminale di controllo usata nel job control è che utilizzando su di esso le combinazioni di tasti speciali (\cmd{C-z}, \cmd{C-c}, \cmd{C-y} e \verb|C-\|) si farà sì che il kernel invii i -corrispondenti segnali (rispettivamente \macro{SIGTSTP}, \macro{SIGINT}, -\macro{SIGQUIT} e \macro{SIGTERM}, trattati in \secref{sec:sig_job_control}) a +corrispondenti segnali (rispettivamente \const{SIGTSTP}, \const{SIGINT}, +\const{SIGQUIT} e \const{SIGTERM}, trattati in \secref{sec:sig_job_control}) a tutti i processi del raggruppamento di \textit{foreground}; in questo modo la shell può gestire il blocco e l'interruzione dei vari comandi. Per completare la trattazione delle caratteristiche del job control legate al terminale di controllo, occorre prendere in considerazione i vari casi legati alla terminazione anomala dei processi, che sono di norma gestite attraverso -il segnale \macro{SIGHUP}. Il nome del segnale deriva da \textit{hungup}, +il segnale \const{SIGHUP}. Il nome del segnale deriva da \textit{hungup}, termine che viene usato per indicare la condizione in cui il terminale diventa inutilizzabile, (letteralmente sarebbe \textsl{impiccagione}). Quando si verifica questa condizione, ad esempio se si interrompe la linea, o va giù la rete o più semplicemente si chiude forzatamente la finestra di terminale su cui si stava lavorando, il kernel provvederà ad inviare il -segnale di \macro{SIGHUP} al processo di controllo. L'azione preimpostata in +segnale di \const{SIGHUP} al processo di controllo. L'azione preimpostata in questo caso è la terminazione del processo, il problema che si pone è cosa accade agli altri processi nella sessione, che non han più un processo di controllo che possa gestire l'accesso al terminale, che potrebbe essere @@ -411,7 +411,7 @@ riutilizzato per qualche altra sessione. Lo standard POSIX.1 prevede che quando il processo di controllo termina, che ciò avvenga o meno per un \textit{hungup} del terminale (ad esempio si potrebbe terminare direttamente la shell con \cmd{kill}) venga inviato un -segnale di \macro{SIGHUP} ai processi del raggruppamento di foreground. In +segnale di \const{SIGHUP} ai processi del raggruppamento di foreground. In questo modo essi potranno essere avvisati che non esiste più un processo in grado di gestire il terminale (di norma tutto ciò comporta la terminazione anche di questi ultimi). @@ -429,8 +429,8 @@ Questa processi nel raggruppamento, o processi fuori della sessione. Lo standard prevede inoltre che se la terminazione di un processo fa sì che un raggruppamento di processi diventi orfano e se i suoi membri sono bloccati, ad -essi vengano inviati in sequenza i segnali di \macro{SIGHUP} e -\macro{SIGCONT}. +essi vengano inviati in sequenza i segnali di \const{SIGHUP} e +\const{SIGCONT}. La definizione può sembrare complicata, e a prima vista non è chiaro cosa tutto ciò abbia a che fare con il problema della terminazione del processo di @@ -454,8 +454,8 @@ leader di sessione per group creati direttamente dal leader di sessione (a meno di non aver spostato con \func{setpgid} un processo da un gruppo ad un altro, cosa che di norma non viene fatta) i quali riceveranno, nel caso siano bloccati, i due segnali; -\macro{SIGCONT} ne farà proseguire l'esecuzione, ed essendo stato nel -frattempo inviato anche \macro{SIGHUP}, se non c'è un gestore per +\const{SIGCONT} ne farà proseguire l'esecuzione, ed essendo stato nel +frattempo inviato anche \const{SIGHUP}, se non c'è un gestore per quest'ultimo, i processi bloccati verranno automaticamente terminati. @@ -570,7 +570,7 @@ controllo per il terminale, a gestire l'esecuzione dei comandi come illustrato in \secref{sec:sess_job_control_overview}. Dato che il processo padre resta sempre \cmd{init} quest'ultimo potrà -provvedere, ricevendo un \macro{SIGCHLD} all'uscita della shell quando la +provvedere, ricevendo un \const{SIGCHLD} all'uscita della shell quando la sessione di lavoro è terminata, a rilanciare \cmd{getty} sul terminale per ripetere da capo tutto il procedimento. @@ -622,7 +622,7 @@ occorrer però non ha associato nessun terminale di controllo. \item Assicurarsi che al processo non venga associato in seguito nessun nuovo terminale di controllo; questo può essere fatto sia avendo cura di usare - sempre l'opzione \macro{O\_NOCTTY} nell'aprire i file di terminale, che + sempre l'opzione \const{O\_NOCTTY} nell'aprire i file di terminale, che eseguendo una ulteriore \func{fork} uscendo nel padre e proseguendo nel figlio. In questo caso, non essendo più quest'ultimo un leader di sessione non potrà ottenere automaticamente un terminale di controllo. @@ -753,24 +753,24 @@ specificato con un OR aritmetico. \textbf{Valore}& \textbf{Significato}\\ \hline \hline - \macro{LOG\_AUTH} & Messaggi relativi ad autenticazione e sicurezza, - obsoleto, è sostituito da \macro{LOG\_AUTHPRIV}. \\ - \macro{LOG\_AUTHPRIV} & Sostituisce \macro{LOG\_AUTH}.\\ - \macro{LOG\_CRON} & Messaggi dei demoni di gestione dei comandi + \const{LOG\_AUTH} & Messaggi relativi ad autenticazione e sicurezza, + obsoleto, è sostituito da \const{LOG\_AUTHPRIV}. \\ + \const{LOG\_AUTHPRIV} & Sostituisce \const{LOG\_AUTH}.\\ + \const{LOG\_CRON} & Messaggi dei demoni di gestione dei comandi programmati (\cmd{cron} e \cmd{at}).\\ - \macro{LOG\_DAEMON} & Demoni di sistema.\\ - \macro{LOG\_FTP} & Server FTP.\\ - \macro{LOG\_KERN} & Messaggi del kernel\\ - \macro{LOG\_LOCAL0} & Riservato all'amministratore per uso locale\\ + \const{LOG\_DAEMON} & Demoni di sistema.\\ + \const{LOG\_FTP} & Server FTP.\\ + \const{LOG\_KERN} & Messaggi del kernel\\ + \const{LOG\_LOCAL0} & Riservato all'amministratore per uso locale\\ --- & \\ - \macro{LOG\_LOCAL7} & Riservato all'amministratore per uso locale\\ - \macro{LOG\_LPR} & Messaggi del sistema di gestione delle stampanti \\ - \macro{LOG\_MAIL} & Messaggi del sistema di posta elettronica\\ - \macro{LOG\_NEWS} & Messaggi del sistema di gestione delle news + \const{LOG\_LOCAL7} & Riservato all'amministratore per uso locale\\ + \const{LOG\_LPR} & Messaggi del sistema di gestione delle stampanti \\ + \const{LOG\_MAIL} & Messaggi del sistema di posta elettronica\\ + \const{LOG\_NEWS} & Messaggi del sistema di gestione delle news (USENET) \\ - \macro{LOG\_SYSLOG} & Messaggi generati dallo stesso \cmd{syslogd}\\ - \macro{LOG\_USER} & Messaggi generici a livello utente\\ - \macro{LOG\_UUCP} & Messaggi del sistema UUCP\\ + \const{LOG\_SYSLOG} & Messaggi generati dallo stesso \cmd{syslogd}\\ + \const{LOG\_USER} & Messaggi generici a livello utente\\ + \const{LOG\_UUCP} & Messaggi del sistema UUCP\\ \hline \end{tabular} \caption{Valori possibili per l'argomento \param{facility} di \func{openlog}.} @@ -791,13 +791,13 @@ con un OR aritmetico di una qualunque delle costanti riportate in \textbf{Valore}& \textbf{Significato}\\ \hline \hline -\macro{LOG\_CONS} & Scrive sulla console quando. \\ -\macro{LOG\_NDELAY} & Sostituisce \macro{LOG\_AUTH}.\\ -\macro{LOG\_NOWAIT} & Messaggi dei demoni di gestione dei comandi +\const{LOG\_CONS} & Scrive sulla console quando. \\ +\const{LOG\_NDELAY} & Sostituisce \const{LOG\_AUTH}.\\ +\const{LOG\_NOWAIT} & Messaggi dei demoni di gestione dei comandi programmati (\cmd{cron} e \cmd{at}).\\ -\macro{LOG\_ODELAY} & .\\ -\macro{LOG\_PERROR} & Stampa anche su \file{stderr}.\\ -\macro{LOG\_PID} & Inserisce nei messaggi il \acr{pid} del processo +\const{LOG\_ODELAY} & .\\ +\const{LOG\_PERROR} & Stampa anche su \file{stderr}.\\ +\const{LOG\_PID} & Inserisce nei messaggi il \acr{pid} del processo chiamante. \\ \hline \end{tabular} @@ -847,15 +847,15 @@ con la maschera binaria delle costanti di \tabref{tab:sess_syslog_facility}. \textbf{Valore}& \textbf{Significato}\\ \hline \hline - \macro{LOG\_EMERG} & Il sistema è inutilizzabile. \\ - \macro{LOG\_ALERT} & C'è una emergenza che richiede intervento + \const{LOG\_EMERG} & Il sistema è inutilizzabile. \\ + \const{LOG\_ALERT} & C'è una emergenza che richiede intervento immediato.\\ - \macro{LOG\_CRIT} & Si è in una condizione critica.\\ - \macro{LOG\_ERR} & Si è in una condizione di errore.\\ - \macro{LOG\_WARNING} & Messaggio di avvertimento.\\ - \macro{LOG\_NOTICE} & Notizia significativa relativa al comportamento.\\ - \macro{LOG\_INFO} & Messaggio informativo. \\ - \macro{LOG\_DEBUG} & Messaggio di debug.\\ + \const{LOG\_CRIT} & Si è in una condizione critica.\\ + \const{LOG\_ERR} & Si è in una condizione di errore.\\ + \const{LOG\_WARNING} & Messaggio di avvertimento.\\ + \const{LOG\_NOTICE} & Notizia significativa relativa al comportamento.\\ + \const{LOG\_INFO} & Messaggio informativo. \\ + \const{LOG\_DEBUG} & Messaggio di debug.\\ \hline \end{tabular} \caption{Valori possibili per l'indice di importanza del messaggio da @@ -969,7 +969,7 @@ kernel. La coda di ingresso mantiene i caratteri che sono stati letti dal terminale ma non ancora letti da un processo, la sua dimensione è definita dal parametro di -sistema \macro{MAX\_INPUT} (si veda \secref{sec:sys_file_limits}), che ne +sistema \const{MAX\_INPUT} (si veda \secref{sec:sys_file_limits}), che ne specifica il limite minimo, in realtà la coda può essere più grande e cambiare dimensione dinamicamente. Se è stato abilitato il controllo di flusso in ingresso il driver emette i caratteri di STOP e START per bloccare e sbloccare @@ -978,7 +978,7 @@ massime vengono persi; in alcuni casi il driver provvede ad inviare automaticamente un avviso (un carattere di BELL, che provoca un beep) sull'output quando si eccedono le dimensioni della coda. Se è abilitato il modo canonico i caratteri in ingresso restano nella coda fintanto che non -viene ricevuto un a capo; un'altra parametro del sistema, \macro{MAX\_CANON}, +viene ricevuto un a capo; un'altra parametro del sistema, \const{MAX\_CANON}, specifica la dimensione massima di una riga in modo canonico. La coda di uscita è analoga a quella di ingresso e contiene i caratteri @@ -1002,7 +1002,7 @@ System V in una unica interfaccia, che Alcune di queste funzioni prendono come argomento un file descriptor (in origine molte operazioni venivano effettuate con \func{ioctl}), ma ovviamente possono essere usate solo con file che corrispondano effettivamente ad un -terminale (altrimenti si otterrà un errore di \macro{ENOTTY}); questo può +terminale (altrimenti si otterrà un errore di \errcode{ENOTTY}); questo può essere evitato utilizzando la funzione \func{isatty}, il cui prototipo è: \begin{prototype}{unistd.h}{int isatty(int desc)} @@ -1020,7 +1020,7 @@ descriptor; il suo prototipo Restituisce il nome del terminale associato al file \param{desc}. \bodydesc{La funzione restituisce il puntatore alla stringa contenente il - nome del terminale associato \param{desc} e \macro{NULL} in caso di + nome del terminale associato \param{desc} e \val{NULL} in caso di errore.} \end{prototype} @@ -1040,7 +1040,7 @@ La funzione scrive il pathname del terminale di controllo del processo chiamante nella stringa posta all'indirizzo specificato dall'argomento \param{s}. La memoria per contenere la stringa deve essere stata allocata in precedenza ed essere lunga almeno -\macro{L\_ctermid}\footnote{\macro{L\_ctermid} è una delle varie costanti del +\const{L\_ctermid}\footnote{\const{L\_ctermid} è una delle varie costanti del sistema, non trattata esplicitamente in \secref{sec:sys_characteristics} che indica la dimensione che deve avere una stringa per poter contenere il nome di un terminale.} caratteri. @@ -1055,10 +1055,10 @@ statica; il suo prototipo \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\macro{ERANGE}] la lunghezza del buffer, \param{len}, non è + \item[\errcode{ERANGE}] la lunghezza del buffer, \param{len}, non è sufficiente per contenere la stringa restituita. \end{errlist} - ed inoltre \macro{EBADF} ed \macro{ENOSYS}. + ed inoltre \const{EBADF} ed \const{ENOSYS}. } \end{prototype} @@ -1068,7 +1068,7 @@ ovviamente essere stata allocata in precedenza), e la relativa dimensione, \param{len}; se la stringa che deve essere restituita eccede questa dimensione si avrà una condizione di errore. -Se si passa come argomento \macro{NULL} la funzione restituisce il puntatore +Se si passa come argomento \val{NULL} la funzione restituisce il puntatore ad una stringa statica che può essere sovrascritta da chiamate successive. Si tenga presente che il pathname restituito potrebbe non identificare univocamente il terminale (ad esempio potrebbe essere \file{/dev/tty}), @@ -1122,68 +1122,68 @@ modificare i bit su cui non si interviene. \textbf{Valore}& \textbf{Significato}\\ \hline \hline - \macro{INPCK} & Abilita il controllo di parità in ingresso. Se non viene + \const{INPCK} & Abilita il controllo di parità in ingresso. Se non viene impostato non viene fatto nessun controllo ed i caratteri vengono passati in input direttamente.\\ - \macro{IGNPAR} & Ignora gli errori di parità, il carattere viene passato + \const{IGNPAR} & Ignora gli errori di parità, il carattere viene passato come ricevuto. Ha senso solo se si è impostato - \macro{INPCK}.\\ - \macro{PARMRK} & Controlla come vengono riportati gli errori di parità. Ha - senso solo se \macro{INPCK} è impostato e \macro{IGNPAR} + \const{INPCK}.\\ + \const{PARMRK} & Controlla come vengono riportati gli errori di parità. Ha + senso solo se \const{INPCK} è impostato e \const{IGNPAR} no. Se impostato inserisce una sequenza \texttt{0xFF 0x00} prima di ogni carattere che presenta errori di parità, se non impostato un carattere con errori di parità viene letto come uno \texttt{0x00}. Se un - carattere ha il valore \texttt{0xFF} e \macro{ISTRIP} + carattere ha il valore \texttt{0xFF} e \const{ISTRIP} non è settato, per evitare ambiguità esso viene sempre riportato come \texttt{0xFF 0xFF}.\\ - \macro{ISTRIP} & Se impostato i caratteri in input sono tagliati a sette + \const{ISTRIP} & Se impostato i caratteri in input sono tagliati a sette bit mettendo a zero il bit più significativo, altrimenti vengono passati tutti gli otto bit.\\ - \macro{IGNBRK} & Ignora le condizioni di BREAK sull'input. Una + \const{IGNBRK} & Ignora le condizioni di BREAK sull'input. Una \textit{condizione di BREAK} è definita nel contesto di una trasmissione seriale asincrona come una sequenza di bit nulli più lunga di un byte. \\ - \macro{BRKINT} & Controlla la reazione ad un BREAK quando - \macro{IGNBRK} non è impostato. Se \macro{BRKINT} è + \const{BRKINT} & Controlla la reazione ad un BREAK quando + \const{IGNBRK} non è impostato. Se \const{BRKINT} è impostato il BREAK causa lo scarico delle code, e se il terminale è il terminale di controllo per un - gruppo in foreground anche l'invio di \macro{SIGINT} ai - processi di quest'ultimo. Se invece \macro{BRKINT} non è + gruppo in foreground anche l'invio di \const{SIGINT} ai + processi di quest'ultimo. Se invece \const{BRKINT} non è impostato un BREAK viene letto come un carattere - NUL, a meno che non sia settato \macro{PARMRK} + NUL, a meno che non sia settato \const{PARMRK} nel qual caso viene letto come la sequenza di caratteri \texttt{0xFF 0x00 0x00}.\\ - \macro{IGNCR} & Se impostato il carattere di ritorno carrello + \const{IGNCR} & Se impostato il carattere di ritorno carrello (\textit{carriage return}, \verb|'\r'|) viene scartato dall'input. Può essere utile per i terminali che inviano entrambi i caratteri di ritorno carrello e a capo (\textit{newline}, \verb|'\n'|). \\ - \macro{ICRNL} & Se impostato un carattere di ritorno carrello + \const{ICRNL} & Se impostato un carattere di ritorno carrello (\verb|'\r'|) sul terminale viene automaticamente trasformato in un a capo (\verb|'\n'|) sulla coda di input. \\ - \macro{INLCR} & Se impostato il carattere di a capo + \const{INLCR} & Se impostato il carattere di a capo (\verb|'\n'|) viene automaticamente trasformato in un ritorno carrello (\verb|'\r'|).\\ - \macro{IUCLC} & Se impostato trasforma i caratteri maiuscoli dal + \const{IUCLC} & Se impostato trasforma i caratteri maiuscoli dal terminale in minuscoli sull'ingresso (opzione non POSIX).\\ - \macro{IXON} & Se impostato attiva il controllo di flusso in uscita con i + \const{IXON} & Se impostato attiva il controllo di flusso in uscita con i caratteri di START e STOP. se si riceve uno STOP l'output viene bloccato, e viene fatto ripartire solo da uno START, e questi due caratteri non vengono passati alla coda di input. Se non impostato i due caratteri sono passati alla coda di input insieme agli altri.\\ - \macro{IXANY} & Se impostato con il controllo di flusso permette a + \const{IXANY} & Se impostato con il controllo di flusso permette a qualunque carattere di far ripartire l'output bloccato da un carattere di STOP.\\ - \macro{IXOFF} & Se impostato abilita il controllo di flusso in + \const{IXOFF} & Se impostato abilita il controllo di flusso in ingresso. Il computer emette un carattere di STOP per bloccare l'input dal terminale e lo sblocca con il carattere START. \\ - \macro{IMAXBEL}& Se impostato fa suonare il cicalino se si riempie la cosa + \const{IMAXBEL}& Se impostato fa suonare il cicalino se si riempie la cosa di ingresso; in Linux non è implementato e il kernel si comporta cose se fosse sempre settato (è una estensione BSD). \\ @@ -1215,45 +1215,45 @@ pseudo-terminali usati nelle connessioni di rete. \textbf{Valore}& \textbf{Significato}\\ \hline \hline - \macro{OPOST} & Se impostato i caratteri vengono convertiti opportunamente + \const{OPOST} & Se impostato i caratteri vengono convertiti opportunamente (in maniera dipendente dall'implementazione) per la visualizzazione sul terminale, ad esempio al carattere di a capo (NL) può venire aggiunto un ritorno carrello (CR).\\ - \macro{OCRNL} & Se impostato converte automaticamente il carattere di a + \const{OCRNL} & Se impostato converte automaticamente il carattere di a capo (NL) nella coppia di caratteri ritorno carrello, a capo (CR-NL).\\ - \macro{OLCUC} & Se impostato trasforma i caratteri minuscoli in ingresso + \const{OLCUC} & Se impostato trasforma i caratteri minuscoli in ingresso in caratteri maiuscoli sull'uscita (non previsto da POSIX.1).\\ - \macro{ONLCR} & Se impostato converte automaticamente il carattere di a + \const{ONLCR} & Se impostato converte automaticamente il carattere di a capo (NL) in un carattere di ritorno carrello (CR).\\ - \macro{ONOCR} & Se impostato converte il carattere di ritorno carrello + \const{ONOCR} & Se impostato converte il carattere di ritorno carrello (CR) nella coppia di caratteri CR-NL.\\ - \macro{ONLRET}& Se impostato rimuove dall'output il carattere di ritorno + \const{ONLRET}& Se impostato rimuove dall'output il carattere di ritorno carrello (CR).\\ - \macro{OFILL} & Se impostato in caso di ritardo sulla linea invia dei + \const{OFILL} & Se impostato in caso di ritardo sulla linea invia dei caratteri di riempimento invece di attendere.\\ - \macro{OFDEL} & Se impostato il carattere di riempimento è DEL + \const{OFDEL} & Se impostato il carattere di riempimento è DEL (\texttt{0x3F}), invece che NUL (\texttt{0x00}).\\ - \macro{NLDLY} & Maschera per i bit che indicano il ritardo per il + \const{NLDLY} & Maschera per i bit che indicano il ritardo per il carattere di a capo (NL), i valori possibili sono - \macro{NL0} o \macro{NL1}.\\ - \macro{CRDLY} & Maschera per i bit che indicano il ritardo per il + \const{NL0} o \const{NL1}.\\ + \const{CRDLY} & Maschera per i bit che indicano il ritardo per il carattere ritorno carrello (CR), i valori possibili sono - \macro{CR0}, \macro{CR1}, \macro{CR2} o \macro{CR3}.\\ - \macro{TABDLY}& Maschera per i bit che indicano il ritardo per il + \const{CR0}, \const{CR1}, \const{CR2} o \const{CR3}.\\ + \const{TABDLY}& Maschera per i bit che indicano il ritardo per il carattere di tabulazione, i valori possibili sono - \macro{TAB0}, \macro{TAB1}, \macro{TAB2} o \macro{TAB3}.\\ - \macro{BSDLY} & Maschera per i bit che indicano il ritardo per il + \const{TAB0}, \const{TAB1}, \const{TAB2} o \const{TAB3}.\\ + \const{BSDLY} & Maschera per i bit che indicano il ritardo per il carattere di ritorno indietro (\textit{backspace}), i - valori possibili sono \macro{BS0} o \macro{BS1}.\\ - \macro{VTDLY} & Maschera per i bit che indicano il ritardo per il + valori possibili sono \const{BS0} o \const{BS1}.\\ + \const{VTDLY} & Maschera per i bit che indicano il ritardo per il carattere di tabulazione verticale, i valori possibili sono - \macro{VT0} o \macro{VT1}.\\ - \macro{FFDLY} & Maschera per i bit che indicano il ritardo per il + \const{VT0} o \const{VT1}.\\ + \const{FFDLY} & Maschera per i bit che indicano il ritardo per il carattere di pagina nuova (\textit{form feed}), i valori - possibili sono \macro{FF0} o \macro{FF1}.\\ + possibili sono \const{FF0} o \const{FF1}.\\ \hline \end{tabular} \caption{Costanti identificative dei vari bit del flag di controllo @@ -1298,51 +1298,51 @@ valore. \textbf{Valore}& \textbf{Significato}\\ \hline \hline - \macro{CLOCAL} & Se impostato indica che il terminale è connesso in locale + \const{CLOCAL} & Se impostato indica che il terminale è connesso in locale e che le linee di controllo del modem devono essere ignorate. Se non impostato effettuando una chiamata ad \func{open} senza aver specificato il flag di - \macro{O\_NOBLOCK} si bloccherà il processo finché + \const{O\_NOBLOCK} si bloccherà il processo finché non si è stabilita una connessione con il modem; inoltre se viene rilevata una disconessione viene inviato un - \macro{SIGHUP} al processo di controllo del terminale. La + \const{SIGHUP} al processo di controllo del terminale. La lettura su un terminale sconnesso comporta una condizione di \textit{end of file} e la scrittura un errore di - \macro{EIO}. \\ - \macro{HUPCL} & Se è impostato viene distaccata la connessione del + \errcode{EIO}. \\ + \const{HUPCL} & Se è impostato viene distaccata la connessione del modem quando l'ultimo dei processi che ha ancora un file aperto sul terminale lo chiude o esce.\\ - \macro{CREAD} & Se è impostato si può leggere l'input del terminale, + \const{CREAD} & Se è impostato si può leggere l'input del terminale, altrimenti i caratteri in ingresso vengono scartati quando arrivano.\\ - \macro{CSTOPB} & Se impostato vengono usati due bit di stop sulla linea + \const{CSTOPB} & Se impostato vengono usati due bit di stop sulla linea seriale, se non impostato ne viene usato soltanto uno.\\ - \macro{PARENB} & Se impostato abilita la generazione il controllo di + \const{PARENB} & Se impostato abilita la generazione il controllo di parità. La reazione in caso di errori dipende dai relativi valori per \var{c\_iflag}, riportati in \tabref{tab:sess_termios_iflag}. Se non è impostato i bit di parità non vengono generati e i caratteri non vengono controllati.\\ - \macro{PARODD} & Ha senso solo se è attivo anche \macro{PARENB}. Se + \const{PARODD} & Ha senso solo se è attivo anche \const{PARENB}. Se impostato viene usata una parità è dispari, altrimenti viene usata una parità pari.\\ - \macro{CSIZE} & Maschera per i bit usati per specificare la dimensione + \const{CSIZE} & Maschera per i bit usati per specificare la dimensione del carattere inviato lungo la linea di trasmissione, i valore ne indica la lunghezza (in bit), ed i valori - possibili sono \macro{CS5}, \macro{CS6}, - \macro{CS7} e \macro{CS8} + possibili sono \const{CS5}, \const{CS6}, + \const{CS7} e \const{CS8} corrispondenti ad un analogo numero di bit.\\ - \macro{CBAUD} & Maschera dei bit (4+1) usati per impostare della velocità + \const{CBAUD} & Maschera dei bit (4+1) usati per impostare della velocità della linea (il \textit{baud rate}) in ingresso. In Linux non è implementato in quanto viene usato un apposito campo di \var{termios}.\\ - \macro{CBAUDEX}& Bit aggiuntivo per l'impostazione della velocità della + \const{CBAUDEX}& Bit aggiuntivo per l'impostazione della velocità della linea, per le stesse motivazioni del precedente non è implementato in Linux.\\ - \macro{CIBAUD} & Maschera dei bit della velocità della linea in - ingresso. Analogo a \macro{CBAUD}, anch'esso in Linux è + \const{CIBAUD} & Maschera dei bit della velocità della linea in + ingresso. Analogo a \const{CBAUD}, anch'esso in Linux è mantenuto in un apposito campo di \var{termios}. \\ - \macro{CRTSCTS}& Abilita il controllo di flusso hardware sulla seriale, + \const{CRTSCTS}& Abilita il controllo di flusso hardware sulla seriale, attraverso l'utilizzo delle dei due fili di RTS e CTS.\\ \hline \end{tabular} @@ -1380,65 +1380,65 @@ seriali all'interno dei flag; come accennato in Linux questo viene fatto \textbf{Valore}& \textbf{Significato}\\ \hline \hline - \macro{ICANON} & Se impostato il terminale opera in modo canonico, + \const{ICANON} & Se impostato il terminale opera in modo canonico, altrimenti opera in modo non canonico.\\ - \macro{ECHO} & Se è impostato viene attivato l'eco dei caratteri in + \const{ECHO} & Se è impostato viene attivato l'eco dei caratteri in input sull'output del terminale.\\ - \macro{ECHOE} & Se è impostato l'eco mostra la cancellazione di un + \const{ECHOE} & Se è impostato l'eco mostra la cancellazione di un carattere in input (in reazione al carattere ERASE) cancellando l'ultimo carattere della riga corrente dallo schermo; altrimenti il carattere è rimandato in eco per mostrare quanto accaduto (usato per i terminali con l'uscita su una stampante). \\ - \macro{ECHOPRT}& Se impostato abilita la visualizzazione del carattere di + \const{ECHOPRT}& Se impostato abilita la visualizzazione del carattere di cancellazione in una modalità adatta ai terminali con l'uscita su stampante; l'invio del carattere di ERASE comporta la stampa di un \verb|\| seguito dal carattere cancellato, e così via in caso di successive cancellazioni, quando si riprende ad immettere carattere normali prima verrà stampata una \texttt{/}.\\ - \macro{ECHOK} & Se impostato abilita il trattamento della visualizzazione + \const{ECHOK} & Se impostato abilita il trattamento della visualizzazione del carattere KILL, andando a capo dopo aver visualizzato lo stesso, altrimenti viene solo mostrato il carattere e sta all'utente ricordare che l'input precedente è stato cancellato. \\ - \macro{ECHOKE} & Se impostato abilita il trattamento della visualizzazione + \const{ECHOKE} & Se impostato abilita il trattamento della visualizzazione del carattere KILL cancellando i caratteri precedenti nella linea secondo le modalità specificate dai valori di - \macro{ECHOE} e \macro{ECHOPRT}.\\ - \macro{ECHONL} & Se impostato viene effettuato l'eco di un a + \const{ECHOE} e \const{ECHOPRT}.\\ + \const{ECHONL} & Se impostato viene effettuato l'eco di un a capo (\verb|\n|) anche se non è stato impostato - \macro{ECHO}. \\ - \macro{ECHOCTL}& Se impostato insieme ad \macro{ECHO} i caratteri di + \const{ECHO}. \\ + \const{ECHOCTL}& Se impostato insieme ad \const{ECHO} i caratteri di controllo ASCII (tranne TAB, NL, START, e STOP) sono mostrati nella forma che prepende un \verb|^| alla lettera ottenuta sommando \texttt{0x40} al valore del carattere (di solito questi si possono ottenere anche direttamente premendo il tasto \texttt{ctrl} più la relativa lettera).\\ - \macro{ISIG} & Se impostato abilita il riconoscimento dei caratteri + \const{ISIG} & Se impostato abilita il riconoscimento dei caratteri INTR, QUIT, e SUSP generando il relativo segnale.\\ - \macro{IEXTEN} & Abilita alcune estensioni previste dalla + \const{IEXTEN} & Abilita alcune estensioni previste dalla implementazione. Deve essere impostato perché caratteri speciali come EOL2, LNEXT, REPRINT e WERASE possano essere interpretati. \\ - \macro{NOFLSH} & Se impostato disabilita lo scarico delle code di ingresso - e uscita quando vengono emessi i segnali \macro{SIGINT}, - \macro{SIGQUIT} and \macro{SIGSUSP}.\\ - \macro{TOSTOP} & Se abilitato, con il supporto per il job control presente, - genera il segnale \macro{SIGTTOU} per un processo in + \const{NOFLSH} & Se impostato disabilita lo scarico delle code di ingresso + e uscita quando vengono emessi i segnali \const{SIGINT}, + \const{SIGQUIT} and \const{SIGSUSP}.\\ + \const{TOSTOP} & Se abilitato, con il supporto per il job control presente, + genera il segnale \const{SIGTTOU} per un processo in background che cerca di scrivere sul terminale.\\ - \macro{XCASE} & Se settato il terminale funziona solo con le + \const{XCASE} & Se settato il terminale funziona solo con le maiuscole. L'input è convertito in minuscole tranne per i caratteri preceduti da una \verb|\|. In output le maiuscole sono precedute da una \verb|\| e le minuscole convertite in maiuscole.\\ - \macro{DEFECHO}& Se impostate effettua l'eco solo se c'è un processo in + \const{DEFECHO}& Se impostate effettua l'eco solo se c'è un processo in lettura.\\ - \macro{FLUSHO} & Effettua la cancellazione della coda di uscita. Viene + \const{FLUSHO} & Effettua la cancellazione della coda di uscita. Viene attivato dal carattere DISCARD. Non è supportato in Linux.\\ - \macro{PENDIN} & Indica che la linea deve essere ristampata, viene + \const{PENDIN} & Indica che la linea deve essere ristampata, viene attivato dal carattere REPRINT e resta attivo fino alla fine della ristampa. Non è supportato in Linux.\\ \hline @@ -1459,16 +1459,16 @@ questo che si impostano le caratteristiche generiche comuni a tutti i terminali. Si tenga presente che i flag che riguardano le modalità di eco dei caratteri -(\macro{ECHOE}, \macro{ECHOPRT}, \macro{ECHOK}, \macro{ECHOKE}, -\macro{ECHONL}) controllano solo il comportamento della visualizzazione, il +(\const{ECHOE}, \const{ECHOPRT}, \const{ECHOK}, \const{ECHOKE}, +\const{ECHONL}) controllano solo il comportamento della visualizzazione, il riconoscimento dei vari caratteri dipende dalla modalità di operazione, ed avviene solo in modo canonico, pertanto questi flag non hanno significato se -non è impostato \macro{ICANON}. +non è impostato \const{ICANON}. Oltre ai vari flag per gestire le varie caratteristiche dei terminali, \var{termios} contiene pure il campo \var{c\_cc} che viene usato per impostare i caratteri speciali associati alle varie funzioni di controllo. Il numero di -questi caratteri speciali è indicato dalla costante \macro{NCCS}, POSIX ne +questi caratteri speciali è indicato dalla costante \const{NCCS}, POSIX ne specifica almeno 11, ma molte implementazioni ne definiscono molti altri.\footnote{in Linux il valore della costante è 32, anche se i caratteri effettivamente definiti sono solo 17.} @@ -1481,18 +1481,18 @@ altri.\footnote{in Linux il valore della costante \textbf{Indice} & \textbf{Valore}&\textbf{Codice} & \textbf{Funzione}\\ \hline \hline - \macro{VINTR} &\texttt{0x03}&(\verb|C-c|)& Carattere di interrupt, + \const{VINTR} &\texttt{0x03}&(\verb|C-c|)& Carattere di interrupt, provoca l'emissione di - \macro{SIGINT}. \\ - \macro{VQUIT} &\texttt{0x1C}&(\verb|C-\|)& Carattere di uscita provoca + \const{SIGINT}. \\ + \const{VQUIT} &\texttt{0x1C}&(\verb|C-\|)& Carattere di uscita provoca l'emissione di - \macro{SIGQUIT}.\\ - \macro{VERASE} &\texttt{0x7f}& DEL & Carattere di ERASE, cancella + \const{SIGQUIT}.\\ + \const{VERASE} &\texttt{0x7f}& DEL & Carattere di ERASE, cancella l'ultimo carattere precedente nella linea.\\ - \macro{VKILL} &\texttt{0x15}&(\verb|C-u|)& Carattere di KILL, cancella + \const{VKILL} &\texttt{0x15}&(\verb|C-u|)& Carattere di KILL, cancella l'intera riga.\\ - \macro{VEOF} &\texttt{0x04}&(\verb|C-d|)& Carattere di + \const{VEOF} &\texttt{0x04}&(\verb|C-d|)& Carattere di \textit{end-of-file}. Causa l'invio del contenuto del buffer di ingresso al @@ -1504,37 +1504,37 @@ altri.\footnote{in Linux il valore della costante zero caratteri, cioè la condizione di \textit{end-of-file}.\\ - \macro{VTIME} & --- & --- & Timeout, in decimi di secondo, per + \const{VTIME} & --- & --- & Timeout, in decimi di secondo, per una lettura in modo non canonico. \\ - \macro{VMIN} & --- & --- & Numero minimo di caratteri per una + \const{VMIN} & --- & --- & Numero minimo di caratteri per una lettura in modo non canonico.\\ - \macro{VSWTC} &\texttt{0x00}& NUL & Carattere di switch. Non supportato + \const{VSWTC} &\texttt{0x00}& NUL & Carattere di switch. Non supportato in Linux.\\ - \macro{VSTART} &\texttt{0x21}&(\verb|C-q|)& Carattere di START. Riavvia un + \const{VSTART} &\texttt{0x21}&(\verb|C-q|)& Carattere di START. Riavvia un output bloccato da uno STOP.\\ - \macro{VSTOP} &\texttt{0x23}&(\verb|C-s|)& Carattere di STOP. Blocca + \const{VSTOP} &\texttt{0x23}&(\verb|C-s|)& Carattere di STOP. Blocca l'output fintanto che non viene premuto un carattere di START.\\ - \macro{VSUSP} &\texttt{0x1A}&(\verb|C-z|)& Carattere di + \const{VSUSP} &\texttt{0x1A}&(\verb|C-z|)& Carattere di sospensione. Invia il segnale - \macro{SIGTSTP}.\\ - \macro{VEOL} &\texttt{0x00}& NUL & Carattere di fine riga. Agisce come + \const{SIGTSTP}.\\ + \const{VEOL} &\texttt{0x00}& NUL & Carattere di fine riga. Agisce come un a capo, ma non viene scartato ed è letto come l'ultimo carattere nella riga. \\ - \macro{VREPRINT}&\texttt{0x12}&(\verb|C-r|)& Ristampa i caratteri non + \const{VREPRINT}&\texttt{0x12}&(\verb|C-r|)& Ristampa i caratteri non ancora letti. \\ - \macro{VDISCARD}&\texttt{0x07}&(\verb|C-o|)& Non riconosciuto in Linux. \\ - \macro{VWERASE} &\texttt{0x17}&(\verb|C-w|)& Cancellazione di una parola.\\ - \macro{VLNEXT} &\texttt{0x16}&(\verb|C-v|)& Carattere di escape, serve a + \const{VDISCARD}&\texttt{0x07}&(\verb|C-o|)& Non riconosciuto in Linux. \\ + \const{VWERASE} &\texttt{0x17}&(\verb|C-w|)& Cancellazione di una parola.\\ + \const{VLNEXT} &\texttt{0x16}&(\verb|C-v|)& Carattere di escape, serve a quotare il carattere successivo che non viene interpretato ma passato direttamente all'output. \\ - \macro{VEOL2} &\texttt{0x00}& NUL & Ulteriore carattere di fine + \const{VEOL2} &\texttt{0x00}& NUL & Ulteriore carattere di fine riga. Ha lo stesso effetto di - \macro{VEOL} ma può essere un + \const{VEOL} ma può essere un carattere diverso. \\ \hline \end{tabular} @@ -1557,13 +1557,13 @@ codice del tipo: value.c_cc[VEOL2] = '\n'; \end{lstlisting} -La maggior parte di questi caratteri (tutti tranne \macro{VTIME} e -\macro{VMIN}) hanno effetto solo quando il terminale viene utilizzato in modo +La maggior parte di questi caratteri (tutti tranne \const{VTIME} e +\const{VMIN}) hanno effetto solo quando il terminale viene utilizzato in modo canonico; per alcuni devono essere essere soddisfatte ulteriori richieste, ad -esempio \macro{VINTR}, \macro{VSUSP}, e \macro{VQUIT} richiedono sia settato -\macro{ISIG}; \macro{VSTART} e \macro{VSTOP} richiedono sia settato -\macro{IXON}; \macro{VLNEXT}, \macro{VWERASE}, \macro{VREPRINT} richiedono sia -settato \macro{IEXTEN}. In ogni caso quando vengono attivati i caratteri +esempio \const{VINTR}, \const{VSUSP}, e \const{VQUIT} richiedono sia settato +\const{ISIG}; \const{VSTART} e \const{VSTOP} richiedono sia settato +\const{IXON}; \const{VLNEXT}, \const{VWERASE}, \const{VREPRINT} richiedono sia +settato \const{IEXTEN}. In ogni caso quando vengono attivati i caratteri vengono interpretati e non sono passati sulla coda di ingresso. Per leggere ed scrivere tutte le impostazioni dei terminali lo standard POSIX @@ -1583,9 +1583,9 @@ andranno immagazzinate le impostazioni, il loro prototipo \bodydesc{Entrambe le funzioni restituiscono 0 in caso di successo e -1 in caso di errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\macro{EINTR}] La funzione è stata interrotta. + \item[\errcode{EINTR}] La funzione è stata interrotta. \end{errlist} - ed inoltre \macro{EBADF}, \macro{ENOTTY} ed \macro{EINVAL}. + ed inoltre \const{EBADF}, \const{ENOTTY} ed \const{EINVAL}. } \end{functions} @@ -1609,16 +1609,16 @@ terminale qualunque nella struttura puntata da \param{termios\_p}; \func{tcsetattr} invece effettua la scrittura delle impostazioni e quando viene invocata sul proprio terminale di controllo può essere eseguita con successo solo da un processo in foreground. Se invocata da un processo in -background infatti tutto il gruppo riceverà un segnale di \macro{SIGTTOU} come +background infatti tutto il gruppo riceverà un segnale di \const{SIGTTOU} come se si fosse tentata una scrittura, a meno che il processo chiamante non abbia -\macro{SIGTTOU} ignorato o bloccato, nel qual caso l'operazione sarà eseguita. +\const{SIGTTOU} ignorato o bloccato, nel qual caso l'operazione sarà eseguita. La funzione \func{tcsetattr} prevede tre diverse modalità di funzionamento, specificabili attraverso l'argomento \param{optional\_actions}, che permette di stabilire come viene eseguito il cambiamento delle impostazioni del terminale, i valori possibili sono riportati in \tabref{tab:sess_tcsetattr_option}; di norma (come fatto per le due funzioni -di esempio) si usa sempre \macro{TCSANOW}, le altre opzioni possono essere +di esempio) si usa sempre \const{TCSANOW}, le altre opzioni possono essere utili qualora si cambino i parametri di output. \begin{table}[htb] @@ -1629,10 +1629,10 @@ utili qualora si cambino i parametri di output. \textbf{Valore}& \textbf{Significato}\\ \hline \hline - \macro{TCSANOW} & Esegue i cambiamenti in maniera immediata. \\ - \macro{TCSADRAIN}& I cambiamenti vengono eseguiti dopo aver atteso che + \const{TCSANOW} & Esegue i cambiamenti in maniera immediata. \\ + \const{TCSADRAIN}& I cambiamenti vengono eseguiti dopo aver atteso che tutto l'output presente sulle code è stato scritto. \\ - \macro{TCSAFLUSH}& È identico a \macro{TCSADRAIN}, ma in più scarta + \const{TCSAFLUSH}& È identico a \const{TCSADRAIN}, ma in più scarta tutti i dati presenti sulla coda di input.\\ \hline \end{tabular} @@ -1784,7 +1784,7 @@ la velocit del terminale quest'ultimo non potrà funzionare: quando il terminale non è seriale il valore non influisce sulla velocità di trasmissione dei dati. -In generale impostare un valore nullo (\macro{B0}) sulla linea di output fa si +In generale impostare un valore nullo (\const{B0}) sulla linea di output fa si che il modem non asserisca più le linee di controllo, interrompendo di fatto la connessione, qualora invece si utilizzi questo valore per la linea di input l'effetto sarà quello di rendere la sua velocità identica a quella della linea @@ -1827,7 +1827,7 @@ direttamente sulla gestione di quest'ultime e sull'interazione fra i dati in ingresso ed uscita e le relative code. In generale tutte queste funzioni vengono considerate, dal punto di vista dell'accesso al terminale, come delle funzioni di scrittura, pertanto se usate da processi in background sul loro -terminale di controllo provocano l'emissione di \macro{SIGTTOU} come +terminale di controllo provocano l'emissione di \const{SIGTTOU} come illustrato in \secref{sec:sess_ctrl_term}.\footnote{con la stessa eccezione, già vista per \func{tcsetaddr}, che quest'ultimo sia bloccato o ignorato dal processo chiamante.} @@ -1843,8 +1843,8 @@ prototipo break inviando un flusso di bit nulli. \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di - errore, nel qual caso \var{errno} assumerà i valori \macro{EBADF} o - \macro{ENOTTY}.} + errore, nel qual caso \var{errno} assumerà i valori \const{EBADF} o + \const{ENOTTY}.} \end{functions} La funzione invia un flusso di bit nulli (che genera una condizione di break) @@ -1865,8 +1865,8 @@ dell'interazione fra le code associate al terminale e l'utente; la prima \funcdecl{int tcdrain(int fd)} Attende lo svuotamento della coda di output. \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di - errore, nel qual caso \var{errno} assumerà i valori \macro{EBADF} o - \macro{ENOTTY}.} + errore, nel qual caso \var{errno} assumerà i valori \const{EBADF} o + \const{ENOTTY}.} \end{functions} La funzione blocca il processo fino a che tutto l'output presente sulla coda @@ -1885,8 +1885,8 @@ di cancellando tutti i dati presenti al loro interno; il suo prototipo nelle code di ingresso o di uscita. \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di - errore, nel qual caso \var{errno} assumerà i valori \macro{EBADF} o - \macro{ENOTTY}.} + errore, nel qual caso \var{errno} assumerà i valori \const{EBADF} o + \const{ENOTTY}.} \end{functions} La funzione agisce sul terminale associato a \param{fd}, l'argomento @@ -1904,9 +1904,9 @@ di uscita canceller \textbf{Valore}& \textbf{Significato}\\ \hline \hline - \macro{TCIFLUSH} & Cancella i dati sulla coda di ingresso. \\ - \macro{TCOFLUSH} & Cancella i dati sulla coda di uscita. \\ - \macro{TCIOFLUSH}& Cancella i dati su entrambe le code.\\ + \const{TCIFLUSH} & Cancella i dati sulla coda di ingresso. \\ + \const{TCOFLUSH} & Cancella i dati sulla coda di uscita. \\ + \const{TCIOFLUSH}& Cancella i dati su entrambe le code.\\ \hline \end{tabular} \caption{Possibili valori per l'argomento \param{queue} della @@ -1927,8 +1927,8 @@ dei dati sul terminale; il suo prototipo Sospende e rivvia il flusso dei dati sul terminale. \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di - errore, nel qual caso \var{errno} assumerà i valori \macro{EBADF} o - \macro{ENOTTY}.} + errore, nel qual caso \var{errno} assumerà i valori \const{EBADF} o + \const{ENOTTY}.} \end{functions} La funzione permette di controllare (interrompendo e facendo riprendere) il @@ -1945,11 +1945,11 @@ riportati in \secref{tab:sess_tcflow_action}. \textbf{Valore}& \textbf{Azione}\\ \hline \hline - \macro{TCOOFF}& Sospende l'output.\\ - \macro{TCOON} & Riprende un output precedentemente sospeso.\\ - \macro{TCIOFF}& Il sistema trasmette un carattere di STOP, che + \const{TCOOFF}& Sospende l'output.\\ + \const{TCOON} & Riprende un output precedentemente sospeso.\\ + \const{TCIOFF}& Il sistema trasmette un carattere di STOP, che fa interrompere la trasmissione dei dati dal terminale. \\ - \macro{TCION} & Il sistema trasmette un carattere di START, che + \const{TCION} & Il sistema trasmette un carattere di START, che fa riprendere la trasmissione dei dati dal terminale.\\ \hline \end{tabular} @@ -1980,8 +1980,8 @@ caratteri NL, EOL, EOL2, EOF, ERASE, KILL, CR, REPRINT non vengono interpretati automaticamente ed inoltre, non dividendo più l'input in linee, il sistema non ha più un limite definito per quando ritornare i dati ad un processo. Per questo motivo abbiamo visto che in \var{c\_cc} sono previsti due -caratteri speciali, MIN e TIME (specificati dagli indici \macro{VMIN} e -\macro{VTIME} in \var{c\_cc}) che dicono al sistema di ritornare da una +caratteri speciali, MIN e TIME (specificati dagli indici \const{VMIN} e +\const{VTIME} in \var{c\_cc}) che dicono al sistema di ritornare da una \func{read} quando è stata letta una determinata quantità di dati o è passato un certo tempo. -- 2.30.2