crittografia richiedono il blocco di alcune pagine di memoria.
\end{itemize}
+Per ottenere informazioni sulle modalità in cui un programma sta usando la
+memoria virtuale è disponibile una apposita funzione, \funcd{mincore}, che
+però non è standardizzata da POSIX e pertanto non è disponibile su tutte le
+versioni di kernel unix-like;\footnote{nel caso di Linux devono essere
+ comunque definite le macro \macro{\_BSD\_SOURCE} e \macro{\_SVID\_SOURCE}.}
+il suo prototipo è:
+\begin{functions}
+ \headdecl{unistd.h}
+ \headdecl{sys/mman.h}
+
+ \funcdecl{int mincore(void *addr, size\_t length, unsigned char *vec)}
+ Ritorna lo stato delle pagine di memoria occupate da un processo.
+
+ \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di
+ errore, nel qual caso \var{errno} assumerà uno dei valori seguenti:
+ \begin{errlist}
+ \item[\errcode{ENOMEM}] o \param{addr} + \param{lenght} eccede la dimensione
+ della memoria usata dal processo o l'intervallo di indirizzi specificato
+ non è mappato.
+ \item[\errcode{EINVAL}] \param{addr} non è un multiplo delle dimensioni di
+ una pagina.
+ \item[\errcode{EFAULT}] \param{vec} punta ad un indirizzo non valido.
+ \item[\errcode{EAGAIN}] il kernel è temporaneamente non in grado di fornire
+ una risposta.
+ \end{errlist}
+}
+\end{functions}
+
+La funzione permette di ottenere le informazioni sullo stato della mappatura
+della memoria per il processo chiamante, specificando l'intervallo da
+esaminare con l'indirizzo iniziale (indicato con l'argomento \param{addr}) e
+la lunghezza (indicata con l'argomento \param{length}). L'indirizzo iniziale
+deve essere un multiplo delle dimensioni di una pagina, mentre la lunghezza
+può essere qualunque, fintanto che si resta nello spazio di indirizzi del
+processo,\footnote{in caso contrario si avrà un errore di \errcode{ENOMEM};
+ fino al kernel 2.6.11 in questo caso veniva invece restituito
+ \errcode{EINVAL}, in considerazione che il caso più comune in cui si
+ verifica questo errore è quando si usa per sbaglio un valore negativo
+ di \param{length}, che nel caso verrebbe interpretato come un intero
+ positivo di grandi dimensioni.} ma il risultato verrà comunque fornito per
+l'intervallo compreso fino al multiplo successivo.
+
+I risultati della funzione vengono forniti nel vettore puntato da \param{vec},
+che deve essere allocato preventivamente e deve essere di dimensione
+sufficiente a contenere tanti byte quante sono le pagine contenute
+nell'intervallo di indirizzi specificato.\footnote{la dimensione cioè deve
+ essere almeno pari a \code{(length+PAGE\_SIZE-1)/PAGE\_SIZE}. } Al ritorno
+della funzione il bit meno significativo di ciascun byte del vettore sarà
+acceso se la pagina di memoria corrispondente è al momento residente in
+memoria, o cancellato altrimenti. Il comportamento sugli altri bit è
+indefinito, essendo questi al momento riservati per usi futuri. Per questo
+motivo in genere è comunque opportuno inizializzare a zero il contenuto del
+vettore, così che le pagine attualmente residenti in memoria saranno indicata
+da un valore non nullo del byte corrispondente.
+
+Dato che lo stato della memoria di un processo può cambiare continuamente, il
+risultato di \func{mincore} è assolutamente provvisorio e lo stato delle
+pagine potrebbe essere già cambiato al ritorno stesso della funzione, a meno
+che, come vedremo ora, non si sia attivato il meccanismo che forza il
+mantenimento di una pagina sulla memoria.
+
\itindbeg{memory~locking}
Il meccanismo che previene la \index{paginazione} paginazione di parte della
in byte.\footnote{con Linux questo non avviene e si deve ricorrere alla
funzione \func{getpagesize}, vedi sez.~\ref{sec:sys_memory_res}.}
-
A partire dal kernel 2.6.9 anche un processo normale può bloccare la propria
memoria\footnote{la funzionalità è stata introdotta per non essere costretti a
dare privilegi eccessivi a programmi di crittografia, che necessitano di
\itindend{memory~locking}
-
\index{memoria~virtuale|)}
implementazioni.
Nessuna delle due funzioni ha una chiara standardizzazione (nessuna delle due
-compare in POSIX.1), ed inoltre ci sono indicazione discordi sui file che ne
+compare in POSIX.1), ed inoltre ci sono indicazioni discordi sui file che ne
contengono la definizione;\footnote{secondo SUSv2 \func{valloc} è definita in
\texttt{stdlib.h}, mentre sia le \acr{glibc} che le precedenti \acr{libc4} e
\acr{lic5} la dichiarano in \texttt{malloc.h}, lo stesso vale per
opportuno definire la variabile ad un valore diverso da zero che consente di
rilevare un errore nel momento in cui avviene.
-
-
-% TODO: trattare le funzionalità avanzate di \func{malloc}
-
-% TODO documentare \func{madvise}
-% TODO documentare \func{mincore}
-
+% TODO: trattare le altre funzionalità avanzate di \func{malloc}, mallopt,
+% mtrace, muntrace, mcheck, mallinfo e gli hook
\section{Argomenti, opzioni ed ambiente di un processo}
\subsection{Il formato degli argomenti}
\label{sec:proc_par_format}
-In genere il passaggio degli argomenti al programma viene effettuato dalla
+In genere il passaggio degli argomenti ad un programma viene effettuato dalla
shell, che si incarica di leggere la linea di comando e di effettuarne la
scansione (il cosiddetto \textit{parsing}) per individuare le parole che la
compongono, ciascuna delle quali viene considerata un argomento. Di norma per
-individuare le parole viene usato come carattere di separazione lo spazio o il
-tabulatore, ma il comportamento è modificabile attraverso l'impostazione della
-variabile di ambiente \cmd{IFS}.
+individuare le parole che andranno a costituire la lista degli argomenti viene
+usato come carattere di separazione lo spazio o il tabulatore, ma la cosa
+dipende ovviamente dalle modalità con cui si effettua il lancio.
\begin{figure}[htb]
\centering
\label{fig:proc_argv_argc}
\end{figure}
-Nella scansione viene costruito il vettore di puntatori \param{argv} inserendo
-in successione il puntatore alla stringa costituente l'$n$-simo argomento; la
-variabile \param{argc} viene inizializzata al numero di argomenti trovati, in
-questo modo il primo argomento è sempre il nome del programma; un esempio di
-questo meccanismo è mostrato in fig.~\ref{fig:proc_argv_argc}.
+Indipendentemente da come viene eseguita, il risultato della scansione deve
+essere la costruzione del vettore di puntatori \param{argv} in cui si devono
+inserire in successione i puntatori alle stringhe costituenti i vari
+argomenti, e della variabile \param{argc} che deve essere inizializzata al
+numero di argomenti trovati. Nel caso della shell questo comporta che il primo
+argomento sia sempre il nome del programma; un esempio di questo meccanismo è
+mostrato in fig.~\ref{fig:proc_argv_argc}.
\subsection{La gestione delle opzioni}
(NdA: questa parte verrà inserita in seguito).
-% TODO opzioni in formato esteso
-
-
+% TODO opzioni in formato esteso
\section{Problematiche di programmazione generica}
\label{sec:proc_gen_prog}
sez.~\ref{sec:sys_cpu_times}) che il processo può
usare. Il superamento del limite corrente
comporta l'emissione di un segnale di
- \const{SIGXCPU} la cui azione predefinita (vedi
+ \const{SIGXCPU}, la cui azione predefinita (vedi
sez.~\ref{sec:sig_classification}) è terminare
- il processo. Il superamento del limite massimo
+ il processo, una volta al secondo fino al
+ raggiungimento del limite massimo. Il
+ superamento del limite massimo
comporta l'emissione di un segnale di
\const{SIGKILL}.\footnotemark\\
\const{RLIMIT\_DATA} & La massima dimensione del \index{segmento!dati}
sez.~\ref{sec:ipc_sysv_shm}) che viene
contabilizzata separatamente ma sulla quale
viene applicato questo stesso limite.\\
+% TODO trattare i seguenti...
+% \const{RLIMIT\_MSGQUEUE}& Il numero massimo di \\
+% \const{RLIMIT\_NICE}& Il numero massimo di \\
+% \const{RLIMIT\_RTPRIO}& Il numero massimo di \\
+% aggiungere i limiti che mancano come RLIMIT_RTTIME introdotto con il 2.6.25
+% vedi file include/asm-generic/resource.h
\const{RLIMIT\_NOFILE} & Il numero massimo di file che il processo può
aprire. L'apertura di un ulteriore file farà
fallire la funzione (\func{open}, \func{dup} o
\footnotetext[18]{questo è quanto avviene per i kernel dalla serie 2.2 fino ad
oggi (la 2.6.x); altri kernel possono avere comportamenti diversi per quanto
avviene quando viene superato il \textit{soft limit}; perciò per avere
- operazioni portabili è sempre opportuno intercettare \const{SIGXCPU} e
- terminare in maniera ordinata il processo.}
+ operazioni portabili è sempre opportuno intercettare il primo
+ \const{SIGXCPU} e terminare in maniera ordinata il processo.}
\footnotetext{il limite su questa risorsa è stato introdotto con il kernel
2.6.8.}
-% aggiungere i limiti che mancano come RLIMIT_RTTIME introdotto con il 2.6.25
-% vedi file include/asm-generic/resource.h
In generale il superamento di un limite corrente\footnote{di norma quanto
riportato in tab.~\ref{tab:sys_rlimit_values} fa riferimento a quanto