In questa prima sezione faremo una breve panoramica sull'architettura di un
sistema operativo di tipo Unix, come GNU/Linux, e della relazione fra le varie
parti che lo compongono. Chi avesse già una conoscenza di questa materia può
-tranquillamente saltare questa sezione ad eccezione di
-sez.~\ref{sec:intro_syscall} dove introdotti alcuni concetti fondamentali
-relativi alle funzioni di libreria.
-
+tranquillamente saltare questa sezione.
\subsection{Concetti base}
\label{sec:intro_base_concept}
programmi di una di queste funzioni resta lo stesso, sia che si tratti di una
funzione interna della libreria che di una \textit{system call}.
-Come accennato in genere ogni \textit{system call} è associata ad una omonima
-funzione di libreria, che è quella che si usa normalmente per invocarla. Le
-\textsl{glibc} consentono comunque, nel caso non sia presente una specifica
-funzione di libreria corrispondente o qualora si voglia eseguire una specifica
-versione,\footnote{alcune \textit{system call} sono state modificate nel corso
- degli anni per aggiungere ad esempio delle funzionalità, l'interfaccia
- proposta dalle \textsl{glibc} si cura in genere di mantenere una uniformità
- chiamando le versioni corrette, ma qualora si voglia lavorare a basso
- livello ed usare una specifica versione, si può fare ricorso a questa
- funzione.} di eseguire direttamente una \textit{system call} tramite la
-funzione \funcd{syscall}, il cui prototipo (accessibile se si è definita la
-macro \macro{\_GNU\_SOURCE}, vedi sez.~\ref{sec:intro_gcc_glibc_std}) è:
-
-\begin{funcproto}{
- \fhead{unistd.h}
- \fhead{sys/syscall.h}
- \fdecl{int syscall(int number, ...)}
- \fdesc{Esegue la \textit{system call} indicata da \param{number}.}
-}
-{La funzione ritorna un intero dipendente dalla \textit{system call} invocata,
-in generale $0$ indica il successo e un valore negativo un errore.}
-\end{funcproto}
-
-La funzione richiede come primo argomento il numero della \textit{system call}
-da invocare, seguita dagli argomenti da passare alla stessa, che ovviamente
-dipendono da quest'ultima, e restituisce il codice di ritorno della
-\textit{system call} invocata. In generale un valore nullo indica il successo
-ed un valore negativo è un codice di errore che poi viene memorizzato nella
-variabile \var{errno} (sulla gestione degli errori torneremo in dettaglio in
-sez.~\ref{sec:sys_errors}).
-
-Il valore di \param{number} dipende sia dalla versione di kernel che
-dall'architettura,\footnote{in genere le vecchie \textit{system call} non
- vengono eliminate e se ne aggiungono di nuove con nuovi numeri.} ma
-ciascuna \textit{system call} viene in genere identificata da una costante
-nella forma \texttt{SYS\_*} dove al prefisso viene aggiunto il nome che spesso
-corrisponde anche alla omonima funzione di libreria; queste costanti sono
-definite nel file \texttt{sys/syscall.h}, ma si possono anche usare
-direttamente valori numerici.
-
-%
-% TODO:trattare non so se qui o altrove vsyscall e vDSO, vedi
-% http://davisdoesdownunder.blogspot.com/2011/02/linux-syscall-vsyscall-and-vdso-oh-my.html
-% http://www.win.tue.nl/~aeb/linux/lk/lk-4.html
-%
\subsection{Un sistema multiutente}
\label{sec:intro_multiuser}
unix-like (alcuni standardizzano pure i comandi base del sistema e la shell)
ed in particolare ci concentreremo sul come ed in che modo essi sono
supportati sia per quanto riguarda il kernel che la Libreria Standard del C,
-con una particolare attenzione alle \acr{glibc}.
+con una particolare attenzione alla \acr{glibc}.
\subsection{Lo standard ANSI C}
anche una libreria di funzioni che devono poter essere implementate su
qualunque sistema operativo.
-\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$& -- & Verifica le asserzioni fatte in un
- programma.\\
- \file{ctype.h} &$\bullet$& -- & Tipi standard.\\
- \file{dirent.h}& -- &$\bullet$& Manipolazione delle directory.\\
- \file{errno.h} & -- &$\bullet$& Errori di sistema.\\
- \file{fcntl.h} & -- &$\bullet$& Controllo sulle opzioni dei file.\\
- \file{limits.h}& -- &$\bullet$& Limiti e parametri del sistema.\\
- \file{malloc.h}&$\bullet$& -- & Allocazione della memoria.\\
- \file{setjmp.h}&$\bullet$& -- & Salti non locali.\\
- \file{signal.h}& -- &$\bullet$& Gestione dei segnali.\\
- \file{stdarg.h}&$\bullet$& -- & Gestione di funzioni a argomenti
- variabili.\\
- \file{stdio.h} &$\bullet$& -- & I/O bufferizzato in standard ANSI C.\\
- \file{stdlib.h}&$\bullet$& -- & Definizioni della libreria standard.\\
- \file{string.h}&$\bullet$& -- & Manipolazione delle stringhe.\\
- \file{time.h} & -- &$\bullet$& Gestione dei tempi.\\
- \file{times.h} &$\bullet$& -- & Gestione dei tempi.\\
- \file{unistd.h}& -- &$\bullet$& Unix standard library.\\
- \file{utmp.h} & -- &$\bullet$& Registro connessioni utenti.\\
- \hline
- \end{tabular}
- \caption{Elenco dei vari header file definiti dallo standard POSIX.}
- \label{tab:intro_posix_header}
-\end{table}
-
Per questo motivo, anche se lo standard non ha alcun riferimento ad un sistema
di tipo Unix, GNU/Linux (per essere precisi la \acr{glibc}), come molti Unix
moderni, provvede la compatibilità con questo standard, fornendo le funzioni
di libreria da esso previste. Queste sono dichiarate in una serie di
-\textit{header file}\footnote{si chiamano così 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 ed in seguito per ciascuna funzione che
- tratteremo indicheremo anche gli \textit{header file} necessari ad usarla.}
-(anch'essi forniti dalla \acr{glibc}); in tab.~\ref{tab:intro_posix_header} si
-sono riportati i principali \textit{header file} definiti negli standard POSIX
-ed ANSI C, che sono anche quelli definiti negli altri standard descritti nelle
-sezioni successive.
+\textit{header file} anch'essi forniti dalla \acr{glibc} (tratteremo
+l'argomento in sez.~\ref{sec:proc_syscall}).
In realtà la \acr{glibc} ed i relativi \textit{header file} definiscono un
insieme di funzionalità in cui sono incluse come sottoinsieme anche quelle
previste dallo standard ANSI C. È possibile ottenere una conformità stretta
allo standard (scartando le funzionalità addizionali) usando il \cmd{gcc} con
l'opzione \cmd{-ansi}. Questa opzione istruisce il compilatore a definire nei
-vari header file soltanto le funzionalità previste dallo standard ANSI C e a
-non usare le varie estensioni al linguaggio e al preprocessore da esso
-supportate.
+vari \textit{header file} soltanto le funzionalità previste dallo standard
+ANSI C e a non usare le varie estensioni al linguaggio e al preprocessore da
+esso supportate.
\subsection{I tipi di dati primitivi}
Per questo motivo tutte le funzioni di libreria di solito non fanno
riferimento ai tipi elementari dello standard del linguaggio C, ma ad una
serie di \index{tipo!primitivo} \textsl{tipi primitivi} del sistema, riportati
-in tab.~\ref{tab:intro_primitive_types}, e definiti nell'header file
+in tab.~\ref{tab:intro_primitive_types}, e definiti nell'\textit{header file}
\file{sys/types.h}, in modo da mantenere completamente indipendenti i tipi
utilizzati dalle funzioni di sistema dai tipi elementari supportati dal
compilatore C.
Transport Interface}) mirante a soppiantare (senza molto successo)
l'interfaccia dei socket derivata da BSD. Una seconda versione della guida fu
rilasciata nel 1994; questa è nota con il nome di Spec 1170 (dal numero delle
-interfacce, header e comandi definiti) ma si fa riferimento ad essa anche come
-XPG4v2.
+interfacce, intestazioni e comandi definiti) ma si fa riferimento ad essa
+anche come XPG4v2.
Nel 1993 il marchio Unix passò di proprietà dalla Novell (che a sua volta lo
aveva comprato dalla AT\&T) al consorzio X/Open che iniziò a pubblicare le sue
In Linux, se si usa la \acr{glibc}, la conformità agli standard appena
descritti può essere richiesta sia attraverso l'uso di opportune opzioni del
compilatore (il \texttt{gcc}) che definendo delle specifiche costanti prima
-dell'inclusione dei file di dichiarazione (gli \textit{header file}) che
-definiscono le funzioni di libreria.
+dell'inclusione dei file di intestazione (gli \textit{header file}, vedi
+sez.~\ref{sec:proc_syscall}) che definiscono le funzioni di libreria.
Ad esempio se si vuole che i programmi seguano una stretta attinenza allo
standard ANSI C si può usare l'opzione \texttt{-ansi} del compilatore, e non
che non devono assolutamente mai essere usate direttamente. } questo può
essere fatto attraverso l'opzione \texttt{-D} del compilatore, ma è buona
norma farlo inserendo gli opportuni \code{\#define} prima della inclusione dei
-propri \textit{header file}.
+propri \textit{header file} (vedi sez.~\ref{sec:proc_syscall}).
Le macro disponibili per controllare l'aderenza ai vari standard messi a
disposizione della \acr{glibc}, che rendono disponibili soltanto le funzioni
% LocalWords: assert ctype dirent errno fcntl limits malloc setjmp signal utmp
% LocalWords: stdarg stdio stdlib string times unistd library int short caddr
% LocalWords: address clock dev ino inode key IPC loff nlink off pid rlim size
-% LocalWords: sigset ssize ptrdiff sys nell'header IEEE Richard Portable of TR
+% LocalWords: sigset ssize ptrdiff sys IEEE Richard Portable of TR
% LocalWords: Operating Interface dell'IEEE Electrical and Electronics thread
% LocalWords: Engeneers Socket NT matching regular expression scheduling l'I
% LocalWords: XPG Portability Issue Application Programmable XTI Transport AT