assegnazione.
Per questo nell'header \file{netinet/in.h} è definita una variabile
-\type{in6addr\_any} (dichiarata come \type{extern}, ed inizializzata dal
+\type{in6addr\_any} (dichiarata come \ctyp{extern}, ed inizializzata dal
sistema al valore \macro{IN6ADRR\_ANY\_INIT}) che permette di effettuare una
assegnazione del tipo:
Infine è da chiarire (si legga la man page) che come per \func{accept} il
terzo parametro che è specificato dallo standard POSIX 1003.1g come di tipo
-\type{socklen\_t *} in realtà deve sempre corrispondere ad un \type{int *}
+\code{socklen\_t *} in realtà deve sempre corrispondere ad un \ctyp{int *}
come prima dello standard perché tutte le implementazioni dei socket BSD fanno
questa assunzione.
il caso specifico, possono essere trovate nella descrizione del prototipo
della funzione.
-I codici di errore sono riportati come costanti di tipo \type{int}, i valori
+I codici di errore sono riportati come costanti di tipo \ctyp{int}, i valori
delle costanti sono definiti da macro di preprocessore nel file citato, e
possono variare da architettura a architettura; è pertanto necessario
riferirsi ad essi tramite i nomi simbolici. Le funzioni \func{perror} e
direttamente le system call del kernel (in realtà il kernel effettua al suo
interno alcune bufferizzazioni per aumentare l'efficienza nell'accesso ai
dispositivi); i \textit{file descriptor}\index{file descriptor} sono
-rappresentati da numeri interi (cioè semplici variabili di tipo \type{int}).
+rappresentati da numeri interi (cioè semplici variabili di tipo \ctyp{int}).
L'interfaccia è definita nell'header \file{unistd.h}.
La seconda interfaccia è quella che il manuale della \acr{glibc} chiama degli
anche su tutti i sistemi non Unix. Gli \textit{stream} sono oggetti complessi
e sono rappresentati da puntatori ad un opportuna struttura definita dalle
librerie del C; si accede ad essi sempre in maniera indiretta utilizzando il
-tipo \type{FILE *}. L'interfaccia è definita nell'header \type{stdio.h}.
+tipo \ctyp{FILE *}. L'interfaccia è definita nell'header \file{stdio.h}.
Entrambe le interfacce possono essere usate per l'accesso ai file come agli
altri oggetti del VFS (fifo, socket, device, sui quali torneremo in dettaglio
\secref{sec:file_access_control} per il controllo di accesso.
-\subsection{Gli oggetti \type{FILE}}
+\subsection{Gli oggetti \ctyp{FILE}}
\label{sec:file_FILE}
Per ragioni storiche la struttura di dati che rappresenta uno stream è stata
-chiamata \type{FILE}, questi oggetti sono creati dalle funzioni di libreria e
+chiamata \ctyp{FILE}, questi oggetti sono creati dalle funzioni di libreria e
contengono tutte le informazioni necessarie a gestire le operazioni sugli
stream, come la posizione corrente, lo stato del buffer e degli indicatori di
stato e di fine del file.
Per questo motivo gli utenti non devono mai utilizzare direttamente o
-allocare queste strutture, ma usare sempre puntatori del tipo \type{FILE
+allocare queste strutture, ma usare sempre puntatori del tipo \ctyp{FILE
*} ottenuti dalla libreria stessa (tanto che in certi casi il termine
di puntatore a file è diventato sinonimo di stream). Tutte le funzioni
della libreria che operano sui file accettano come parametri solo
\end{basedescript}
Nelle \acr{glibc} \var{stdin}, \var{stdout} e \var{stderr} sono
-effettivamente tre variabili di tipo \type{FILE *} che possono essere
+effettivamente tre variabili di tipo \ctyp{FILE *} che possono essere
usate come tutte le altre, ad esempio si può effettuare una redirezione
dell'output di un programma con il semplice codice:
\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
raggiungimento della fine del file è considerato un errore, e viene
notificato come tale dai valori di uscita delle varie funzioni. Nella
maggior parte dei casi questo avviene con la restituzione del valore
-intero (di tipo \type{int}) \macro{EOF}\footnote{la costante deve essere
+intero (di tipo \ctyp{int}) \macro{EOF}\footnote{la costante deve essere
negativa, le \acr{glibc} usano -1, altre implementazioni possono avere
valori diversi.} definito anch'esso nell'header \file{stdlib.h}.
Per questo motivo tutte le implementazioni delle librerie standard
mantengono per ogni stream almeno due flag all'interno dell'oggetto
-\type{FILE}, il flag di \textit{end-of-file}, che segnala che si è
+\ctyp{FILE}, il flag di \textit{end-of-file}, che segnala che si è
raggiunta la fine del file in lettura, e quello di errore, che segnala
la presenza di un qualche errore nelle operazioni di input/output;
questi due flag possono essere riletti dalle funzioni:
essere passato come parametro ad un altra funzione (e non si hanno i
problemi accennati in precedenza con \param{stream}).
-Le tre funzioni restituiscono tutte un \type{unsigned char} convertito
-ad \type{int} (si usa \type{unsigned char} in modo da evitare
+Le tre funzioni restituiscono tutte un \ctyp{unsigned char} convertito
+ad \ctyp{int} (si usa \ctyp{unsigned char} in modo da evitare
l'espansione del segno). In questo modo il valore di ritorno è sempre
positivo, tranne in caso di errore o fine del file.
Nelle estensioni GNU che provvedono la localizzazione sono definite tre
funzioni equivalenti alle precedenti che invece di un carattere di un
byte restituiscono un carattere in formato esteso (cioè di tipo
-\type{wint\_t}, il loro prototipo è:
+\ctyp{wint\_t}, il loro prototipo è:
\begin{functions}
\headdecl{stdio.h}
\headdecl{wchar.h}
\end{functions}
Tutte queste funzioni scrivono sempre un byte alla volta, anche se
-prendono come parametro un \type{int} (che pertanto deve essere ottenuto
-con un cast da un \type{unsigned char}). Anche il valore di ritorno è
+prendono come parametro un \ctyp{int} (che pertanto deve essere ottenuto
+con un cast da un \ctyp{unsigned char}). Anche il valore di ritorno è
sempre un intero; in caso di errore o fine del file il valore di ritorno
è \macro{EOF}.
stream.
Per compatibilità con SVID sono provviste anche due funzioni per leggere
-e scrivere una \textit{word} (che è sempre definita come \type{int}); i
+e scrivere una \textit{word} (che è sempre definita come \ctyp{int}); i
loro prototipi sono:
\begin{functions}
\headdecl{stdio.h}
disponibile per una lettura successiva; la funzione che inverte la
lettura si chiama \func{ungetc} ed il suo prototipo è:
\begin{prototype}{stdio.h}{int ungetc(int c, FILE *stream)}
- Rimanda indietro il carattere \param{c}, con un cast a \type{unsigned
+ Rimanda indietro il carattere \param{c}, con un cast a \ctyp{unsigned
char}, sullo stream \param{stream}.
\bodydesc{La funzione ritorna \param{c} in caso di successo e
\textbf{Valore} & \textbf{Tipo} & \textbf{Significato} \\
\hline
\hline
- \cmd{\%d} &\type{int} & Stampa un numero intero in formato decimale
+ \cmd{\%d} &\ctyp{int} & Stampa un numero intero in formato decimale
con segno \\
- \cmd{\%i} &\type{int} & Identico a \cmd{\%i} in output, \\
- \cmd{\%o} &\type{unsigned int}& Stampa un numero intero come ottale\\
- \cmd{\%u} &\type{unsigned int}& Stampa un numero intero in formato
+ \cmd{\%i} &\ctyp{int} & Identico a \cmd{\%i} in output, \\
+ \cmd{\%o} &\ctyp{unsigned int}& Stampa un numero intero come ottale\\
+ \cmd{\%u} &\ctyp{unsigned int}& Stampa un numero intero in formato
decimale senza segno \\
\cmd{\%x},
- \cmd{\%X} &\type{unsigned int}& Stampano un intero in formato esadecimale,
+ \cmd{\%X} &\ctyp{unsigned int}& Stampano un intero in formato esadecimale,
rispettivamente con lettere minuscole e
maiuscole. \\
- \cmd{\%f} &\type{unsigned int}& Stampa un numero in virgola mobile con la
+ \cmd{\%f} &\ctyp{unsigned int}& Stampa un numero in virgola mobile con la
notazione a virgola fissa \\
\cmd{\%e},
- \cmd{\%E} &\type{double} & Stampano un numero in virgola mobile con la
+ \cmd{\%E} &\ctyp{double} & Stampano un numero in virgola mobile con la
notazione esponenziale, rispettivamente con
lettere minuscole e maiuscole. \\
\cmd{\%g},
- \cmd{\%G} &\type{double} & Stampano un numero in virgola mobile con la
+ \cmd{\%G} &\ctyp{double} & Stampano un numero in virgola mobile con la
notazione più appropriate delle due precedenti,
rispettivamente con lettere minuscole e
maiuscole. \\
\cmd{\%a},
- \cmd{\%A} &\type{double} & Stampano un numero in virgola mobile in
+ \cmd{\%A} &\ctyp{double} & Stampano un numero in virgola mobile in
notazione esadecimale frazionaria\\
- \cmd{\%c} &\type{int} & Stampa un carattere singolo\\
- \cmd{\%s} &\type{char *} & Stampa una stringa \\
- \cmd{\%p} &\type{void *} & Stampa il valore di un puntatore\\
- \cmd{\%n} &\type{\&int} & Prende il numero di caratteri stampati finora\\
+ \cmd{\%c} &\ctyp{int} & Stampa un carattere singolo\\
+ \cmd{\%s} &\ctyp{char *} & Stampa una stringa \\
+ \cmd{\%p} &\ctyp{void *} & Stampa il valore di un puntatore\\
+ \cmd{\%n} &\ctyp{\&int} & Prende il numero di caratteri stampati finora\\
\cmd{\%\%}& & Stampa un \% \\
\hline
\end{tabular}
\textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \cmd{hh} & una conversione intera corrisponde a un \type{char} con o senza
+ \cmd{hh} & una conversione intera corrisponde a un \ctyp{char} con o senza
segno, o il puntatore per il numero dei parametri \cmd{n} è di
- tipo \type{char}.\\
- \cmd{h} & una conversione intera corrisponde a uno \type{short} con o
+ tipo \ctyp{char}.\\
+ \cmd{h} & una conversione intera corrisponde a uno \ctyp{short} con o
senza segno, o il puntatore per il numero dei parametri \cmd{n}
- è di tipo \type{short}.\\
- \cmd{l} & una conversione intera corrisponde a un \type{long} con o
+ è di tipo \ctyp{short}.\\
+ \cmd{l} & una conversione intera corrisponde a un \ctyp{long} con o
senza segno, o il puntatore per il numero dei parametri \cmd{n}
- è di tipo \type{long}, o il carattere o la stringa seguenti
+ è di tipo \ctyp{long}, o il carattere o la stringa seguenti
sono in formato esteso.\\
- \cmd{ll} & una conversione intera corrisponde a un \type{long long} con o
+ \cmd{ll} & una conversione intera corrisponde a un \ctyp{long long} con o
senza segno, o il puntatore per il numero dei parametri \cmd{n}
- è di tipo \type{long long}.\\
+ è di tipo \ctyp{long long}.\\
\cmd{L} & una conversione in virgola mobile corrisponde a un
- \type{double}.\\
+ \ctyp{double}.\\
\cmd{q} & sinonimo di \cmd{ll}.\\
\cmd{j} & una conversione intera corrisponde a un \type{intmax\_t} o
\type{uintmax\_t}.\\
\bodydesc{La funzione restituisce la posizione corrente, o -1 in caso
di fallimento, che può esser dovuto sia al fatto che il file non
supporta il riposizionamento che al fatto che la posizione non può
- essere espressa con un \type{long int}}
+ essere espressa con un \ctyp{long int}}
\end{prototype}
\noindent la funzione restituisce la posizione come numero di byte
dall'inizio dello stream.
In Linux, a partire dalle glibc 2.1, sono presenti anche le due funzioni
\func{fseeko} e \func{ftello}, che assolutamente identiche alle precedenti
\func{fseek} e \func{ftell} ma hanno argomenti di tipo \type{off\_t} anziché
-di tipo \type{long int}.
+di tipo \ctyp{long int}.
\newcommand{\var}[1]{\texttt{#1}} % variable
\newcommand{\file}[1]{\texttt{#1}} % file name
\newcommand{\link}[1]{\texttt{#1}} % html link
-\newcommand{\type}[1]{\texttt{#1}} % variable type
+\newcommand{\ctyp}[1]{\texttt{#1}} % C standard type
+\newcommand{\type}[1]{%
+\index{#1@{\tt {#1}}}\texttt{#1}%
+} % system type
\newcommand{\param}[1]{\texttt{#1}} % function parameter
\newcommand{\acr}[1]{\textsl{#1}} % acrostic (for pid, suid, etc.)
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
lo stato di uscita di un processo. In Linux esse sono poste rispettivamente ai
-valori di tipo \type{int} 0 e 1.
+valori di tipo \ctyp{int} 0 e 1.
\subsection{Le funzioni \func{exit} e \func{\_exit}}
\item Il segmento dei dati o \textit{data segment}. Contiene le variabili
globali (cioè quelle definite al di fuori di tutte le funzioni che
compongono il programma) e le variabili statiche (cioè quelle dichiarate con
- l'attributo \type{static}). Di norma è diviso in due parti.
+ l'attributo \ctyp{static}). Di norma è diviso in due parti.
La prima parte è il segmento dei dati inizializzati, che contiene le
variabili il cui valore è stato assegnato esplicitamente. Ad esempio
\end{functions}
\noindent questa funzione elimina ogni occorrenza della variabile specificata;
se essa non esiste non succede nulla. Non è prevista (dato che la funzione è
-\type{void}) nessuna segnalazione di errore.
+\ctyp{void}) nessuna segnalazione di errore.
Per modificare o aggiungere una variabile di ambiente si possono usare sia
\func{setenv} che \func{putenv}. La prima permette di specificare
seguendo il comportamento di BSD4.4; dato che questo può dar luogo a perdite
di memoria e non rispetta lo standard. Il comportamento è stato modificato a
partire dalle 2.1.2, eliminando anche, sempre in conformità a SUSv2,
- l'attributo \type{const} dal prototipo.} \param{string} alla lista delle
+ l'attributo \ctyp{const} dal prototipo.} \param{string} alla lista delle
variabili di ambiente; pertanto ogni cambiamento alla stringa in questione si
riflette automaticamente sull'ambiente, e quindi si deve evitare di passare a
questa funzione una variabile automatica (per evitare i problemi esposti in
inoltre che l'ultimo degli argomenti fissi sia di tipo
\textit{self-promoting}\footnote{il linguaggio C prevede che quando si
mescolano vari tipi di dati, alcuni di essi possano essere \textsl{promossi}
- per compatibilità; ad esempio i tipi \type{float} vengono convertiti
- automaticamente a \type{double} ed i \type{char} e gli \type{short} ad
- \type{int}. Un tipo \textit{self-promoting} è un tipo che verrebbe promosso
+ per compatibilità; ad esempio i tipi \ctyp{float} vengono convertiti
+ automaticamente a \ctyp{double} ed i \ctyp{char} e gli \ctyp{short} ad
+ \ctyp{int}. Un tipo \textit{self-promoting} è un tipo che verrebbe promosso
a sé stesso.} il che esclude array, puntatori a funzioni e interi di tipo
-\type{char} o \type{short} (con segno o meno). Una restrizione ulteriore di
+\ctyp{char} o \ctyp{short} (con segno o meno). Una restrizione ulteriore di
alcuni compilatori è di non dichiarare l'ultimo parametro fisso come
-\type{register}.
+\ctyp{register}.
Una volta dichiarata la funzione il secondo passo è accedere ai vari parametri
quando la si va a definire. I parametri fissi infatti hanno un loro nome, ma
che siano fissi sia che siano opzionali (alcuni sistemi trattano diversamente
gli opzionali), ma dato che il prototipo non può specificare il tipo degli
argomenti opzionali, questi verranno sempre promossi, pertanto nella ricezione
-dei medesimi occorrerà tenerne conto (ad esempio un \type{char} verrà visto da
-\macro{va\_arg} come \type{int}).
+dei medesimi occorrerà tenerne conto (ad esempio un \ctyp{char} verrà visto da
+\macro{va\_arg} come \ctyp{int}).
Uno dei problemi che si devono affrontare con le funzioni con un numero
all'uscita di una funzione non deve restare nessun riferimento alle variabili
locali; qualora sia necessario utilizzare variabili che possano essere viste
anche dalla funzione chiamante queste devono essere allocate esplicitamente, o
-in maniera statica (usando variabili di tipo \type{static} o \type{extern}), o
+in maniera statica (usando variabili di tipo \ctyp{static} o \ctyp{extern}), o
dinamicamente con una delle funzioni della famiglia \func{malloc}.
\subsection{Il controllo di flusso non locale}
da un numero identificativo unico, il \textit{process id} o \acr{pid};
quest'ultimo è un tipo di dato standard, il \type{pid\_t} che in genere è un
intero con segno (nel caso di Linux e delle \acr{glibc} il tipo usato è
-\type{int}).
+\ctyp{int}).
Il \acr{pid} viene assegnato in forma progressiva ogni volta che un nuovo
processo viene creato, fino ad un limite che, essendo il \acr{pid} un numero
analizzare lo stato di uscita. Esse sono definite sempre in
\file{<sys/wait.h>} ed elencate in \tabref{tab:proc_status_macro} (si tenga
presente che queste macro prendono come parametro la variabile di tipo
-\type{int} puntata da \var{status}).
+\ctyp{int} puntata da \var{status}).
Si tenga conto che nel caso di conclusione anomala il valore restituito da
\macro{WTERMSIG} può essere confrontato con le costanti definite in
In questo caso il sistema provvede un tipo di dato, il \type{sig\_atomic\_t},
il cui accesso è assicurato essere atomico. In pratica comunque si può
assumere che, in ogni piattaforma su cui è implementato Linux, il tipo
-\type{int}, gli altri interi di dimensione inferiore ed i puntatori sono
+\ctyp{int}, gli altri interi di dimensione inferiore ed i puntatori sono
atomici. Non è affatto detto che lo stesso valga per interi di dimensioni
maggiori (in cui l'accesso può comportare più istruzioni in assembler) o per
le strutture. In tutti questi casi è anche opportuno marcare come
-\type{volatile} le variabili che possono essere interessate ad accesso
+\ctyp{volatile} le variabili che possono essere interessate ad accesso
condiviso, onde evitare problemi con le ottimizzazioni del codice.
\begin{verbatim}
typedef void (* sighandler_t)(int)
\end{verbatim}
-e cioè un puntatore ad una funzione \type{void} (cioè senza valore di ritorno)
-e che prende un argomento di tipo \type{int}.\footnote{si devono usare le
+e cioè un puntatore ad una funzione \ctyp{void} (cioè senza valore di ritorno)
+e che prende un argomento di tipo \ctyp{int}.\footnote{si devono usare le
parentesi intorno al nome della funzione per via delle precedenze degli
operatori del C, senza di esse si sarebbe definita una funzione che ritorna
- un puntatore a \type{void} e non un puntatore ad una funzione \type{void}.}
+ un puntatore a \ctyp{void} e non un puntatore ad una funzione \ctyp{void}.}
La funzione \func{signal} quindi restituisce e prende come secondo argomento
un puntatore a una funzione di questo tipo, che è appunto il manipolatore del
segnale.
permettano di gestire i segnali in maniera più completa.
+\subsection{I \textit{signal set}}
+\label{sec:sig_sigset}
+
+Come evidenziato nel paragrafo precedente, le funzioni di gestione dei segnali
+dei primi Unix, nate con la semantica inaffidabile, hanno dei limiti non
+superabili; in particolare non è prevista nessuna funzione che permetta di
+gestire correttamente i segnali pendenti e bloccati.
+
+Per questo motivo lo standard POSIX, insieme alla nuova semantica dei segnali
+ha introdotto una interfaccia di gestione completamente nuova, che permette un
+controllo molto più dettagliato. In particolare lo standard ha introdotto un
+nuovo tipo di dato \type{sigset\_t}.
\subsection{La funzione \func{sigaction}}
\label{sec:sig_sigaction}
-Come evidenziato nel paragrafo precedente, le funzioni di gestione dei segnali
-dei primi Unix, hanno dei limiti non superabili; per questo motivo lo standard
-POSIX ha introdotto una interfaccia di gestione completamente nuova, che
-permette un controllo molto più dettagliato. La funzione principale di questa
-nuova interfaccia è \func{sigaction}; il cui prototipo è:
+
+La funzione principale di questa nuova interfaccia è \func{sigaction}; il cui
+prototipo è:
\begin{prototype}{signal.h}{int sigaction(int signum, const struct sigaction
*act, struct sigaction *oldact)}
\end{figure}
-\subsection{I \textit{signal set}}
-\label{sec:sig_sigset}
-
\subsection{Le funzioni \func{sigpending} e \func{sigsuspend}}
\label{sec:sig_sigpending}
utilizzare fra quelli disponibili nella famiglia scelta. Le API permettono di
scegliere lo stile di comunicazione indicando il tipo di socket; Linux e le
glibc mettono a disposizione i seguenti tipi di socket (che il manuale della
-glibc chiama \textit{styles}) definiti come \type{int} in \file{socket.h}:
+glibc chiama \textit{styles}) definiti come \ctyp{int} in \file{socket.h}:
\begin{list}{}{}
\item \macro{SOCK\_STREAM} Provvede un canale di trasmissione dati
maneggiare puntatori a strutture relative a tutti gli indirizzi possibili
nelle varie famiglie di protocolli; questo pone il problema di come passare
questi puntatori, il C ANSI risolve questo problema coi i puntatori generici
-(i \type{void *}), ma l'interfaccia dei socket è antecedente alla
+(i \ctyp{void *}), ma l'interfaccia dei socket è antecedente alla
definizione dello standard ANSI, e per questo nel 1982 fu scelto di definire
una struttura generica \type{sockaddr} per gli indirizzi dei socket mostrata
in \nfig:
\hline
\type{sa\_family\_t} & famiglia degli indirizzi& \file{sys/socket.h}\\
\type{socklen\_t} & lunghezza (\type{uint32\_t}) dell'indirizzo di
- un socket& \type{sys/socket.h}\\
+ un socket& \file{sys/socket.h}\\
\hline
- \type{in\_addr\_t} & indirizzo IPv4 (\file{uint32\_t}) &
- \type{netinet/in.h}\\
- \type{in\_port\_t} & porta TCP o UDP (\file{uint16\_t})&
- \type{netinet/in.h}\\
+ \type{in\_addr\_t} & indirizzo IPv4 (\type{uint32\_t}) &
+ \file{netinet/in.h}\\
+ \type{in\_port\_t} & porta TCP o UDP (\type{uint16\_t})&
+ \file{netinet/in.h}\\
\hline
\end{tabular}
\caption{Tipi di dati usati nelle strutture degli indirizzi, secondo quanto
aggiuntivo \var{uint8\_t sin\_len} (come riportato da R. Stevens nei suoi
libri). Questo campo non verrebbe usato direttamente dal programmatore e non è
richiesto dallo standard POSIX.1g, in Linux pertanto non esiste. Il campo
-\type{sa\_family\_t} era storicamente un \type{unsigned short}.
+\type{sa\_family\_t} era storicamente un \ctyp{unsigned short}.
Dal punto di vista del programmatore l'unico uso di questa struttura è quello
di fare da riferimento per il casting, per il kernel le cose sono un po'
diverse, in quanto esso usa il puntatore per recuperare il campo
\var{sa\_family} con cui determinare il tipo di indirizzo; per questo
-motivo, anche se l'uso di un puntatore \type{void *} sarebbe più immediato
+motivo, anche se l'uso di un puntatore \ctyp{void *} sarebbe più immediato
per l'utente (che non dovrebbe più eseguire il casting), è stato mantenuto
l'uso di questa struttura.
l'ordinamento usato sulla rete (da \textit{network order}) e la lettera
\texttt{h} come mnemonico per l'ordinamento usato sulla macchina locale (da
\textit{host order}), mentre le lettere \texttt{s} e \texttt{l} stanno ad
-indicare i tipi di dato (\type{long} o \type{short}, riportati anche dai
+indicare i tipi di dato (\ctyp{long} o \ctyp{short}, riportati anche dai
prototipi).
Usando queste funzioni si ha la conversione automatica: nel caso in cui la
\hline
\macro{MB\_LEN\_MAX}& 16 & massima dimensione di un
carattere esteso\\
- \macro{CHAR\_BIT} & 8 & bit di \type{char}\\
- \macro{UCHAR\_MAX}& 255 & massimo di \type{unsigned char}\\
- \macro{SCHAR\_MIN}& -128 & minimo di \type{signed char}\\
- \macro{SCHAR\_MAX}& 127 & massimo di \type{signed char}\\
- \macro{CHAR\_MIN} &\footnotemark& minimo di \type{char}\\
- \macro{CHAR\_MAX} &\footnotemark& massimo di \type{char}\\
- \macro{SHRT\_MIN} & -32768 & minimo di \type{short}\\
- \macro{SHRT\_MAX} & 32767 & massimo di \type{short}\\
- \macro{USHRT\_MAX}& 65535 & massimo di \type{unsigned short}\\
- \macro{INT\_MAX} & 2147483647 & minimo di \type{int}\\
- \macro{INT\_MIN} &-2147483648 & minimo di \type{int}\\
- \macro{UINT\_MAX} & 4294967295 & massimo di \type{unsigned int}\\
- \macro{LONG\_MAX} & 2147483647 & massimo di \type{long}\\
- \macro{LONG\_MIN} &-2147483648 & minimo di \type{long}\\
- \macro{ULONG\_MAX}& 4294967295 & massimo di \type{unsigned long}\\
+ \macro{CHAR\_BIT} & 8 & bit di \ctyp{char}\\
+ \macro{UCHAR\_MAX}& 255 & massimo di \ctyp{unsigned char}\\
+ \macro{SCHAR\_MIN}& -128 & minimo di \ctyp{signed char}\\
+ \macro{SCHAR\_MAX}& 127 & massimo di \ctyp{signed char}\\
+ \macro{CHAR\_MIN} &\footnotemark& minimo di \ctyp{char}\\
+ \macro{CHAR\_MAX} &\footnotemark& massimo di \ctyp{char}\\
+ \macro{SHRT\_MIN} & -32768 & minimo di \ctyp{short}\\
+ \macro{SHRT\_MAX} & 32767 & massimo di \ctyp{short}\\
+ \macro{USHRT\_MAX}& 65535 & massimo di \ctyp{unsigned short}\\
+ \macro{INT\_MAX} & 2147483647 & minimo di \ctyp{int}\\
+ \macro{INT\_MIN} &-2147483648 & minimo di \ctyp{int}\\
+ \macro{UINT\_MAX} & 4294967295 & massimo di \ctyp{unsigned int}\\
+ \macro{LONG\_MAX} & 2147483647 & massimo di \ctyp{long}\\
+ \macro{LONG\_MIN} &-2147483648 & minimo di \ctyp{long}\\
+ \macro{ULONG\_MAX}& 4294967295 & massimo di \ctyp{unsigned long}\\
\hline
\end{tabular}
\caption{Costanti definite in \file{limits.h} in conformità allo standard
a seconda che il sistema usi caratteri con segno o meno.}
A questi valori lo standard ISO C90 ne aggiunge altri tre, relativi al tipo
-\type{long long} introdotto con il nuovo standard, i relativi valori sono in
+\ctyp{long long} introdotto con il nuovo standard, i relativi valori sono in
\tabref{tab:sys_isoc90_macro}.
\begin{table}[htb]
\textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \macro{LLONG\_MAX}& 9223372036854775807& massimo di \type{long long}\\
- \macro{LLONG\_MIN}&-9223372036854775808& minimo di \type{long long}\\
+ \macro{LLONG\_MAX}& 9223372036854775807& massimo di \ctyp{long long}\\
+ \macro{LLONG\_MIN}&-9223372036854775808& minimo di \ctyp{long long}\\
\macro{ULLONG\_MAX}&18446744073709551615&
- massimo di \type{unsigned long long}\\
+ massimo di \ctyp{unsigned long long}\\
\hline
\end{tabular}
\caption{Macro definite in \file{limits.h} in conformità allo standard
sequenza dei vari nodi da attraversare. Ogni parametro ha un valore in un
formato specifico chee può essere un intero, una stringa o anche una struttura
complessa, per questo motivo il valori vengono passati come puntatori
-\type{void}.
+\ctyp{void}.
L'indirizzo a cui il valore corrente del parametro deve essere letto è
specificato da \param{oldvalue}, e lo spazio ivi disponibile è specificato da
\item[\macro{EINVAL}] il device \param{source} presenta un
\textit{superblock} non valido, o si è cercato di rimontare un filesystem
non ancora montato, o di montarlo senza che \param{target} sia un
- \type{mount point} o di spostarlo quando \param{target} non è un
- \type{mount point} o è \file{/}.
+ \textit{mount point} o di spostarlo quando \param{target} non è un
+ \textit{mount point} o è \file{/}.
\item[\macro{EACCES}] non si ha il permesso di accesso su uno dei componenti
del pathname, o si è cercato di montare un filesystem disponibile in sola
lettura senza averlo specificato o il device \param{source} è su un
anche di definire \var{errno} come un \textit{modifiable lvalue}, quindi si
può anche usare una macro, e questo è infatti il modo usato da Linux per
renderla locale ai singoli thread.} definita nell'header \file{errno.h}; la
-variabile è in genere definita come \type{volatile} dato che può essere
+variabile è in genere definita come \ctyp{volatile} dato che può essere
cambiata in modo asincrono da un segnale (si veda \ref{sec:sig_sigchld} per un
esempio, ricordando quanto trattato in \ref{sec:proc_race_cond}), ma dato che
un manipolatore di segnale scritto bene salva e ripristina il valore della