X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=intro.tex;h=d0513cfc7ca5e8f8fdfa9def92e639de82bcd6c6;hp=785f0108705976b5d754df5391736f58dbd8b2f6;hb=9a577c89dd563aacbc619e09bf8b6d99b533274a;hpb=4e1da5b259a86278710be32441de7b88b9287ec1 diff --git a/intro.tex b/intro.tex index 785f010..d0513cf 100644 --- a/intro.tex +++ b/intro.tex @@ -29,10 +29,7 @@ introdurremo alcuni degli standard principali a cui viene fatto riferimento. 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} @@ -293,51 +290,6 @@ fondamentale per capire il funzionamento del sistema, l'uso da parte dei 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} @@ -427,7 +379,7 @@ interfacce di programmazione e le altre caratteristiche di un sistema 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} @@ -449,65 +401,21 @@ 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. -\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} @@ -572,7 +480,7 @@ infinita serie di problemi di portabilità. 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. @@ -802,8 +710,8 @@ Issue 4, da cui la sigla XPG4, che aggiungeva l'interfaccia XTI (\textit{X 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 @@ -849,8 +757,8 @@ dall'aggiornamento vada a definire la quarta versione delle \textit{Single 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 @@ -876,7 +784,7 @@ funzionalità che la \acr{glibc} può mettere a disposizione:\footnote{le macro 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 @@ -1125,7 +1033,7 @@ sempre definite prima dell'inclusione dei file di dichiarazione. % 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