Valore massimo del tipo di dato
\type{ssize\_t}.\\
\texttt{\_SC\_CLK\_TCK} & \const{CLK\_TCK} &
- Il numero di \itindex{clock~tick}
- \textit{clock tick} al secondo,
+ Il numero di \textit{clock tick} al secondo,
cioè l'unità di misura del
- \itindex{process~time} \textit{process
- time} (vedi
+ \textit{process time} (vedi
sez.~\ref{sec:sys_unix_time}).\\
\texttt{\_SC\_JOB\_CONTROL}&\macro{\_POSIX\_JOB\_CONTROL}&
Indica se è supportato il \textit{job
\const{LINK\_MAX} &8 & Numero massimo di link a un file.\\
\const{NAME\_MAX}& 14 & Lunghezza in byte di un nome di file. \\
\const{PATH\_MAX}& 256 & Lunghezza in byte di un \textit{pathname}.\\
- \const{PIPE\_BUF}&4096 & Byte scrivibili atomicamente in una pipe
+ \const{PIPE\_BUF}&4096 & Byte scrivibili atomicamente in una \textit{pipe}
(vedi sez.~\ref{sec:ipc_pipes}).\\
\const{MAX\_CANON}&255 & Dimensione di una riga di terminale in modo
canonico (vedi sez.~\ref{sec:term_io_design}).\\
\const{\_POSIX\_PATH\_MAX}& 256 & Lunghezza in byte di un
\textit{pathname}.\\
\const{\_POSIX\_PIPE\_BUF}& 512 & Byte scrivibili atomicamente in una
- pipe.\\
+ \textit{pipe}.\\
\const{\_POSIX\_MAX\_CANON}&255 & Dimensione di una riga di
terminale in modo canonico.\\
\const{\_POSIX\_MAX\_INPUT}&255 & Spazio disponibile nella coda di input
provocato. A questo comportamento generico fanno eccezione \const{RLIMIT\_CPU}
in cui si ha in comportamento diverso per il superamento dei due limiti e
\const{RLIMIT\_CORE} che influenza soltanto la dimensione o l'eventuale
-creazione dei file di \itindex{core~dump} \textit{core dump} (vedi
-sez.~\ref{sec:sig_standard}).
+creazione dei file di \textit{core dump} (vedi sez.~\ref{sec:sig_standard}).
Per permettere di leggere e di impostare i limiti di utilizzo delle risorse da
parte di un processo sono previste due funzioni di sistema, \funcd{getrlimit}
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 \itindex{capabilities} \textit{capability}
+ 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.
\textit{Address Space}, (vedi sez.~\ref{sec:proc_mem_gen}). Se il limite
viene superato dall'uso di funzioni come \func{brk}, \func{mremap} o
\func{mmap} esse falliranno con un errore di \errcode{ENOMEM}, mentre se il
- superamento viene causato dalla crescita dello \itindex{stack}
- \textit{stack} il processo riceverà un segnale di \signal{SIGSEGV}. Dato che
- il valore usato è un intero di tipo \ctyp{long} nelle macchine a 32 bit
- questo può assumere un valore massimo di 2Gb (anche se la memoria
- disponibile può essere maggiore), in tal caso il limite massimo indicabile
- resta 2Gb, altrimenti la risorsa si dà per non limitata.
+ superamento viene causato dalla crescita dello \textit{stack} il processo
+ riceverà un segnale di \signal{SIGSEGV}. Dato che il valore usato è un
+ intero di tipo \ctyp{long} nelle macchine a 32 bit questo può assumere un
+ valore massimo di 2Gb (anche se la memoria disponibile può essere maggiore),
+ in tal caso il limite massimo indicabile resta 2Gb, altrimenti la risorsa si
+ dà per non limitata.
\item[\const{RLIMIT\_CORE}] Questa risorsa indica, in byte, la massima
- dimensione per un file di \itindex{core~dump} \textit{core dump} (vedi
+ dimensione per un file di \textit{core dump} (vedi
sez.~\ref{sec:sig_standard}) creato nella terminazione di un processo. File
di dimensioni maggiori verranno troncati a questo valore, mentre con un
- valore nullo si bloccherà la creazione dei \itindex{core~dump} \textit{core
- dump}.
+ valore nullo si bloccherà la creazione dei \textit{core dump}.
\item[\const{RLIMIT\_CPU}] Questa risorsa indica, in secondi, il massimo tempo
di CPU (vedi sez.~\ref{sec:sys_cpu_times}) che il processo può usare. Il
introdotto con il kernel 2.6.8.
\item[\const{RLIMIT\_STACK}] Questa risorsa indica, in byte, la massima
- dimensione dello \itindex{stack} \textit{stack} del processo. Se il processo
- esegue operazioni che estendano lo \textit{stack} oltre questa dimensione
- riceverà un segnale di \signal{SIGSEGV}.
+ dimensione dello \textit{stack} del processo. Se il processo esegue
+ operazioni che estendano lo \textit{stack} oltre questa dimensione riceverà
+ un segnale di \signal{SIGSEGV}.
A partire dal kernel 2.6.23 questo stesso limite viene applicato per la gran
parte delle architetture anche ai dati che possono essere passati come
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
limiti di un altro processo, a meno di non avere privilegi
-amministrativi,\footnote{anche in questo caso la \itindex{capabilities}
- \textit{capability} necessaria è \const{CAP\_SYS\_RESOURCE} (vedi
+amministrativi,\footnote{anche in questo caso la \textit{capability}
+ necessaria è \const{CAP\_SYS\_RESOURCE} (vedi
sez.~\ref{sec:proc_capabilities}).} l'\ids{UID} ed il \ids{GID} reale del
chiamante devono coincidere con \ids{UID} e \ids{GID} del processo indicato
per i tre gruppi reale, effettivo e salvato.
La funzione attiva il salvataggio dei dati sul file indicato dal
\textit{pathname} contenuti nella stringa puntata da \param{filename}; la
funzione richiede che il processo abbia i privilegi di amministratore (è
-necessaria la \itindex{capabilities} capability \const{CAP\_SYS\_PACCT}, vedi
+necessaria la \textit{capability} \const{CAP\_SYS\_PACCT}, vedi
sez.~\ref{sec:proc_capabilities}). Se si specifica il valore \val{NULL} per
\param{filename} il \textit{BSD accounting} viene invece disabilitato. Un
semplice esempio per l'uso di questa funzione è riportato nel programma
\subsection{La misura del tempo in Unix}
\label{sec:sys_unix_time}
+\itindbeg{calendar~time}
+
Tradizionalmente nei sistemi unix-like sono sempre stati previsti due tipi
distinti di tempi, caratterizzati da altrettante modalità di misura ed
espressi con diversi tipi di dati, chiamati rispettivamente \textit{calendar
time} e \textit{process time}, secondo le seguenti definizioni:
\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
-\item[\textit{calendar time}] \itindex{calendar~time} detto anche
- \textsl{tempo di calendario}, \textsl{tempo d'orologio} o \textit{tempo
- reale}. Si tratta di un tempo assoluto o di un intervallo di tempo come lo
- intende normalmente per le misure fatte con un orologio. Per esprimere
+\item[\textit{calendar time}] detto anche \textsl{tempo di calendario},
+ \textsl{tempo d'orologio} o \textit{tempo reale}. Si tratta di un
+ tempo assoluto o di un intervallo di tempo come lo intende
+ normalmente per le misure fatte con un orologio. Per esprimere
questo tempo è stato riservato il tipo \type{time\_t}, e viene
- tradizionalmente misurato in secondi a partire dalla mezzanotte del primo
- gennaio 1970, data che viene chiamata \textit{the Epoch}.
+ tradizionalmente misurato in secondi a partire dalla mezzanotte del
+ primo gennaio 1970, data che viene chiamata \textit{the Epoch}.
\item[\textit{process time}] \itindex{process~time} detto anche \textsl{tempo
di processore} o \textsl{tempo di CPU}. Si tratta del tempo impiegato da
precedente indica soltanto un intervallo di durata.
\end{basedescript}
-Il \itindex{calendar~time} \textit{calendar time} viene sempre mantenuto
-facendo riferimento al cosiddetto \textit{tempo universale coordinato} UTC,
-anche se talvolta viene usato il cosiddetto GMT (\textit{Greenwich Mean Time})
-dato che l'UTC corrisponde all'ora locale di Greenwich. Si tratta del tempo su
-cui viene mantenuto il cosiddetto \textsl{orologio di sistema}, e viene usato
-per indicare i tempi dei file (quelli di sez.~\ref{sec:file_file_times}) o le
-date di avvio dei processi, ed è il tempo che viene usato dai demoni che
-compiono lavori amministrativi ad orari definito, come \cmd{cron}.
+Il \textit{calendar time} viene sempre mantenuto facendo riferimento
+al cosiddetto \textit{tempo universale coordinato} UTC, anche se
+talvolta viene usato il cosiddetto GMT (\textit{Greenwich Mean Time})
+dato che l'UTC corrisponde all'ora locale di Greenwich. Si tratta del
+tempo su cui viene mantenuto il cosiddetto \textsl{orologio di
+ sistema}, e viene usato per indicare i tempi dei file (quelli di
+sez.~\ref{sec:file_file_times}) o le date di avvio dei processi, ed è
+il tempo che viene usato dai demoni che compiono lavori amministrativi
+ad orari definito, come \cmd{cron}.
Si tenga presente che questo tempo è mantenuto dal kernel e non è detto che
corrisponda al tempo misurato dall'orologio hardware presente su praticamente
di sistema misuri sempre un tempo monotono crescente come nella realtà, anche
in presenza di cambi di fusi orari.
+\itindend{calendar~time}
+
Il \itindex{process~time} \textit{process time} invece indica sempre una
misura di un lasso di tempo e viene usato per tenere conto dei tempi di
esecuzione dei processi. Esso viene sempre diviso in \textit{user time} e
\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
\item[\textit{clock time}] il tempo \textsl{reale}, viene chiamato anche
\textit{wall clock time} o \textit{elapsed time}, passato dall'avvio del
- processo. Questo tempo fa riferimento al \itindex{calendar~time}
+ processo. Questo tempo fa riferimento al
\textit{calendar time} e dice la durata effettiva dell'esecuzione del
processo, ma chiaramente dipende dal carico del sistema e da quanti altri
processi stanno girando nello stesso momento.
\end{basedescript}
La somma di \textit{user time} e \textit{system time} indica il
-\itindex{process~time} \textit{process time}, vale a dire il tempo di
-processore totale che il sistema ha effettivamente utilizzato per eseguire il
-programma di un certo processo. Si può ottenere un riassunto dei valori di
-questi tempi quando si esegue un qualsiasi programma lanciando quest'ultimo
-come argomento del comando \cmd{time}.
-
-Come accennato il \itindex{process~time} \textit{process time} viene misurato
-nei cosiddetti \itindex{clock~tick} \textit{clock tick}. Un tempo questo
-corrispondeva al numero di interruzioni effettuate dal timer di sistema, oggi
-lo standard POSIX richiede che esso sia espresso come multiplo della costante
-\const{CLOCKS\_PER\_SEC} che deve essere definita come 1000000, qualunque sia
-la risoluzione reale dell'orologio di sistema e la frequenza delle
-interruzioni del timer che, come accennato in sez.~\ref{sec:proc_hierarchy} e
-come vedremo a breve, è invece data dalla costante \const{HZ}.
+\textit{process time}, vale a dire il tempo di processore totale che il
+sistema ha effettivamente utilizzato per eseguire il programma di un certo
+processo. Si può ottenere un riassunto dei valori di questi tempi quando si
+esegue un qualsiasi programma lanciando quest'ultimo come argomento del
+comando \cmd{time}.
+
+\itindbeg{clock~tick}
+
+Come accennato il \textit{process time} viene misurato nei cosiddetti
+\textit{clock tick}. Un tempo questo corrispondeva al numero di interruzioni
+effettuate dal timer di sistema, oggi lo standard POSIX richiede che esso sia
+espresso come multiplo della costante \const{CLOCKS\_PER\_SEC} che deve essere
+definita come 1000000, qualunque sia la risoluzione reale dell'orologio di
+sistema e la frequenza delle interruzioni del timer che, come accennato in
+sez.~\ref{sec:proc_hierarchy} e come vedremo a breve, è invece data dalla
+costante \const{HZ}.
Il tipo di dato usato per questo tempo, \type{clock\_t}, con questa
convenzione ha una risoluzione del microsecondo. Ma non tutte le funzioni di
sistema come vedremo seguono questa convenzione, in tal caso il numero di
-\itindex{clock~tick} \textit{clock tick} al secondo può essere ricavato anche
-attraverso \func{sysconf} richiedendo il valore della costante
-\const{\_SC\_CLK\_TCK} (vedi sez.~\ref{sec:sys_limits}). Il vecchio simbolo
-\const{CLK\_TCK} definito in \headfile{time.h} è ormai considerato obsoleto e
-non deve essere usato.
+\textit{clock tick} al secondo può essere ricavato anche attraverso
+\func{sysconf} richiedendo il valore della costante \const{\_SC\_CLK\_TCK}
+(vedi sez.~\ref{sec:sys_limits}). Il vecchio simbolo \const{CLK\_TCK}
+definito in \headfile{time.h} è ormai considerato obsoleto e non deve essere
+usato.
In realtà tutti calcoli dei tempi vengono effettuati dal kernel per il
cosiddetto \textit{software clock}, utilizzando il \textit{timer di sistema} e
compilazione del kernel, con un default di 250 e valori possibili di 100, 250,
1000. Dal 2.6.20 è stato aggiunto anche il valore 300 che è divisibile per le
frequenze di refresh della televisione (50 o 60 Hz). Si può pensare che questi
-valori determinino anche la corrispondente durata dei \itindex{clock~tick}
-\textit{clock tick}, ma in realtà questa granularità viene calcolata in
-maniera indipendente usando la costante del kernel \const{USER\_HZ}.
+valori determinino anche la corrispondente durata dei \textit{clock tick}, ma
+in realtà questa granularità viene calcolata in maniera indipendente usando la
+costante del kernel \const{USER\_HZ}.
Fino al kernel 2.6.21 la durata di un \textit{jiffy} costituiva la risoluzione
massima ottenibile nella misura dei tempi impiegabile in una \textit{system
risoluzione possibile fornita dall'hardware. Torneremo su questo in
sez.~\ref{sec:sig_timer_adv}.
+\itindend{clock~tick}
\subsection{La gestione del \textit{process time}}
\itindbeg{process~time}
Di norma tutte le operazioni del sistema fanno sempre riferimento al
-\itindex{calendar~time} \textit{calendar time}, l'uso del \textit{process
- time} è riservato a quei casi in cui serve conoscere i tempi di esecuzione
-di un processo (ad esempio per valutarne l'efficienza). In tal caso infatti
-fare ricorso al \textit{calendar time} è inutile in quanto il tempo può essere
-trascorso mentre un altro processo era in esecuzione o in attesa del risultato
-di una operazione di I/O.
+\textit{calendar time}, l'uso del \textit{process time} è riservato a
+quei casi in cui serve conoscere i tempi di esecuzione di un processo
+(ad esempio per valutarne l'efficienza). In tal caso infatti fare
+ricorso al \textit{calendar time} è inutile in quanto il tempo può
+essere trascorso mentre un altro processo era in esecuzione o in
+attesa del risultato di una operazione di I/O.
La funzione più semplice per leggere il \textit{process time} di un processo è
\funcd{clock}, che da una valutazione approssimativa del tempo di CPU
\var{errno} non viene usata.}
\end{funcproto}
-La funzione restituisce il tempo in \itindex{clock~tick} \textit{clock tick}
-ma la \acr{glibc} segue lo standard POSIX e quindi se si vuole il tempo in
-secondi occorre dividere il risultato per la costante
-\const{CLOCKS\_PER\_SEC}. In genere \type{clock\_t} viene rappresentato come
-intero a 32 bit, il che comporta un valore massimo corrispondente a circa 72
-minuti, dopo i quali il contatore riprenderà lo stesso valore iniziale.
+La funzione restituisce il tempo in \textit{clock tick} ma la \acr{glibc}
+segue lo standard POSIX e quindi se si vuole il tempo in secondi occorre
+dividere il risultato per la costante \const{CLOCKS\_PER\_SEC}. In genere
+\type{clock\_t} viene rappresentato come intero a 32 bit, il che comporta un
+valore massimo corrispondente a circa 72 minuti, dopo i quali il contatore
+riprenderà lo stesso valore iniziale.
La funzione è presente anche nello standard ANSI C, ma in tal caso non è
previsto che il valore ritornato indichi un intervallo di tempo ma solo un
2.6.9.
A differenza di quanto avviene per \func{clock} i valori restituiti nei campi
-di una struttura \struct{tms} sono misurati in numero di \itindex{clock~tick}
+di una struttura \struct{tms} sono misurati in numero di
\textit{clock tick} effettivi e non in multipli di \const{CLOCKS\_PER\_SEC},
pertanto per ottenere il valore effettivo in secondi occorrerà dividere per il
risultato di \code{sysconf(\_SC\_CLK\_TCK)}.
momento dell'avvio del kernel. Con il kernel 2.6 si fa riferimento a
$2^{32}/\mathtt{HZ}-300$ secondi prima dell'avvio.
-Considerato che il numero dei \itindex{clock~tick} \textit{clock tick} per un
-kernel che è attivo da molto tempo può eccedere le dimensioni per il tipo
-\type{clock\_t} il comportamento più opportuno per i programmi è di ignorare
-comunque il valore di ritorno della funzione e ricorrere alle funzioni per il
-tempo di calendario del prossimo paragrafo qualora si voglia calcolare il
-tempo effettivamente trascorso dall'inizio del programma.
+Considerato che il numero dei \textit{clock tick} per un kernel che è attivo
+da molto tempo può eccedere le dimensioni per il tipo \type{clock\_t} il
+comportamento più opportuno per i programmi è di ignorare comunque il valore
+di ritorno della funzione e ricorrere alle funzioni per il tempo di calendario
+del prossimo paragrafo qualora si voglia calcolare il tempo effettivamente
+trascorso dall'inizio del programma.
Infine si tenga presente che per dei limiti nelle convenzioni per il ritorno
dei valori delle \textit{system call} su alcune architetture hardware (ed in
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 la
-\itindex{capabilities} capability \const{CAP\_SYS\_TIME}), altrimenti la
-chiamata fallirà con un errore di \errcode{EPERM}.
+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}.
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
Come nel caso di \func{stime} anche \func{settimeofday} può essere utilizzata
solo da un processo coi privilegi di amministratore e più precisamente con la
-\itindex{capability} capacità \const{CAP\_SYS\_TIME}. Si tratta comunque di
-una condizione generale che continua a valere per qualunque funzione che vada
-a modificare l'orologio di sistema, comprese tutte quelle che tratteremo in
-seguito.
+capacità \const{CAP\_SYS\_TIME}. Si tratta comunque di una condizione generale
+che continua a valere per qualunque funzione che vada a modificare l'orologio
+di sistema, comprese tutte quelle che tratteremo in seguito.
Il secondo argomento di entrambe le funzioni è una struttura
\struct{timezone}, che storicamente veniva utilizzata per specificare appunto
specificato nel campo
\var{constant} di \struct{timex}.\\
\const{ADJ\_TICK} & 0x4000 & Imposta il valore dei \textit{tick}
- \itindex{clock~tick} del timer in
+ del timer in
microsecondi, espresso nel campo
\var{tick} di \struct{timex}.\\
\const{ADJ\_OFFSET\_SINGLESHOT}&0x8001&Chiede uno spostamento una tantum