o quello specificato) la terza permette di stampare su una stringa, in genere
l'uso di \func{sprintf} è sconsigliato in quanto è possibile, se non si ha la
sicurezza assoluta sulle dimensioni del risultato della stampa, eccedere le
-dimensioni di \param{str} con conseguente sovrascrittura di altre varibili e
+dimensioni di \param{str} con conseguente sovrascrittura di altre variabili e
possibili buffer overflow; per questo motivo si consiglia l'uso
dell'alternativa:
\begin{prototype}{stdio.h}
% [n. parametro $] [flag] [[larghezza] [. precisione]] [tipo] conversione
\end{verbatim}
\end{center}
-in cui tutti i valori tranne il \cmd{\%} e lo specificatatore di conversione
+in cui tutti i valori tranne il \cmd{\%} e lo specificatore di conversione
sono opzionali (e per questo sono indicati fra parentesi quadre); si possono
usare più elementi opzionali, nel qual caso devono essere specificati in
questo ordine:
\textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \cmd{hh} & una conversione intera corriponde a un \type{char} con o senza
+ \cmd{hh} & una conversione intera corrisponde a un \type{char} con o senza
segno, o il puntatore per il numero dei parametri \cmd{n} è di
tipo \type{char}.\\
- \cmd{h} & una conversione intera corriponde a uno \type{short} con o
+ \cmd{h} & una conversione intera corrisponde a uno \type{short} con o
senza segno, o il puntatore per il numero dei parametri \cmd{n}
è di tipo \type{short}.\\
- \cmd{l} & una conversione intera corriponde a un \type{long} con o
+ \cmd{l} & una conversione intera corrisponde a un \type{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
sono in formato esteso.\\
- \cmd{ll} & una conversione intera corriponde a un \type{long long} con o
+ \cmd{ll} & una conversione intera corrisponde a un \type{long long} con o
senza segno, o il puntatore per il numero dei parametri \cmd{n}
è di tipo \type{long long}.\\
\cmd{L} & una conversione in virgola mobile corrisponde a un
l'indirizzo di un puntatore ad una stringa di caratteri, in cui verrà
restituito (si ricordi quanto detto in \secref{sec:proc_var_passing} a
proposito dei \textit{value result argument}) l'indirizzo della stringa
-allogata automaticamente dalle funzioni. Occorre onoltre ricordarsi di
+allogata automaticamente dalle funzioni. Occorre inoltre ricordarsi di
invocare \func{free} per liberare detto puntatore quando la stringa non serve
più, onde evitare memory leak.
soggette ad errori, e considerato anche il fatto che è estremamente macchinoso
recuperare in caso di fallimento nelle corrispondenze, l'input formattato non
è molto usato. In genere infatti quando si ha a che fare con un input
-relativamente semplice si preferisce usare l'input di linea ed effetture
+relativamente semplice si preferisce usare l'input di linea ed effettuare
scansione e conversione di quanto serve direttamente con una delle funzioni di
conversione delle stringhe; se invece il formato è più complesso diventa più
facile utilizzare uno strumento come il \cmd{flex} per generare un
particolare \param{whence} assume gli stessi valori già visti in
\secref{sec:file_lseek}. La funzione restituisce 0 in caso di successo e -1
in caso di errore. La funzione \func{rewind} riporta semplicemente la
-posizione corrente all'inzio dello stream, ma non esattamente equivalente ad
+posizione corrente all'inizio dello stream, ma non esattamente equivalente ad
una \code{fseek(stream, 0L, SEEK\_SET)} in quanto vengono cancellati anche i
flag di errore e fine del file.
procedura può comportare dei pesanti costi in termini di prestazioni. Per
questo motivo abbiamo visto in come per tutte le funzioni di I/O non
formattato esistano delle versioni \code{\_unlocked} (alcune previste dallo
-standard POSIX stesso, altre aggiunte come estenzioni dalle \acr{glibc}) che
+standard POSIX stesso, altre aggiunte come estensioni dalle \acr{glibc}) che
possono essere usate in tutti questi casi\footnote{in certi casi dette
funzioni possono essere usate, visto che sono molto più efficiente, anche in
caso di necessità di locking, una volta che questo sia stato acquisito
\func{putc}) queste versioni possono essere realizzate come macro, e sono
pertanto in grado di garantire prestazione enormemente più elevate.
-La sostituizione di tutte le funzioni di I/O con le relative versioni
+La sostituzione di tutte le funzioni di I/O con le relative versioni
\code{\_unlocked} in un programma che non usa i thread è però un lavoro
abbastanza noioso, e che appesantisce il codice; per questo motivo le
\acr{glibc} provvedono un'altra via per poter utilizzare disabilitare il
\end{itemize*}
Il problema più comune e più difficile da risolvere che si incontra con le
-routines di allocazione è quando non viene opportunamente liberata la memoria
+routine di allocazione è quando non viene opportunamente liberata la memoria
non più utilizzata, quello che in inglese viene chiamato \textit{memory-leak},
(cioè \textsl{perdita di memoria}).
automaticamente al ritorno della funzione.
Come è evidente questa funzione ha molti vantaggi, anzitutto permette di
-evitare alla readice i problemi di memory leak, dato che non serve più la
+evitare alla radice i problemi di memory leak, dato che non serve più la
deallocazione esplicita; inoltre la deallocazione automatica funziona anche
quando si usa \func{longjmp} per uscire da una subroutine con un salto non
locale da una funzione (vedi \secref{sec:proc_longjmp}).
Oltre al passaggio dei parametri, un'altra modalità che permette di passare
delle informazioni che modifichino il comportamento di un programma è quello
dell'uso del cosiddetto \textit{environment} (cioè l'uso delle
-\textsl{varibili di ambiente}). In questa sezione esamineremo le funzioni che
+\textsl{variabili di ambiente}). In questa sezione esamineremo le funzioni che
permettono di gestire parametri e opzioni, e quelle che consentono di
-manipolare ed utilizzare le varibili di ambiente.
+manipolare ed utilizzare le variabili di ambiente.
\subsection{Il formato dei parametri}
\var{argv} le librerie standard del C forniscono la funzione \func{getopt}
che ha il seguente prototipo:
\begin{prototype}{unistd.h}
-{int getopt(int argc, char * const argv[], const char * optstring)}
+{int getopt(int argc, char *const argv[], const char *optstring)}
Esegue il parsing degli argomenti passati da linea di comando
riconoscendo le possibili opzioni segnalate con \var{optstring}.
eseguire la copia di un puntatore alla lista degli argomenti:
\begin{prototype}{stdarg.h}{void va\_copy(va\_list dest, va\_list src)}
Copia l'attuale valore \param{src} del puntatore alla lista degli argomenti
- su \param{desc}.
+ su \param{dest}.
\end{prototype}
\noindent anche in questo caso è buona norma chiudere ogni esecuzione di una
\macro{va\_copy} con una corrispondente \macro{va\_end} sul nuovo puntatore
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 ocoorrerà tenerne conto (ad esempio un \type{char} verrà visto da
+dei medesimi occorrerà tenerne conto (ad esempio un \type{char} verrà visto da
\macro{va\_arg} come \type{int}).
Per questo una delle regole fondamentali della programmazione in C è che
all'uscita di una funzione non deve restare nessun riferimento alle variabili
-locali; qualora sia necessirio utilizzare variabili che possano essere viste
+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
dinamicamente con una delle funzioni della famiglia \func{malloc}.
realtà (come mostrato in \figref{fig:proc_exec_relat}), costituiscono un
front-end a \func{execve}. Il prototipo di quest'ultima è:
\begin{prototype}{unistd.h}
-{int execve(const char * filename, char * const argv [], char * const envp[])}
+{int execve(const char *filename, char *const argv[], char *const envp[])}
Esegue il programma contenuto nel file \param{filename}.
\bodydesc{La funzione ritorna -1 solo in caso di errore, nel qual caso
difficili da tracciare, in quanto nella maggior parte dei casi tutto
funzionerà regolarmente, e solo occasionalmente si avranno degli errori.
-Per questo occorre essere ben consapovoli di queste problematiche, e del fatto
+Per questo occorre essere ben consapevoli di queste problematiche, e del fatto
che l'unico modo per evitarle è quello di riconoscerle come tali e prendere
gli adeguati provvedimenti per far si che non si verifichino. Casi tipici di
\textit{race condition} si hanno quando diversi processi accedono allo stesso
L'esempio tipico di una situazione che può condurre ad un \textit{deadlock} è
quello in cui un flag di ``occupazione'' viene rilasciato da un evento
asincrono (come un segnale o un altro processo) fra il momento in cui lo si è
-controllato (trovadolo occupato) e la successiva operazione di attesa per lo
+controllato (trovandolo occupato) e la successiva operazione di attesa per lo
sblocco. In questo caso, dato che l'evento di sblocco del flag è avvenuto
senza che ce ne accorgessimo proprio fra il controllo e la messa in attesa,
quest'ultima diventerà perpetua (da cui il nome di \textit{deadlock}).