X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=system.tex;h=a761b4dcd31e2431c3ea9f19294975863f1ee21f;hp=bd60d40fb574b7261ae83d92750ec402e9c835e3;hb=26f7a8bb19c6cb198c213757a97b6ac79e40db4b;hpb=702770a35b02bf0a4d882e6e6ac573a05f414335 diff --git a/system.tex b/system.tex index bd60d40..a761b4d 100644 --- a/system.tex +++ b/system.tex @@ -32,14 +32,14 @@ l'implementazione del kernel e delle librerie, le opzioni di configurazione. Il kernel inoltre mette a disposizione l'accesso ad alcuni parametri che possono modificarne il comportamento. -La definizione di queste caratteristiche ed il tentativo di provvedere dei +La definizione di queste caratteristiche ed il tentativo di fornire dei meccanismi generali che i programmi possono usare per ricavarle è uno degli aspetti più complessi e controversi con cui le diverse standardizzazioni si -sono dovute confrontare, spesso con risultati spesso tutt'altro che chiari. -Daremo comunque una descrizione dei principali metodi previsti dai vari -standard per ricavare sia le caratteristiche specifiche del sistema, che -quelle della gestione dei file e prenderemo in esame le modalità con cui è -possibile intervenire sui parametri del kernel. +sono dovute confrontare, con risultati spesso tutt'altro che chiari. Daremo +comunque una descrizione dei principali metodi previsti dai vari standard per +ricavare sia le caratteristiche specifiche del sistema che quelle della +gestione dei file, e prenderemo in esame le modalità con cui è possibile +intervenire sui parametri del kernel. \subsection{Limiti e caratteristiche del sistema} \label{sec:sys_limits} @@ -58,16 +58,17 @@ sono necessari due tipi diversi di funzionalità: \item la possibilità di determinare limiti ed opzioni durante l'esecuzione. \end{itemize*} -La prima funzionalità si può ottenere includendo gli opportuni header file che -contengono le costanti necessarie definite come macro di preprocessore, per la -seconda invece sono ovviamente necessarie delle funzioni. La situazione è -complicata dal fatto che ci sono molti casi in cui alcuni di questi limiti -sono fissi in un'implementazione mentre possono variare in un altra: tutto -questo crea una ambiguità che non è sempre possibile risolvere in maniera -chiara. In generale quello che succede è che quando i limiti del sistema sono -fissi essi vengono definiti come macro di preprocessore nel file -\headfile{limits.h}, se invece possono variare, il loro valore sarà ottenibile -tramite la funzione \func{sysconf} (che esamineremo a breve). +La prima funzionalità si può ottenere includendo gli opportuni file di +intestazione che contengono le costanti necessarie definite come macro di +preprocessore, per la seconda invece sono ovviamente necessarie delle +funzioni. La situazione è complicata dal fatto che ci sono molti casi in cui +alcuni di questi limiti sono fissi in un'implementazione mentre possono +variare in un altra: tutto questo crea una ambiguità che non è sempre +possibile risolvere in maniera chiara. In generale quello che succede è che +quando i limiti del sistema sono fissi essi vengono definiti come macro di +preprocessore nel file \headfile{limits.h}, se invece possono variare, il loro +valore sarà ottenibile tramite la funzione \func{sysconf} (che esamineremo a +breve). \begin{table}[htb] \centering @@ -151,7 +152,7 @@ sez.~\ref{sec:sys_file_limits}. \begin{table}[htb] \centering \footnotesize - \begin{tabular}[c]{|l|r|p{8cm}|} + \begin{tabular}[c]{|l|r|p{9cm}|} \hline \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\ \hline @@ -187,7 +188,7 @@ file, riportate in tab.~\ref{tab:sys_file_macro}. \begin{table}[htb] \centering \footnotesize - \begin{tabular}[c]{|l|r|p{8cm}|} + \begin{tabular}[c]{|l|r|p{9cm}|} \hline \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\ \hline @@ -247,7 +248,7 @@ valori ottenuti da \func{sysconf}. \begin{table}[htb] \centering \footnotesize - \begin{tabular}[c]{|l|p{8cm}|} + \begin{tabular}[c]{|l|p{9cm}|} \hline \textbf{Macro}&\textbf{Significato}\\ \hline @@ -370,12 +371,12 @@ relative spiegazioni, si può trovare nel manuale della \acr{glibc}. \end{table} In generale ogni limite o caratteristica del sistema per cui è definita una -macro, sia dagli standard ANSI C e ISO C90, che da POSIX.1 e POSIX.2, può -essere ottenuto attraverso una chiamata a \func{sysconf}. Il nome della -costante da utilizzare come valore dell'argomento \param{name} si otterrà -aggiungendo \code{\_SC\_} ai nomi delle costanti definite dai primi due -standard (quelle di tab.~\ref{tab:sys_generic_macro}), o sostituendolo a -\code{\_POSIX\_} per le costanti definite dagli altri due standard (quelle di +macro, sia da ANSI C e ISO C90 che da POSIX.1 e POSIX.2, può essere ottenuto +attraverso una chiamata a \func{sysconf}. Il nome della costante da utilizzare +come valore dell'argomento \param{name} si otterrà aggiungendo \code{\_SC\_} +ai nomi delle costanti definite dai primi due standard (quelle di +tab.~\ref{tab:sys_generic_macro}), o sostituendolo a \code{\_POSIX\_} per le +costanti definite dagli altri due standard (quelle di tab.~\ref{tab:sys_posix1_general}). In linea teorica si dovrebbe fare uso di \func{sysconf} solo quando la @@ -516,8 +517,10 @@ BSD4.4 ed introdotta su Linux a partire dal kernel 1.3.57, ma oggi il suo uso esistere, ma non dispone più di una interfaccia nella \acr{glibc} ed il suo utilizzo può essere effettuato solo tramite \func{syscall}, ma di nuovo questo viene sconsigliato in quanto la funzionalità non è più mantenuta e molto -probabilmente sarà rimossa nel prossimo futuro. Per questo motivo eviteremo di -trattarne i particolari. +probabilmente sarà rimossa nel prossimo futuro.\footnote{a partire dal kernel + 2.6.34 la funzione viene inserita nella compilazione del kernel previa + esplicita richiesta, ed il suo uso produce avvertimenti nei log del kernel.} +Per questo motivo eviteremo di trattarne i particolari. Lo scopo di \funcm{sysctl} era quello di fornire ai programmi una modalità per modificare i parametri di sistema. Questi erano organizzati in maniera @@ -531,33 +534,36 @@ moduli che sono stati caricati nel sistema. Inoltre non essendo standardizzati i loro nomi possono variare da una versione di kernel all'altra, alcuni esempi di questi parametri sono: \begin{itemize*} -\item il nome di dominio -\item i parametri del meccanismo di \textit{paging}. -\item il filesystem montato come radice -\item la data di compilazione del kernel -\item i parametri dello stack TCP -\item il numero massimo di file aperti +\item il nome di dominio, +\item i parametri del meccanismo di \textit{paging}, +\item il filesystem montato come radice, +\item la data di compilazione del kernel, +\item i parametri dello stack TCP, +\item il numero massimo di file aperti, +\item il numero massimo di processi, +\item i parametri del \textit{SystemV IPC} (vedi sez.~\ref{sec:ipc_sysv}). \end{itemize*} - - +%\noindent e molti altri che abbiamo già incontrato \index{file!filesystem~\texttt {/proc}!definizione|(} Dato che fin dall'inizio i parametri erano organizzati in una struttura -albero, è parso naturale rimappare questa organizzazione utilizzando il -filesystem \file{/proc}. Questo è un filesystem completamente virtuale, il cui -contenuto è generato direttamente dal kernel, che non fa riferimento a nessun -dispositivo fisico, ma presenta in forma di file e directory i dati di alcune -delle strutture interne del kernel stesso. Il suo utilizzo principale, come -denuncia il nome stesso, è quello di fornire una interfaccia per ottenere i -dati relativi ai processi (venne introdotto a questo scopo su BSD), ma nel -corso del tempo il suo uso è stato ampliato. +albero, è parso naturale riportare questa organizzazione all'interno del +filesystem \file{/proc}. Questo è un filesystem virtuale il cui contenuto è +generato direttamente dal kernel, che non fa riferimento a nessun dispositivo +fisico, ma presenta in forma di file e directory i dati di alcune delle +strutture interne del kernel. Il suo utilizzo principale, come denuncia il +nome stesso, è quello di fornire una interfaccia per ottenere i dati relativi +ai processi (venne introdotto a questo scopo su BSD), ma nel corso del tempo +il suo uso è stato ampliato. All'interno di questo filesystem sono pertanto presenti una serie di file che riflettono il contenuto dei parametri del kernel (molti dei quali accessibili in sola lettura) e in altrettante directory, nominate secondo il relativo \ids{PID}, vengono mantenute le informazioni relative a ciascun processo -attivo nel sistema. +attivo nel sistema (abbiamo già incontrato questa caratteristica in +sez.~\ref{sec:file_openat} per accedere ai filedescriptor del processo +stesso). In particolare l'albero dei valori dei parametri di sistema impostabili con \func{sysctl} viene presentato in forma di una gerarchia di file e directory a @@ -579,8 +585,8 @@ l'accesso, con altrettante corrispondenze ai file presenti in ma vista la assoluta naturalità dell'interfaccia, e la sua maggiore efficienza, nelle versioni più recenti del kernel questa è diventata la modalità canonica per modificare i parametri del kernel, evitando di dover -ricorrere all'uso di una \textit{system call} specifica che pur essendo ancora -presente, prima o poi verrà eliminata. +ricorrere all'uso di una \textit{system call} specifica, che pur essendo +ancora presente prima o poi verrà eliminata. Nonostante la semplificazione nella gestione ottenuta con l'uso di \file{/proc/sys} resta il problema generale di conoscere il significato di @@ -661,8 +667,6 @@ trovano sotto la directory \file{/proc/sys/kernel/}. \index{file!filesystem~\texttt {/proc}!definizione|)} - - \section{La gestione del sistema} \label{sec:sys_management} @@ -681,11 +685,11 @@ Tradizionalmente le informazioni utilizzate nella gestione di utenti e gruppi directory, ecc.) venivano registrate all'interno dei due file di testo \conffiled{/etc/passwd} ed \conffiled{/etc/group}, il cui formato è descritto dalle relative pagine del manuale\footnote{nella quinta sezione, quella dei - file di configurazione (esistono comandi corrispondenti), una trattazione - sistemistica dell'intero argomento coperto in questa sezione si consulti - sez.~4.3 di \cite{AGL}.} e tutte le funzioni che richiedevano l'accesso a -queste informazione andavano a leggere direttamente il contenuto di questi -file. + file di configurazione, dato che esistono comandi corrispondenti; per una + trattazione sistemistica dell'intero argomento coperto in questa sezione si + consulti sez.~4.3 di \cite{AGL}.} e tutte le funzioni che richiedevano +l'accesso a queste informazione andavano a leggere direttamente il contenuto +di questi file. In realtà oltre a questi due file da molto tempo gran parte dei sistemi unix-like usano il cosiddetto sistema delle \textit{shadow password} che @@ -701,26 +705,29 @@ la maggior parte delle distribuzioni di GNU/Linux usa la libreria PAM (sigla che sta per \textit{Pluggable Authentication Method}) che fornisce una interfaccia comune per i processi di autenticazione, svincolando completamente le singole applicazioni dai dettagli del come questa viene eseguita e di dove -vengono mantenuti i dati relativi. Si tratta di un sistema modulare, in cui è -possibile utilizzare anche più meccanismi insieme, diventa così possibile -avere vari sistemi di riconoscimento (biometria, chiavi hardware, ecc.), -diversi formati per le password e diversi supporti per le informazioni. Il -tutto avviene in maniera trasparente per le applicazioni purché per ciascun -meccanismo si disponga della opportuna libreria che implementa l'interfaccia -di PAM. +vengono mantenuti i dati relativi. + +Si tratta di un sistema modulare, in cui è possibile utilizzare anche più +meccanismi insieme, diventa così possibile avere vari sistemi di +riconoscimento (biometria, chiavi hardware, ecc.), diversi formati per le +password e diversi supporti per le informazioni. Il tutto avviene in maniera +trasparente per le applicazioni purché per ciascun meccanismo si disponga +della opportuna libreria che implementa l'interfaccia di PAM. Dall'altra parte, il diffondersi delle reti e la necessità di centralizzare le informazioni degli utenti e dei gruppi per insiemi di macchine e servizi all'interno di una stessa organizzazione, in modo da mantenere coerenti i dati, ha portato anche alla necessità di poter recuperare e memorizzare dette informazioni su supporti diversi dai file citati, introducendo il sistema del -\textit{Name Service Switch} (che tratteremo brevemente in -sez.~\ref{sec:sock_resolver}) dato che la sua applicazione è cruciale nella +\textit{Name Service Switch}, che tratteremo brevemente in +sez.~\ref{sec:sock_resolver} dato che la sua applicazione è cruciale nella procedura di risoluzione di nomi di rete. In questo paragrafo ci limiteremo comunque a trattare le funzioni classiche per la lettura delle informazioni relative a utenti e gruppi tralasciando -completamente quelle relative all'autenticazione. +completamente quelle relative all'autenticazione.\footnote{la cui + programmazione ormai attiene all'uso dell'interfaccia di PAM, che va al di + la dello scopo di questo testo.} % Per questo non tratteremo % affatto l'interfaccia di PAM, ma approfondiremo invece il sistema del % \textit{Name Service Switch}, un meccanismo messo a disposizione dalla @@ -814,7 +821,7 @@ illustrato in sez.~\ref{sec:sys_errno}) per cui se lo si vuole utilizzare è opportuno inizializzarlo a zero prima di invocare le funzioni per essere sicuri di non avere un residuo di errore da una chiamata precedente. Il non aver trovato l'utente richiesto infatti può essere dovuto a diversi motivi (a -partire dal fatto che non esista) per cui si possono ottenere i valori di +partire dal fatto che non esista) per cui si possono ottenere i codici di errore più vari a seconda dei casi. Del tutto analoghe alle precedenti sono le funzioni \funcd{getgrnam} e @@ -970,15 +977,15 @@ informazioni sono descritte in dettaglio nel manuale della \acr{glibc}. Questi file non devono mai essere letti direttamente, ma le informazioni che contengono possono essere ricavate attraverso le opportune funzioni di -libreria. Queste sono analoghe alle precedenti funzioni (vedi -tab.~\ref{tab:sys_passwd_func}) usate per accedere al registro degli utenti, -solo che in questo caso la struttura del registro della \textsl{contabilità} è -molto più complessa, dato che contiene diversi tipi di informazione. +libreria. Queste sono analoghe alle precedenti funzioni usate per accedere al +registro degli utenti (vedi tab.~\ref{tab:sys_passwd_func}), solo che in +questo caso la struttura del registro della \textsl{contabilità} è molto più +complessa, dato che contiene diversi tipi di informazione. Le prime tre funzioni, \funcd{setutent}, \funcd{endutent} e \funcd{utmpname} servono rispettivamente a aprire e a chiudere il file che contiene il registro della \textsl{contabilità} degli, e a specificare su quale file esso viene -mantenuto. I loro prototipi sono: +mantenuto; i loro prototipi sono: \begin{funcproto}{ \fhead{utmp.h} @@ -1151,7 +1158,7 @@ argomenti aggiuntivi, i rispettivi prototipi sono: Le funzioni si comportano esattamente come le precedenti analoghe non rientranti, solo che restituiscono il risultato all'indirizzo specificato dal -primo argomento aggiuntivo \param{buffer} mentre il secondo, \param{result)} +primo argomento aggiuntivo \param{buffer} mentre il secondo, \param{result}, viene usato per restituire il puntatore al buffer stesso. Infine la \acr{glibc} fornisce altre due funzioni, \funcd{updwtmp} e @@ -1275,15 +1282,16 @@ illustra i comandi attualmente disponibili: \item[\constd{LINUX\_REBOOT\_CMD\_RESTART2}] Viene inviato sulla console il messaggio ``\textit{Restarting system with command '\%s'.}'' ed avviata immediatamente la procedura di riavvio usando il comando fornito - nell'argomento \param{arg} che viene stampato al posto di \textit{'\%s'} + nell'argomento \param{arg} che viene stampato al posto di \texttt{'\%s'} (veniva usato per lanciare un altro programma al posto di \cmd{init}). Nelle versioni recenti questo argomento viene ignorato ed il riavvio può essere controllato dall'argomento di avvio del kernel \texttt{reboot=...} Se non si è eseguita una sincronizzazione dei dati su disco con \func{sync} questi saranno perduti. + % TODO: trattare LINUX_REBOOT_CMD_SW_SUSPEND + % TODO: rimandare agli effetti di reboot sui namespace \end{basedescript} - Come appena illustrato usando il comando \const{LINUX\_REBOOT\_CMD\_KEXEC} si può eseguire un riavvio immediato pre-caricando una immagine del kernel, che verrà eseguita direttamente. Questo meccanismo consente di evitare la @@ -1357,14 +1365,14 @@ che sia effettivamente eseguibile sul proprio processore. \hline \constd{KEXEC\_ON\_CRASH} & Il kernel caricato sarà eseguito automaticamente in caso di crollo del - sistema.\\ + sistema (dal kernel 2.6.13).\\ \constd{KEXEC\_PRESERVE\_CONTEXT}& Viene preservato lo stato dei programmi e dei dispositivi prima dell'esecuzione del nuovo kernel. Viene usato principalmente per l'ibernazione del sistema ed ha senso solo se si è indicato un numero di segmento maggiore - di zero.\\ + di zero (dal kernel 2.6.27).\\ \hline \constd{KEXEC\_ARCH\_DEFAULT} & Il kernel caricato verrà eseguito nella architettura corrente. \\ @@ -1394,30 +1402,14 @@ più in grado di essere eseguito in maniera coerente. Il secondo valore, programmi e dei dispositivi, e viene in genere usato per realizzare la cosiddetta ibernazione in RAM. -% TODO: introdotta con il kernel 3.17 è stata introdotta -% kexec_file_load, per caricare immagine firmate per il secure boot, -% vedi anche http://lwn.net/Articles/603116/ - -% TODO documentare keyctl ???? -% (fare sezione dedicata ????) - -% TODO documentare la Crypto API del kernel - -% TODO documentare la syscall getrandom, introdotta con il kernel 3.17, vedi -% http://lwn.net/Articles/606141/, ed introdotta con le glibc solo con la -% versione 2.25, vedi https://lwn.net/Articles/711013/ +% TODO: con il kernel 3.17 è stata introdotta kexec_file_load, per caricare +% immagine firmate per il secure boot, vedi anche +% http://lwn.net/Articles/603116/ -%\subsection{La gestione delle chiavi crittografiche} -%\label{sec:keyctl_management} - -%TODO non è chiaro se farlo qui, ma documentare la syscall bpf aggiunta con il -% kernel 3.18, vedi http://lwn.net/Articles/612878/; al riguardo vedi anche -% https://lwn.net/Articles/660331/ \section{Il controllo dell'uso delle risorse} \label{sec:sys_res_limits} - Dopo aver esaminato in sez.~\ref{sec:sys_management} le funzioni che permettono di controllare le varie caratteristiche, capacità e limiti del sistema a livello globale, in questa sezione tratteremo le varie funzioni che @@ -1533,7 +1525,7 @@ sez.~\ref{sec:sys_unix_time}). I campi \var{ru\_minflt} e \var{ru\_majflt} servono a quantificare l'uso della memoria virtuale e corrispondono rispettivamente al numero di \textit{page fault} (vedi sez.~\ref{sec:proc_mem_gen}) avvenuti senza richiedere I/O su disco (i -cosiddetti \textit{minor page fault}), a quelli che invece han richiesto I/O +cosiddetti \textit{minor page fault}), e a quelli che invece han richiesto I/O su disco (detti invece \textit{major page fault}).% mentre \var{ru\_nswap} ed al numero di volte che % il processo è stato completamente tolto dalla memoria per essere inserito @@ -1635,13 +1627,13 @@ limite corrente e limite massimo. \label{fig:sys_rlimit_struct} \end{figure} -Come accennato processo ordinario può alzare il proprio limite corrente fino -al valore del limite massimo, può anche ridurre, irreversibilmente, il valore -di quest'ultimo. Nello specificare un limite, oltre a fornire dei valori -specifici, si può anche usare la costante \const{RLIM\_INFINITY} che permette -di sbloccare completamente l'uso di una risorsa. Si ricordi però che solo un -processo con i privilegi di amministratore\footnote{per essere precisi in - questo caso quello che serve è la \textit{capability} +Come accennato un processo ordinario può alzare il proprio limite corrente +fino al valore del limite massimo, e può anche ridurre, irreversibilmente, il +valore di quest'ultimo. Nello specificare un limite, oltre a fornire dei +valori specifici, si può anche usare la costante \const{RLIM\_INFINITY} che +permette di sbloccare completamente l'uso di una risorsa. Si ricordi però che +solo un processo con i privilegi di amministratore\footnote{per essere precisi + in questo caso quello che serve è la \textit{capability} \const{CAP\_SYS\_RESOURCE} (vedi sez.~\ref{sec:proc_capabilities}).} può innalzare un limite al di sopra del valore corrente del limite massimo ed usare un valore qualsiasi per entrambi i limiti. @@ -1650,7 +1642,7 @@ Ciascuna risorsa su cui si possono applicare dei limiti è identificata da uno specifico valore dell'argomento \param{resource}, i valori possibili per questo argomento, ed il significato della risorsa corrispondente, dei rispettivi limiti e gli effetti causati dal superamento degli stessi sono -riportati nel seguente elenco: +riportati nel seguente elenco. \begin{basedescript}{\desclabelwidth{2.2cm}}%\desclabelstyle{\nextlinelabel}} \item[\constd{RLIMIT\_AS}] Questa risorsa indica, in byte, la dimensione @@ -1690,8 +1682,8 @@ riportati nel seguente elenco: dimensione del segmento dati di un processo (vedi sez.~\ref{sec:proc_mem_layout}). Il tentativo di allocare più memoria di quanto indicato dal limite corrente causa il fallimento della funzione di - allocazione eseguita (\func{brk} o \func{sbrk}) con un errore di - \errcode{ENOMEM}. + allocazione eseguita (\func{brk} o \func{sbrk} e dal kernel 4.7 anche + \func{mmap}) con un errore di \errcode{ENOMEM}. \item[\constd{RLIMIT\_FSIZE}] Questa risorsa indica, in byte, la massima dimensione di un file che un processo può usare. Se il processo cerca di @@ -1749,6 +1741,13 @@ messaggi vuoti che comunque richiede delle risorse di gestione. Questa risorsa descriptor farà fallire la funzione (\func{open}, \func{dup}, \func{pipe}, ecc.) con un errore \errcode{EMFILE}. + % TODO: aggiungere Dal 4.5 definisce anche il limite sul numero massimo di + % file descriptor che un processo non privilegiato (senza la capacità + % \const{CAP\_SYS\_RESOURCE}, vedi sez.~\ref{sec:proc_capabilities}) può + % avere in corso di trasmissione verso altri + % processi usando i socket Unix-domain (vedi sez.XXX), il limite si applica + % si applica a \func{sendmsg}. + \item[\constd{RLIMIT\_NPROC}] Questa risorsa indica il numero massimo di processi che possono essere creati dallo stesso utente, che viene identificato con l'\ids{UID} reale (vedi sez.~\ref{sec:proc_access_id}) del @@ -1818,12 +1817,12 @@ Si noti come le due funzioni \func{getrlimit} e \func{setrlimit} consentano di operare solo sul processo corrente. Per questo motivo a partire dal kernel 2.6.36 (e dalla \acr{glibc} 2.13) è stata introdotta un'altra funzione di sistema \funcd{prlimit} il cui scopo è quello di estendere e sostituire le -precedenti. Il suo prototipo è: +precedenti; il suo prototipo è: \begin{funcproto}{ \fhead{sys/resource.h} \fdecl{int prlimit(pid\_t pid, int resource, const struct rlimit *new\_limit,\\ -\phantom{int prlimit(}struct rlimit *old\_limit} +\phantom{int prlimit(}struct rlimit *old\_limit)} \fdesc{Legge e imposta i limiti di una risorsa.} } @@ -1842,7 +1841,7 @@ precedenti. Il suo prototipo è: } \end{funcproto} -La funzione è specifica di Linux e non portabile; per essere usata richiede +La funzione è specifica di Linux e non portabile, per essere usata richiede che sia stata definita la macro \macro{\_GNU\_SOURCE}. Il primo argomento indica il \ids{PID} del processo di cui si vogliono cambiare i limiti e si può usare un valore nullo per indicare il processo chiamante. Per modificare i @@ -1861,6 +1860,8 @@ possibile sia leggere che scrivere, anche in contemporanea, i valori dei limiti. Il significato dell'argomento \param{resource} resta identico rispetto a \func{getrlimit} e \func{setrlimit}, così come i restanti requisiti. +% TODO: a bassa priorità, documentare i vari problemi e cambiamenti nella +% implementazione di queste funzioni dettagliati nella pagina di manuale \subsection{Le informazioni sulle risorse di memoria e processore} \label{sec:sys_memory_res} @@ -1946,8 +1947,8 @@ attivi); anche queste sono informazioni comunque ottenibili attraverso Infine la \acr{glibc} riprende da BSD la funzione \funcd{getloadavg} che permette di ottenere il carico di processore della macchina, in questo modo è -possibile prendere decisioni su quando far partire eventuali nuovi processi. -Il suo prototipo è: +possibile prendere decisioni su quando far partire eventuali nuovi processi, +il suo prototipo è: \begin{funcproto}{ \fhead{stdlib.h} @@ -2006,7 +2007,7 @@ prototipo è: \end{funcproto} La funzione attiva il salvataggio dei dati sul file indicato dal -\textit{pathname} contenuti nella stringa puntata da \param{filename}; la +\textit{pathname} contenuto nella stringa puntata da \param{filename}; la funzione richiede che il processo abbia i privilegi di amministratore (è necessaria la \textit{capability} \const{CAP\_SYS\_PACCT}, vedi sez.~\ref{sec:proc_capabilities}). Se si specifica il valore \val{NULL} per @@ -2333,10 +2334,12 @@ primi 41 secondi) e se il valore del contatore eccede le dimensione del tipo Come anticipato in sez.~\ref{sec:sys_unix_time} il \textit{calendar time} viene espresso normalmente con una variabile di tipo \type{time\_t}, che usualmente corrisponde ad un tipo elementare; in Linux è definito come -\ctyp{long int}, che di norma corrisponde a 32 bit. Il valore corrente del -\textit{calendar time}, che indicheremo come \textsl{tempo di sistema}, può -essere ottenuto con la funzione \funcd{time} che lo restituisce nel suddetto -formato, il suo prototipo è: +\ctyp{long int}, che di norma corrisponde a 32 bit, cosa che pone un limite al +valore massimo esprimibile al 19 gennaio 2038, per ovviare alla cosa nelle +versioni più recenti viene usato un valore di dimensioni maggiori. Il valore +corrente del \textit{calendar time}, che indicheremo come \textsl{tempo di + sistema}, può essere ottenuto con la funzione \funcd{time} che lo +restituisce nel suddetto formato, il suo prototipo è: \begin{funcproto}{ \fhead{time.h} @@ -2350,7 +2353,9 @@ formato, il suo prototipo è: \end{funcproto} L'argomento \param{t}, se non nullo, deve essere l'indirizzo di una variabile -su cui duplicare il valore di ritorno. +su cui duplicare il valore di ritorno, ma il suo uso è considerato obsoleto e +deve essere sempre specificato come \val{NULL}, nel qual caso la funzione non +può fallire. Analoga a \func{time} è la funzione \funcd{stime} che serve per effettuare l'operazione inversa, e cioè per impostare il tempo di sistema qualora questo @@ -2374,14 +2379,15 @@ sia necessario; il suo prototipo è: Dato che modificare l'ora ha un impatto su tutto il sistema il cambiamento dell'orologio è una operazione privilegiata e questa funzione può essere usata solo da un processo con i privilegi di amministratore (per la precisione la -\textit{capability} \const{CAP\_SYS\_TIME}), altrimenti la chiamata fallirà -con un errore di \errcode{EPERM}. +\textit{capability} \const{CAP\_SYS\_TIME}, vedi +sez.~\ref{sec:proc_capabilities}), altrimenti la chiamata fallirà con un +errore di \errcode{EPERM}. Data la scarsa precisione nell'uso di \type{time\_t}, che ha una risoluzione -massima di un secondo, quando si devono effettuare operazioni sui tempi di -norma l'uso delle due funzioni precedenti è sconsigliato, ed esse sono di -solito sostituite da \funcd{gettimeofday} e \funcd{settimeofday},\footnote{le - due funzioni \func{time} e \func{stime} sono più antiche e derivano da SVr4, +di un secondo, quando si devono effettuare operazioni sui tempi l'uso delle +due funzioni precedenti è sconsigliato, ed esse sono di solito sostituite da +\funcd{gettimeofday} e \funcd{settimeofday},\footnote{le due funzioni + \func{time} e \func{stime} sono più antiche e derivano da SVr4, \func{gettimeofday} e \func{settimeofday} sono state introdotte da BSD, ed in BSD4.3 sono indicate come sostitute delle precedenti, \func{gettimeofday} viene descritta anche in POSIX.1-2001.} i cui prototipi sono: @@ -2455,7 +2461,6 @@ usare la funzione \funcd{adjtime}, il cui prototipo è: } \end{funcproto} - Questa funzione permette di avere un aggiustamento graduale del tempo di sistema in modo che esso sia sempre crescente in maniera monotona. Il valore indicato nella struttura \struct{timeval} puntata da \param{delta} esprime il @@ -2531,9 +2536,10 @@ delle costanti elencate in tab.~\ref{tab:adjtimex_return}. La funzione richiede come argomento il puntatore ad una struttura di tipo \struct{timex}, la cui definizione, effettuata in \headfiled{sys/timex.h}, è riportata in fig.~\ref{fig:sys_timex_struct} per i campi che interessano la -possibilità di essere modificati documentati anche nella pagina di manuale. In -realtà la struttura è stata estesa con ulteriori campi, i cui valori sono -utilizzabili solo in lettura, la cui definizione si può trovare direttamente +possibilità di essere modificati. In realtà la struttura è stata estesa con +ulteriori campi, i cui valori sono utilizzabili solo in lettura, non riportati +in fig.~\ref{fig:sys_timex_struct}, i dettagli di questi campi si possono +recuperare dalla pagina di manuale di \func{adjtimex}. \begin{figure}[!htb] \footnotesize \centering @@ -2556,46 +2562,46 @@ riportate in tab.~\ref{tab:sys_timex_mode}. \begin{table}[!htb] \footnotesize \centering - \begin{tabular}[c]{|l|c|p{8cm}|} + \begin{tabular}[c]{|l|p{8cm}|} \hline - \textbf{Nome} & \textbf{Valore} & \textbf{Significato}\\ + \textbf{Nome} & \textbf{Significato}\\ \hline \hline - \constd{ADJ\_OFFSET} & 0x0001 & Imposta la differenza fra il tempo - reale e l'orologio di sistema: - deve essere indicata in microsecondi - nel campo \var{offset} di - \struct{timex}.\\ - \constd{ADJ\_FREQUENCY} & 0x0002 & Imposta la differenza in frequenza - fra il tempo reale e l'orologio di - sistema: deve essere indicata - in parti per milione nel campo - \var{frequency} di \struct{timex}.\\ - \constd{ADJ\_MAXERROR} & 0x0004 & Imposta il valore massimo - dell'errore sul tempo, espresso in - microsecondi nel campo - \var{maxerror} di \struct{timex}.\\ - \constd{ADJ\_ESTERROR} & 0x0008 & Imposta la stima dell'errore - sul tempo, espresso in microsecondi - nel campo \var{esterror} di - \struct{timex}.\\ - \constd{ADJ\_STATUS} & 0x0010 & Imposta alcuni valori di stato - interni usati dal - sistema nella gestione - dell'orologio specificati nel campo - \var{status} di \struct{timex}.\\ - \constd{ADJ\_TIMECONST} & 0x0020 & Imposta la larghezza di banda del - PLL implementato dal kernel, - specificato nel campo - \var{constant} di \struct{timex}.\\ - \constd{ADJ\_TICK} & 0x4000 & Imposta il valore dei \textit{tick} - del timer in - microsecondi, espresso nel campo - \var{tick} di \struct{timex}.\\ - \constd{ADJ\_OFFSET\_SINGLESHOT}&0x8001&Chiede uno spostamento una tantum - dell'orologio secondo il valore del - campo \var{offset} simulando il - comportamento di \func{adjtime}.\\ + \constd{ADJ\_OFFSET} & Imposta la differenza fra il tempo + reale e l'orologio di sistema: + deve essere indicata in microsecondi + nel campo \var{offset} di + \struct{timex}.\\ + \constd{ADJ\_FREQUENCY} & Imposta la differenza in frequenza + fra il tempo reale e l'orologio di + sistema: deve essere indicata + in parti per milione nel campo + \var{frequency} di \struct{timex}.\\ + \constd{ADJ\_MAXERROR} & Imposta il valore massimo + dell'errore sul tempo, espresso in + microsecondi nel campo + \var{maxerror} di \struct{timex}.\\ + \constd{ADJ\_ESTERROR} & Imposta la stima dell'errore + sul tempo, espresso in microsecondi + nel campo \var{esterror} di + \struct{timex}.\\ + \constd{ADJ\_STATUS} & Imposta alcuni valori di stato + interni usati dal + sistema nella gestione + dell'orologio specificati nel campo + \var{status} di \struct{timex}.\\ + \constd{ADJ\_TIMECONST} & Imposta la larghezza di banda del + PLL implementato dal kernel, + specificato nel campo + \var{constant} di \struct{timex}.\\ + \constd{ADJ\_TICK} & Imposta il valore dei \textit{tick} + del timer in + microsecondi, espresso nel campo + \var{tick} di \struct{timex}.\\ + \constd{ADJ\_OFFSET\_SINGLESHOT}&Chiede uno spostamento una tantum + dell'orologio secondo il valore del + campo \var{offset} simulando il + comportamento di \func{adjtime}.\\ \hline \end{tabular} \caption{Costanti per l'assegnazione del valore del campo \var{mode} della @@ -2668,7 +2674,7 @@ dell'orologio per effettuare gli aggiustamenti del calendario per tenere conto del disallineamento con il tempo solare.\footnote{per dettagli si consulti \url{http://it.wikipedia.org/wiki/Leap_second}.} -I campi \var{tm\_min} e\var{tm\_hour} che indicano rispettivamente minuti ed +I campi \var{tm\_min} e \var{tm\_hour} che indicano rispettivamente minuti ed ore hanno valori compresi rispettivamente fra 0 e 59 e fra 0 e 23. Il campo \var{tm\_mday} che indica il giorno del mese prevede invece un valore compreso fra 1 e 31, ma la \acr{glibc} supporta pure il valore 0 come indicazione @@ -2716,7 +2722,7 @@ Nel caso di \func{ctime} la funzione tiene conto della eventuale impostazione di una \textit{timezone} e effettua una chiamata preventiva a \func{tzset} (che vedremo a breve), in modo che la data espressa tenga conto del fuso orario. In realtà \func{ctime} è banalmente definita in termini di -\func{asctime} come \code{asctime(localtime(t)}. +\func{asctime} come \code{asctime(localtime(t))}. Dato che l'uso di una stringa statica rende le funzioni non rientranti POSIX.1c e SUSv2 prevedono due sostitute rientranti, il cui nome è al solito @@ -2762,40 +2768,30 @@ preallocare la struttura su cui sarà restituita la conversione. La versione rientrante di \func{localtime} però non effettua la chiamata preventiva a \func{tzset} che deve essere eseguita a cura dell'utente. -Infine \func{mktime} esegue la conversione di un \textit{broken-down time} a -partire da una struttura \struct{tm} restituendo direttamente un valore di -tipo \type{time\_t} con il \textit{calendar time}. La funzione ignora i campi -\var{tm\_wday} e \var{tm\_yday} e per gli altri campi normalizza eventuali -valori fuori degli intervalli specificati in precedenza: se cioè si indica un -12 per \var{tm\_mon} si prenderà il gennaio dell'anno successivo. Inoltre la -funzione tiene conto del valore di \var{tm\_isdst} per effettuare le -correzioni relative al fuso orario: un valore positivo indica che deve essere -tenuta in conto l'ora legale, un valore nullo che non deve essere applicata -nessuna correzione, un valore negativo che si deve far ricorso alle +La funzione \func{mktime} esegue invece la conversione di un +\textit{broken-down time} a partire da una struttura \struct{tm} restituendo +direttamente un valore di tipo \type{time\_t} con il \textit{calendar + time}. La funzione ignora i campi \var{tm\_wday} e \var{tm\_yday} e per gli +altri campi normalizza eventuali valori fuori degli intervalli specificati in +precedenza: se cioè si indica un 12 per \var{tm\_mon} si prenderà il gennaio +dell'anno successivo. + +Inoltre la funzione tiene conto del valore di \var{tm\_isdst} per effettuare +le correzioni relative al fuso orario: un valore positivo indica che deve +essere tenuta in conto l'ora legale, un valore nullo che non deve essere +applicata nessuna correzione, un valore negativo che si deve far ricorso alle informazioni relative al proprio fuso orario per determinare lo stato dell'ora -legale. +legale. -La funzione inoltre modifica i valori della struttura \struct{tm} in forma di +La funzione infine modifica i valori della struttura \struct{tm} in forma di \textit{value result argument}, normalizzando i valori dei vari campi, impostando i valori risultanti per \var{tm\_wday} e \var{tm\_yday} e assegnando a \var{tm\_isdst} il valore (positivo o nullo) corrispondente allo -stato dell'ora legale. La funzione inoltre provvede ad impostare il valore -della variabile globale \var{tzname}. +stato dell'ora legale. La funzione provvede anche ad impostare il valore della +variabile globale \var{tzname}. \itindend{calendar~time} -\begin{figure}[!htb] - \footnotesize - \centering - \begin{minipage}[c]{.75\textwidth} - \includestruct{listati/time_zone_var.c} - \end{minipage} - \normalsize - \caption{Le variabili globali usate per la gestione delle - \textit{timezone}.} - \label{fig:sys_tzname} -\end{figure} - Come accennato l'uso del \textit{broken-down time} permette di tenere conto anche della differenza fra tempo universale e ora locale, compresa l'eventuale ora legale. Questo viene fatto dalle funzioni di conversione grazie alle @@ -2825,6 +2821,18 @@ per l'ora legale. Anche se in fig.~\ref{fig:sys_tzname} sono indicate come \var{timezone} indica la differenza di fuso orario in secondi, mentre \var{daylight} indica se è attiva o meno l'ora legale. +\begin{figure}[!htb] + \footnotesize + \centering + \begin{minipage}[c]{.75\textwidth} + \includestruct{listati/time_zone_var.c} + \end{minipage} + \normalsize + \caption{Le variabili globali usate per la gestione delle + \textit{timezone}.} + \label{fig:sys_tzname} +\end{figure} + Benché la funzione \func{asctime} fornisca la modalità più immediata per stampare un tempo o una data, la flessibilità non fa parte delle sue caratteristiche; quando si vuole poter stampare solo una parte (l'ora, o il @@ -2895,8 +2903,8 @@ Il risultato della funzione è controllato dalla stringa di formato \param{format}, tutti i caratteri restano invariati eccetto \texttt{\%} che viene utilizzato come modificatore. Alcuni dei possibili valori che esso può assumere sono riportati in tab.~\ref{tab:sys_strftime_format}.\footnote{per la - precisione si sono riportati definiti dallo standard ANSI C, che sono anche - quelli ripresi in POSIX.1; la \acr{glibc} fornisce anche le estensioni + precisione si sono riportati quelli definiti dallo standard ANSI C che sono + anche quelli ripresi in POSIX.1; la \acr{glibc} fornisce anche le estensioni introdotte da POSIX.2 per il comando \cmd{date}, i valori introdotti da SVID3 e ulteriori estensioni GNU; l'elenco completo dei possibili valori è riportato nella pagina di manuale della funzione.} La funzione tiene conto @@ -2932,7 +2940,7 @@ questo riguardo si rimanda alla lettura della pagina di manuale. Si tenga presente comunque che anche in caso di scansione completamente riuscita la funzione sovrascrive soltanto i campi di \param{tm} indicati dal -formato, la struttura originaria infatti non viene inizializzati e gli altri +formato, la struttura originaria infatti non viene inizializzata e gli altri campi restano ai valori che avevano in precedenza. @@ -2974,9 +2982,9 @@ questo è infatti il metodo usato da Linux per renderla locale ai singoli \textit{thread}. La variabile è in genere definita come \dirct{volatile} dato che può essere -cambiata in modo asincrono da un segnale, per un esempio si veda +cambiata in modo asincrono da un segnale; per un esempio si veda sez.~\ref{sec:sig_sigchld} ricordando quanto trattato in -sez.~\ref{sec:proc_race_cond}). Dato che un gestore di segnale scritto bene si +sez.~\ref{sec:proc_race_cond}. Dato che un gestore di segnale scritto bene si cura di salvare e ripristinare il valore della variabile all'uscita, nella programmazione normale, quando si può fare l'assunzione che i gestori di segnali siano ben scritti, di questo non è necessario preoccuparsi. @@ -3104,7 +3112,9 @@ variabili globali: dichiarate in \headfile{errno.h}. La prima contiene i puntatori alle stringhe di errore indicizzati da \var{errno}; la seconda esprime il valore più alto per un codice di errore, l'utilizzo di una di queste stringhe è -sostanzialmente equivalente a quello di \func{strerror}. +sostanzialmente equivalente a quello di \func{strerror}, ma dato che non è +detto che \var{sys\_errlist} sia stato aggiornato in caso di aggiunta di nuovi +errori, il suo uso è deprecato e si deve sempre usare \func{perror}. \begin{figure}[!htbp] \footnotesize \centering @@ -3270,7 +3280,7 @@ che errori relativi alla stessa linea non vengano ripetuti. % LocalWords: memory mlockall MAP LOCKED shmctl MSGQUEUE attr NICE nice MADV % LocalWords: madvise WILLNEED RTPRIO sched setscheduler setparam scheduling % LocalWords: RTTIME execve kb prlimit pid new old ESRCH EUSERS refresh high -% LocalWords: resolution HRT jiffies strptime +% LocalWords: resolution HRT jiffies strptime pre l'I value argument %%% Local Variables: %%% mode: latex