Transizione \macro{} -> \const{}, \errcode{}, \val{}
[gapil.git] / intro.tex
index 1fce94301774708b4ebb7dbb7b211f331acd7b6a..f3b65754937c36a0b2e2240419b9b7e3f4bf5143 100644 (file)
--- a/intro.tex
+++ b/intro.tex
@@ -1,3 +1,13 @@
+%% intro.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
+%% Documentation License, Version 1.1 or any later version published by the
+%% Free Software Foundation; with the Invariant Sections being "Prefazione",
+%% with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the
+%% license is included in the section entitled "GNU Free Documentation
+%% License".
+%%
 \chapter{L'architettura del sistema}
 \label{cha:intro_unix}
 
@@ -52,13 +62,13 @@ all'hardware, mentre i programmi normali vengono eseguiti in modalit
 (e non possono accedere direttamente alle zone di memoria riservate o alle
 porte di input/output).
 
-Una parte del kernel, lo \textit{scheduler}, si occupa di stabilire, ad
-intervalli fissi e sulla base di un opportuno calcolo delle priorità, quale
-``processo'' deve essere posto in esecuzione (il cosiddetto \textit{preemptive
-  scheduling}\index{preemptive scheduling}). Questo verrà comunque eseguito in
-modalità protetta; quando necessario il processo potrà accedere alle risorse
-hardware soltanto attraverso delle opportune chiamate al sistema che
-restituiranno il controllo al kernel.
+Una parte del kernel, lo \textit{scheduler}\index{scheduler}, si occupa di
+stabilire, ad intervalli fissi e sulla base di un opportuno calcolo delle
+priorità, quale ``processo'' deve essere posto in esecuzione (il cosiddetto
+\textit{preemptive scheduling}\index{preemptive scheduling}). Questo verrà
+comunque eseguito in modalità protetta; quando necessario il processo potrà
+accedere alle risorse hardware soltanto attraverso delle opportune chiamate al
+sistema che restituiranno il controllo al kernel.
 
 La memoria viene sempre gestita dal kernel attraverso il meccanismo della
 \textsl{memoria virtuale}\index{memoria virtuale}, che consente di assegnare a
@@ -143,18 +153,28 @@ operativo.
 
 Come accennato le interfacce con cui i programmi possono accedere all'hardware
 vanno sotto il nome di chiamate al sistema (le cosiddette \textit{system
-  call}), si tratta di un insieme di funzioni che un programma può chiamare, w
-per le quali viene generata un'interruzione del processo ed il controllo passa
+  call}), si tratta di un insieme di funzioni che un programma può chiamare,
+per le quali viene generata un'interruzione del processo passando il controllo
 dal programma al kernel. Sarà poi quest'ultimo che (oltre a compiere una serie
 di operazioni interne come la gestione del multitasking e l'allocazione della
 memoria) eseguirà la funzione richiesta in \textit{kernel space} restituendo i
 risultati al chiamante.
 
 Ogni versione di Unix ha storicamente sempre avuto un certo numero di queste
-chiamate, che sono riportate nella seconda sezione del \textsl{Manuale della
+chiamate, che sono riportate nella seconda sezione del \textsl{Manuale di
   programmazione di Unix} (quella cui si accede con il comando \cmd{man 2
-  nome}) e inux non fa eccezione. Queste sono poi state codificate da vari
-standard, che esamineremo brevemente in \secref{sec:intro_standard}.
+  <nome>}) e Linux non fa eccezione. Queste sono poi state codificate da vari
+standard, che esamineremo brevemente in \secref{sec:intro_standard}. Uno
+schema elementare della struttura del sistema è riportato in
+\figref{fig:intro_sys_struct}.
+
+\begin{figure}[htb]
+  \centering
+  \includegraphics[width=10cm]{img/struct_sys}
+  \caption{Schema di massima della struttura di interazione fra processi,
+    kernel e dispositivi in Linux.}
+  \label{fig:intro_sys_struct}
+\end{figure}
 
 Normalmente ciascuna di queste chiamate al sistema viene rimappata in
 opportune funzioni con lo stesso nome definite dentro la Libreria Standard del
@@ -165,28 +185,33 @@ usate nella programmazione.
 Questo è importante da capire perché programmare in Linux significa anzitutto
 essere in grado di usare le varie interfacce contenute nella Libreria Standard
 del C, in quanto né il kernel, né il linguaggio C, implementano direttamente
-operazioni comuni come lallocazione dinamica della memoria, l'input/output
+operazioni comuni come l'allocazione dinamica della memoria, l'input/output
 bufferizzato o la manipolazione delle stringhe, presenti in qualunque
 programma.
 
-Anche questo ci mostra in maniera evidente come nella stragrande magggioranza
-dei casi,\footnote{esistono implementazioni diverse delle librerie del C, come
-  le \textit{libc5}, che non derivano dal progetto GNU, ma oggi sono, tranne
-  casi particolari, completamente soppiantate dalle \acr{glibc}.} quello che
-si sta utilizzando è un sistema GNU/Linux, in quanto una parte essenziale del
-sistema (senza la quale niente può funzionare) è la realizzazione fatta dalla
-Free Software Foundation della suddetta libreria (la GNU Standard C Library,
-detta in breve \textit{glibc}), in cui sono state implementate tutte le
-funzioni essenziali definite negli standard POSIX e ANSI C, che vengono
-utilizzate da qualunque programma.
+Quanto appena illustrato mette in evidenza il fatto che nella stragrande
+maggioranza dei casi,\footnote{esistono implementazioni diverse delle librerie
+  Standard del C, come le \textit{libc5} o le \textit{uClib}, che non derivano
+  dal progetto GNU. Le \textit{libc5} oggi sono, tranne casi particolari,
+  completamente soppiantate dalle \acr{glibc}, le \textit{uClib} pur non
+  essendo complete come le \acr{glibc}, restano invece molto diffuse nel mondo
+  embedded per le loro di dimensioni ridotte (e soprattutto la possibilità di
+  togliere le parti non necessearie), e pertanto costituiscono un valido
+  rimpiazzo delle \acr{glibc} in tutti quei sistemi specializzati che
+  richiedono una minima occupazione di memoria.} si dovrebbe usare il nome
+GNU/Linux (piuttosto che soltanto Linux) in quanto una parte essenziale del
+sistema (senza la quale niente funzionerebbe) è la GNU Standard C Library (in
+breve \acr{glibc}), ovvero la libreria realizzata dalla Free Software
+Foundation nella quale sono state implementate tutte le funzioni essenziali
+definite negli standard POSIX e ANSI C, utilizzabili da qualunque programma.
 
 Le funzioni di questa libreria sono quelle riportate dalla terza sezione del
-Manuale di Programmazione di Unix (cioè accessibili con il comando \cmd{man 3
-  nome}) e sono costruite sulla base delle chiamate al sistema del kernel; è
-importante avere presente questa distinzione, fondamentale dal punto di vista
-dell'implementazione, anche se poi, nella realizzazione di normali programmi,
-non si hanno differenze pratiche fra l'uso di una funzione di libreria e
-quello di una chiamata al sistema.
+\textsl{Manuale di Programmazione di Unix} (cioè accessibili con il comando
+\cmd{man 3 <nome>}) e sono costruite sulla base delle chiamate al sistema del
+kernel; è importante avere presente questa distinzione, fondamentale dal punto
+di vista dell'implementazione, anche se poi, nella realizzazione di normali
+programmi, non si hanno differenze pratiche fra l'uso di una funzione di
+libreria e quello di una chiamata al sistema.
 
 
 \subsection{Un sistema multiutente}
@@ -203,13 +228,14 @@ Sono cos
 ed una serie di permessi e protezioni per impedire che utenti diversi possano
 danneggiarsi a vicenda o danneggiare il sistema.
 
-Ad ogni utente è dato un nome \textit{username}, che è quello che viene
-richiesto all'ingresso nel sistema dalla procedura di \textit{login}. Questa
-procedura si incarica di verificare l'identità dell'utente, in genere
-attraverso la richiesta di una parola d'ordine, anche se sono possibili
-meccanismi diversi.\footnote{Ad esempio usando la libreria PAM
+Ogni utente è identificato da un nome (l'\textit{username}), che è quello che
+viene richiesto all'ingresso nel sistema dalla procedura di \textit{login}
+(descritta in dettaglio in \secref{sec:sess_login}).  Questa procedura si
+incarica di verificare l'identità dell'utente, in genere attraverso la
+richiesta di una parola d'ordine (la \textit{password}), anche se sono
+possibili meccanismi diversi.\footnote{Ad esempio usando la libreria PAM
   (\textit{Pluggable Autentication Methods}) è possibile astrarre
-  completamente i meccanismi di autenticazione e sostituire ad esempio l'uso
+  completamente dai meccanismi di autenticazione e sostituire ad esempio l'uso
   delle password con meccanismi di identificazione biometrica.}
 
 Eseguita la procedura di riconoscimento in genere il sistema manda in
@@ -274,7 +300,7 @@ come standard internazionale con la sigla ISO/IEC 9899:1990, e va anche sotto
 il nome di standard ISO C.
 
 Scopo dello standard è quello di garantire la portabilità dei programmi C fra
-sistemi operativi diversi, ma oltre alla sintassi e alla semantica del
+sistemi operativi diversi, ma oltre alla sintassi ed alla semantica del
 linguaggio C (operatori, parole chiave, tipi di dati) lo standard prevede
 anche una libreria di funzioni che devono poter essere implementate su
 qualunque sistema operativo.
@@ -282,11 +308,47 @@ qualunque sistema operativo.
 Per questo motivo, anche se lo standard non ha alcun riferimento ad un sistema
 di tipo Unix, GNU/Linux (per essere precisi le \acr{glibc}), come molti Unix
 moderni, provvede la compatibilità con questo standard, fornendo le funzioni
-di libreria da esso previste. Queste sono dichiarate in quindici header file
-(anch'essi provvisti dalla \acr{glibc}), uno per ciascuna delle quindici aree
-in cui è stata suddivisa una libreria standard. In (\ntab\ da fare) si sono
-riportati questi header, insieme a quelli definiti negli altri standard
-descritti nelle sezioni successive.
+di libreria da esso previste. Queste sono dichiarate in una serie di
+\textit{header file}\footnote{i file di dichiarazione di variabili, tipi e
+  funzioni, usati normalmente da un compilatore C. Per poter accedere alle
+  funzioni occorre includere con la direttiva \code{\#include} questi file nei
+  propri programmi; per ciascuna funzione che tratteremo in seguito
+  indicheremo anche gli \textit{header file} necessari ad usarla.}  (anch'essi
+provvisti dalla \acr{glibc}), In \tabref{tab:intro_posix_header} si sono
+riportati i principali \textit{header file} definiti nello standard POSIX,
+insieme a quelli definiti negli altri standard descritti nelle sezioni
+successive.
+
+\begin{table}[htb]
+  \footnotesize
+  \centering
+  \begin{tabular}[c]{|l|c|c|l|}
+    \hline
+    \multirow{2}{*}{\textbf{Header}}&
+    \multicolumn{2}{|c|}{\textbf{Standard}}&
+    \multirow{2}{*}{\textbf{Contenuto}} \\
+    \cline{2-3}
+    & ANSI C& POSIX& \\
+    \hline
+    \hline
+    \file{assert.h}&$\bullet$&$\bullet$& Verifica le asserzioni fatte in un
+                                     programma.\\ 
+    \file{errno.h} &$\bullet$&$\bullet$& Errori di sistema.\\
+    \file{fcntl.h} &$\bullet$&$\bullet$& Controllo sulle opzioni dei file.\\
+    \file{limits.h}&$\bullet$&$\bullet$& Limiti e parametri del sistema.\\
+    \file{} &$\bullet$&$\bullet$& .\\
+    \file{} &$\bullet$&$\bullet$& .\\
+    \file{} &$\bullet$&$\bullet$& .\\
+    \file{} &$\bullet$&$\bullet$& .\\
+    \file{} &$\bullet$&$\bullet$& .\\
+    \file{stdio.h} &$\bullet$&$\bullet$& I/O bufferizzato in standard ANSI C.\\
+    \file{stdlib.h}&$\bullet$&$\bullet$& definizioni della libreria standard.\\
+    \hline
+  \end{tabular}
+  \caption{Elenco dei vari header file definiti dallo standard POSIX.}
+  \label{tab:intro_posix_header}
+\end{table}
+
 
 In realtà \acr{glibc} ed i relativi header file definiscono un insieme di
 funzionalità in cui sono incluse come sottoinsieme anche quelle previste dallo
@@ -297,6 +359,63 @@ header file soltanto le funzionalit
 usare le varie estensioni al linguaggio e al preprocessore da esso supportate.
 
 
+\subsection{I tipi di dati primitivi}
+\label{sec:intro_data_types}
+
+Uno dei problemi di portabilità del codice più comune è quello dei tipi di
+dati utilizzati nei programmi, che spesso variano da sistema a sistema, o
+anche da una architettura ad un altra (ad esempio passando da macchine con
+processori 32 bit a 64).
+
+Storicamente alcuni tipi di dati definiti dallo standard ANSI C sono sempre
+stati associati ad alcune variabili nei sistemi Unix, ad esempio la posizione
+corrente all'interno di un file è sempre stato associato ad un intero a 32
+bit, mentre il numero di dispositivo è sempre stato associato ad un intero a
+16 bit. Tutto questo ovviamente costituisce un incubo per la portabilità tutte
+le volte che, con l'evolversi delle piattaforme hardware, alcuni di questi
+tipi si sono rivelati inadeguati, e se ne è dovuto cambiare la dimensione.
+
+\begin{table}[htb]
+  \footnotesize
+  \centering
+  \begin{tabular}[c]{|l|c|c|l|}
+    \hline
+    \textbf{Tipo} & \textbf{Contenuto} \\
+    \hline
+    \hline
+    \type{caddr\_t} & core address.\\
+    \type{clock\_t} & contatore del tempo di sistema.\\
+    \type{dev\_t}   & Numero di dispositivo.\\
+    \type{gid\_t}   & Identificatore di un gruppo.\\
+    \type{ino\_t}   & Numero di \textit{inode}.\\
+    \type{key\_t}   & Chiave per il System V IPC.\\
+    \type{loff\_t}  & Posizione corrente in un file.\\
+    \type{mode\_t}  & Attributi di un file.\\
+    \type{nlink\_t} & Contatore dei link su un file.\\
+    \type{off\_t}   & Posizione corrente in un file.\\
+    \type{pid\_t}   & Identificatore di un processo.\\
+    \type{rlim\_t}  & Limite sulle risorse.\\
+    \type{sigset\_t}& Insieme di segnali.\\
+    \type{ssize\_t} & Dimensione di un oggetto.\\
+    \type{ssize\_t} & Dimensione in numero  byte ritornata dalle funzioni.\\
+    \type{ptrdiff\_t}& Differenza fra due puntatori.\\
+    \type{time\_t}  & Numero di secondi (in tempo di calendario).\\
+    \type{uid\_t}   & Identificatore di un utente.\\
+    \hline
+  \end{tabular}
+  \caption{Elenco dei tipi primitivi, definiti in \file{sys/types.h}.}
+  \label{tab:intro_primitive_types}
+\end{table}
+
+Per questo motivo tutte le funzioni di libreria di solito non fanno
+riferimento ai tipi standard del linguaggio C, ma ad una serie di \textsl{tipi
+  primitivi}, riportati in \tabref{tab:intro_primitive_types}, caratteristici
+di ogni sistema, definiti nell'header file \file{sys/types.h}, che associano i
+tipi utilizzati dalle funzioni di sistema ai tipi elementari supportati dal
+compilatore C.
+
+
+
 \subsection{Lo standard IEEE -- POSIX}
 \label{sec:intro_posix}
 
@@ -315,18 +434,18 @@ standardizzare l'interfaccia con il sistema operativo.
 Ma gli standard POSIX non si limitano alla standardizzazione delle funzioni di
 libreria, e in seguito sono stati prodotti anche altri standard per la shell e
 i comandi di sistema (1003.2), per le estensioni realtime e per i thread
-(1003.1d e 1003.1c) e vari altri.  In \tabref{tab:intro_posix_std} si è
-riportata una classificazione sommaria dei principali documenti prodotti, e di
-come sono identificati fra IEEE ed ISO; si tenga conto inoltre che molto
-spesso si usa l'estensione IEEE anche come aggiunta al nome POSIX (ad esempio
-si può parlare di POSIX.4 come di POSIX.1b).
-
-Si tenga presente però che nuove specificazioni e proposte di
-standardizzazione si aggiungono continuamente, mentre le versioni precedenti
-vengono riviste; talvolta poi i riferimenti cambiamo nome, per cui anche solo
-seguire le denominazioni usate diventa particolarmente faticoso; una pagina
-dove si possono recuperare varie (e di norma piuttosto intricate) informazioni
-è: \href{http://www.pasc.org/standing/sd11.html}
+(1003.1d e 1003.1c) e vari altri.  In \tabref{tab:intro_posix_std} è riportata
+una classificazione sommaria dei principali documenti prodotti, e di come sono
+identificati fra IEEE ed ISO; si tenga conto inoltre che molto spesso si usa
+l'estensione IEEE anche come aggiunta al nome POSIX (ad esempio si può parlare
+di POSIX.4 come di POSIX.1b).
+
+Si tenga presente però che nuove specifiche e proposte di standardizzazione si
+aggiungono continuamente, mentre le versioni precedenti vengono riviste;
+talvolta poi i riferimenti cambiamo nome, per cui anche solo seguire le
+denominazioni usate diventa particolarmente faticoso; una pagina dove si
+possono recuperare varie (e di norma piuttosto intricate) informazioni è:
+\href{http://www.pasc.org/standing/sd11.html}
 {http://www.pasc.org/standing/sd11.html}.
 
 
@@ -373,11 +492,11 @@ sistema e che sono definite nello standard POSIX.2.
 
 Nelle versioni più recenti del kernel e delle librerie sono inoltre supportate
 ulteriori funzionalità aggiunte dallo standard POSIX.1c per quanto riguarda i
-\textit{thread} (vedi ...), e dallo standard POSIX.1b per quanto riguarda i
-segnali e lo scheduling real-time (\secref{sec:sig_real_time} e
-\secref{sec:proc_real_time}), la misura del tempo, i meccanismi di
-intercomunicazione (\secref{sec:ipc_posix}) e l'I/O asincrono
-(\secref{sec:file_asyncronous_io}).
+\textit{thread} (vedi \capref{cha:threads}), e dallo standard POSIX.1b per
+quanto riguarda i segnali e lo scheduling real-time
+(\secref{sec:sig_real_time} e \secref{sec:proc_real_time}), la misura del
+tempo, i meccanismi di intercomunicazione (\secref{sec:ipc_posix}) e l'I/O
+asincrono (\secref{sec:file_asyncronous_io}).
 
 
 
@@ -397,7 +516,8 @@ presa come riferimento da vari produttori.
 
 Questo standard, detto anche XPG3 dal nome della suddetta guida, è sempre
 basato sullo standard POSIX.1, ma prevede una serie di funzionalità aggiuntive
-fra cui le specifiche delle API per l'interfaccia grafica (X11).
+fra cui le specifiche delle API (\textit{Application Programmable Interface})
+per l'interfaccia grafica (X11).
 
 Nel 1992 lo standard venne rivisto con una nuova versione della guida, la
 Issue 4 (da cui la sigla XPG4) che aggiungeva l'interfaccia XTI (\textit{X
@@ -438,16 +558,16 @@ del nome \textit{Unix 98}, usato spesso anche per riferirsi allo standard.
 \label{sec:intro_bsd}
 
 Lo sviluppo di BSD iniziò quando la fine della collaborazione fra l'Università
-di Berkley e la AT/T generò una delle prime e più importanti fratture del
+di Berkley e la AT\&T generò una delle prime e più importanti fratture del
 mondo Unix.  L'Università di Berkley proseguì nello sviluppo della base di
 codice di cui disponeva, e che presentava parecchie migliorie rispetto alle
 allora versioni disponibili, fino ad arrivare al rilascio di una versione
 completa di Unix, chiamata appunto BSD, del tutto indipendente dal codice
-della AT/T.
+della AT\&T.
 
 Benché BSD non sia uno standard formalizzato, l'implementazione di Unix
 dell'Università di Berkley, ha provveduto nel tempo una serie di estensioni e
-di API grande rilievo, come il link simbolici, la funzione \code{select}, i
+API di grande rilievo, come il link simbolici, la funzione \code{select}, i
 socket.
 
 Queste estensioni sono state via via aggiunte al sistema nelle varie versioni
@@ -459,22 +579,22 @@ estensioni che sono state in gran parte incorporate negli standard successivi.
 \subsection{Lo standard System V}
 \label{sec:intro_sysv}
 
-Come noto Unix nasce nei laboratori della AT/T, che ne registrò il nome come
+Come noto Unix nasce nei laboratori della AT\&T, che ne registrò il nome come
 marchio depositato, sviluppandone una serie di versioni diverse; nel 1983 la
 versione supportata ufficialmente venne rilasciata al pubblico con il nome di
-Unix System V. Negli anni successivi l'AT/T proseguì lo sviluppo rilasciando
+Unix System V. Negli anni successivi l'AT\&T proseguì lo sviluppo rilasciando
 varie versioni con aggiunte e integrazioni; nel 1989 un accordo fra vari
-venditori (AT/T, Sun, HP, e altro) portò ad una versione che provvedeva
-un'unificazione dell interfacce comprendente Xenix e BSD, la System V release
+venditori (AT\&T, Sun, HP, e altro) portò ad una versione che provvedeva
+un'unificazione delle interfacce comprendente Xenix e BSD, la System V release
 4.
 
 L'interfaccia di questa ultima release è descritta in un documento dal titolo
-\textit{System V Interface Description}, o SVID; spesso però si riferimento a
-questo standard con il nome della sua implementazione, usando la sigla SVr4.
+\textit{System V Interface Description}, o SVID; spesso però si fa riferimento
+questo standard con il nome della sua implementazione, usando la sigla SVr4.
 
 Anche questo costituisce un sovrainsieme delle interfacce definite dallo
 standard POSIX.  Nel 1992 venne rilasciata una seconda versione del sistema:
-la SVr4.2. L'anno successivo la divisione della AT/T (già a suo tempo
+la SVr4.2. L'anno successivo la divisione della AT\&T (già a suo tempo
 rinominata in Unix System Laboratories) venne acquistata dalla Novell, che poi
 trasferì il marchio Unix al consorzio X/Open; l'ultima versione di System V fu
 la SVr4.2MP rilasciata nel Dicembre 93.
@@ -495,9 +615,9 @@ matematiche.
 \subsection{Il comportamento standard del \cmd{gcc} e delle \acr{glibc}}
 \label{sec:intro_gcc_glibc_std}
 
-In Linux grazie alle \acr{glibc} gli standard appena descritti sono ottenibili
-sia attraverso l'uso di opzioni del compilatore (il \cmd{gcc}) che definendo
-opportune costanti prima della inclusione dei file degli header.
+In Linux, grazie alle \acr{glibc}, gli standard appena descritti sono
+ottenibili sia attraverso l'uso di opzioni del compilatore (il \cmd{gcc}) che
+definendo opportune costanti prima dell'inclusione dei file degli header.
 
 Se si vuole che i programmi seguano una stretta attinenza allo standard ANSI C
 si può usare l'opzione \cmd{-ansi} del compilatore, e non sarà riconosciuta
@@ -511,12 +631,12 @@ propri header file.
 
 Le macro disponibili per i vari standard sono le seguenti:
 \begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}}
-\item[\macro{\_POSIX\_SOURCE}] definendo questa macro si rendono disponibili
+\item[\const{\_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 \macro{\_POSIX\_C\_SOURCE} lo stato
+  definita con un intero positivo la macro \const{\_POSIX\_C\_SOURCE} lo stato
   di questa non viene preso in considerazione.
-\item[\macro{\_POSIX\_C\_SOURCE}] definendo questa macro ad un valore intero
+\item[\const{\_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
@@ -527,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[\macro{\_BSD\_SOURCE}] definendo questa macro si attivano le
+\item[\const{\_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
@@ -538,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[\macro{\_SVID\_SOURCE}] definendo questa macro si attivano le
+\item[\const{\_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[\macro{\_XOPEN\_SOURCE}] definendo questa macro si attivano le
+\item[\const{\_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 \macro{\_POSIX\_SOURCE} che \macro{\_POSIX\_C\_SOURCE} vengono
+  sia \const{\_POSIX\_SOURCE} che \const{\_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[\macro{\_XOPEN\_SOURCE\_EXTENDED}] definendo questa macro si attivano le
+\item[\const{\_XOPEN\_SOURCE\_EXTENDED}] definendo questa macro si attivano le
   ulteriori funzionalità necessarie ad essere conformi al rilascio del marchio
   \textit{X/Open Unix}.
-\item[\macro{\_ISOC99\_SOURCE}] definendo questa macro si attivano le
+\item[\const{\_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[\macro{\_LARGEFILE\_SOURCE}] definendo questa macro si attivano le
+\item[\const{\_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[\macro{\_GNU\_SOURCE}] definendo questa macro si attivano tutte le
+\item[\const{\_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.
@@ -569,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 \macro{\_GNU\_SOURCE} prima di
+esplicitamente definendo la macro \const{\_GNU\_SOURCE} prima di
 includere i vari header file.