In particolare, come accennato in fig.~\ref{fig:file_flock_struct}, i
\textit{file lock} sono mantenuti in una \textit{linked list} di strutture
-\kstruct{file\_lock}. La lista è referenziata dall'indirizzo di partenza
+\kstructd{file\_lock}. La lista è referenziata dall'indirizzo di partenza
mantenuto dal campo \var{i\_flock} della struttura \kstruct{inode} (per le
definizioni esatte si faccia riferimento al file \file{include/linux/fs.h} nei
sorgenti del kernel). Un bit del campo \var{fl\_flags} di specifica se si
kernel. Lo schema delle strutture utilizzate è riportato in
fig.~\ref{fig:file_posix_lock}; come si vede esso è molto simile all'analogo
di fig.~\ref{fig:file_flock_struct}. In questo caso nella figura si sono
-evidenziati solo i campi di \kstruct{file\_lock} significativi per la
+evidenziati solo i campi di \kstructd{file\_lock} significativi per la
semantica POSIX, in particolare adesso ciascuna struttura contiene, oltre al
\ids{PID} del processo in \var{fl\_pid}, la sezione di file che viene bloccata
grazie ai campi \var{fl\_start} e \var{fl\_end}. La struttura è comunque la
Per specificare quali file descriptor si intende selezionare la funzione usa
un particolare oggetto, il \textit{file descriptor set}, identificato dal tipo
-\type{fd\_set}, che serve ad identificare un insieme di file descriptor, in
+\typed{fd\_set}, che serve ad identificare un insieme di file descriptor, in
maniera analoga a come un \textit{signal set} (vedi sez.~\ref{sec:sig_sigset})
identifica un insieme di segnali. Per la manipolazione di questi \textit{file
descriptor set} si possono usare delle opportune macro di preprocessore:
assunto nessuno dei due comportamenti se si vogliono scrivere programmi
portabili.
-
\itindend{file~descriptor~set}
Una volta ritornata la funzione, si potrà controllare quali sono i file
introdotta in Linux come \textit{system call} a partire dal kernel 2.1.23 ed
inserita nelle \acr{libc} 5.4.28, originariamente l'argomento \param{nfds}
era di tipo \ctyp{unsigned int}, la funzione è stata inserita nello standard
- POSIX.1-2001 in cui è stato introdotto il tipo nativo \type{nfds\_t}.} il
+ POSIX.1-2001 in cui è stato introdotto il tipo nativo \typed{nfds\_t}.} il
cui prototipo è:
\begin{funcproto}{
L'uso di \func{poll} consente di superare alcuni dei problemi illustrati in
precedenza per \func{select}; anzitutto, dato che in questo caso si usa un
vettore di strutture \struct{pollfd} di dimensione arbitraria, non esiste il
-limite introdotto dalle dimensioni massime di un \itindex{file~descriptor~set}
-\textit{file descriptor set} e la dimensione dei dati passati al kernel
-dipende solo dal numero dei file descriptor che si vogliono controllare, non
-dal loro valore. Infatti, anche se usando dei bit un \textit{file descriptor
- set} può essere più efficiente di un vettore di strutture \struct{pollfd},
-qualora si debba osservare un solo file descriptor con un valore molto alto ci
-si troverà ad utilizzare inutilmente un maggiore quantitativo di memoria.
-
-Inoltre con \func{select} lo stesso \itindex{file~descriptor~set} \textit{file
- descriptor set} è usato sia in ingresso che in uscita, e questo significa
-che tutte le volte che si vuole ripetere l'operazione occorre reinizializzarlo
-da capo. Questa operazione, che può essere molto onerosa se i file descriptor
-da tenere sotto osservazione sono molti, non è invece necessaria con
-\func{poll}.
+limite introdotto dalle dimensioni massime di un \textit{file descriptor set}
+e la dimensione dei dati passati al kernel dipende solo dal numero dei file
+descriptor che si vogliono controllare, non dal loro valore. Infatti, anche se
+usando dei bit un \textit{file descriptor set} può essere più efficiente di un
+vettore di strutture \struct{pollfd}, qualora si debba osservare un solo file
+descriptor con un valore molto alto ci si troverà ad utilizzare inutilmente un
+maggiore quantitativo di memoria.
+
+Inoltre con \func{select} lo stesso \textit{file descriptor set} è usato sia
+in ingresso che in uscita, e questo significa che tutte le volte che si vuole
+ripetere l'operazione occorre reinizializzarlo da capo. Questa operazione, che
+può essere molto onerosa se i file descriptor da tenere sotto osservazione
+sono molti, non è invece necessaria con \func{poll}.
Abbiamo visto in sez.~\ref{sec:file_select} come lo standard POSIX preveda una
variante di \func{select} che consente di gestire correttamente la ricezione
anche questa funzione non è molto efficiente quando deve essere utilizzata con
un gran numero di file descriptor,\footnote{in casi del genere \func{select}
viene scartata a priori, perché può avvenire che il numero di file
- descriptor ecceda le dimensioni massime di un \itindex{file~descriptor~set}
- \textit{file descriptor set}.} in particolare nel caso in cui solo pochi di
-questi diventano attivi. Il problema in questo caso è che il tempo impiegato
-da \func{poll} a trasferire i dati da e verso il kernel è proporzionale al
-numero di file descriptor osservati, non a quelli che presentano attività.
+ descriptor ecceda le dimensioni massime di un \textit{file descriptor set}.}
+in particolare nel caso in cui solo pochi di questi diventano attivi. Il
+problema in questo caso è che il tempo impiegato da \func{poll} a trasferire i
+dati da e verso il kernel è proporzionale al numero di file descriptor
+osservati, non a quelli che presentano attività.
Quando ci sono decine di migliaia di file descriptor osservati e migliaia di
eventi al secondo (il caso classico è quello di un server web di un sito con
descriptor risulta pronto sarà possibile leggere il numero di volte che il
timer è scaduto con una ordinaria \func{read}.
-La funzione legge il valore in un dato di tipo \type{uint64\_t}, e necessita
+La funzione legge il valore in un dato di tipo \typed{uint64\_t}, e necessita
pertanto che le si passi un buffer di almeno 8 byte, fallendo con
\errval{EINVAL} in caso contrario, in sostanza la lettura deve essere
effettuata con una istruzione del tipo:
Inoltre trattandosi di un file descriptor a tutti gli effetti, esso potrà
essere utilizzato come argomento per le funzioni \func{select} e \func{poll} e
con l'interfaccia di \textit{epoll}, ed a partire dal kernel 2.6.25 è stato
-introdotto anche il supporto per il \itindex{signal~driven~I/O}
-\texttt{signal-driven I/O}. Siccome gli eventi vengono notificati come dati
-disponibili in lettura, dette funzioni ritorneranno tutte le volte che si avrà
-un evento di notifica.
+introdotto anche il supporto per il \texttt{signal-driven I/O}. Siccome gli
+eventi vengono notificati come dati disponibili in lettura, dette funzioni
+ritorneranno tutte le volte che si avrà un evento di notifica.
Così, invece di dover utilizzare i segnali, considerati una pessima scelta dal
punto di vista dell'interfaccia utente, si potrà gestire l'osservazione degli
\hline
\end{tabular}
\caption{Le principali operazioni sugli \textit{inode} definite tramite
- \kstruct{inode\_operation}.}
+ \kstructd{inode\_operation}.}
\label{tab:file_inode_operations}
\end{table}
sez.~\ref{sec:file_asyncronous_io}) sul file.\\
\hline
\end{tabular}
- \caption{Operazioni sui file definite tramite \kstruct{file\_operation}.}
+ \caption{Operazioni sui file definite tramite \kstructd{file\_operation}.}
\label{tab:file_file_operations}
\end{table}
\end{funcproto}
La funzione apre un \textit{directory stream} per la directory
-\param{dirname}, ritornando il puntatore ad un oggetto di tipo \type{DIR} (che
+\param{dirname}, ritornando il puntatore ad un oggetto di tipo \typed{DIR} (che
è il tipo opaco usato dalle librerie per gestire i \textit{directory stream})
da usare per tutte le operazioni successive, la funzione inoltre posiziona lo
\textit{stream} sulla prima voce contenuta nella directory.
Si noti come i vari membri della struttura siano specificati come tipi
primitivi del sistema, di quelli definiti in
tab.~\ref{tab:intro_primitive_types}, e dichiarati in \headfile{sys/types.h},
-con l'eccezione di \type{blksize\_t} e \type{blkcnt\_t} che sono nuovi tipi
+con l'eccezione di \typed{blksize\_t} e \typed{blkcnt\_t} che sono nuovi tipi
introdotti per rendersi indipendenti dalla piattaforma.
Benché la descrizione dei commenti di fig.~\ref{fig:file_stat_struct} sia
Entrambe le funzioni utilizzano come secondo argomento \param{mode}, una
variabile dell'apposito tipo primitivo \type{mode\_t} (vedi
-tab.~\ref{tab:intro_primitive_types}) utilizzato per specificare i permessi sui
-file.
+tab.~\ref{tab:intro_primitive_types}) utilizzato per specificare i permessi
+sui file.
\begin{table}[!htb]
\centering
La funzione alloca ed inizializza un'area di memoria che verrà usata per
mantenere i dati di una ACL contenente fino ad un massimo di \param{count}
-voci. La funzione ritorna un valore di tipo \type{acl\_t} da usare in tutte le
+voci. La funzione ritorna un valore di tipo \typed{acl\_t} da usare in tutte le
altre funzioni che operano sulla ACL. La funzione si limita alla allocazione
iniziale e non inserisce nessun valore nella ACL che resta vuota.
-Si tenga presente che pur essendo \type{acl\_t} un tipo opaco che identifica
+Si tenga presente che pur essendo \typed{acl\_t} un tipo opaco che identifica
``\textsl{l'oggetto}'' ACL, il valore restituito dalla funzione non è altro
che un puntatore all'area di memoria allocata per i dati richiesti. Pertanto
in caso di fallimento verrà restituito un puntatore nullo di tipo
funzione, che può richiedere anche la ACL relativa ad una directory, il
secondo argomento \param{type} consente di specificare se si vuole ottenere la
ACL di default o quella di accesso. Questo argomento deve essere di tipo
-\type{acl\_type\_t} e può assumere solo i due valori riportati in
+\typed{acl\_type\_t} e può assumere solo i due valori riportati in
tab.~\ref{tab:acl_type}.
\begin{table}[htb]
Se si vuole operare direttamente sui contenuti di un oggetto di tipo
\type{acl\_t} infatti occorre fare riferimento alle singole voci tramite gli
-opportuni puntatori di tipo \type{acl\_entry\_t}, che possono essere ottenuti
+opportuni puntatori di tipo \typed{acl\_entry\_t}, che possono essere ottenuti
dalla funzione \funcm{acl\_get\_entry} (per una voce esistente) o dalla
funzione \funcm{acl\_create\_entry} per una voce da aggiungere. Nel caso della
prima funzione si potrà poi ripetere la lettura per ottenere i puntatori alle
Le funzioni dell'interfaccia alle \textit{capabilities} definite nelle bozze
dello standard POSIX.1e prevedono l'uso di un tipo di dato opaco,
-\type{cap\_t}, come puntatore ai dati mantenuti nel cosiddetto
+\typed{cap\_t}, come puntatore ai dati mantenuti nel cosiddetto
\textit{capability state},\footnote{si tratta in sostanza di un puntatore ad
una struttura interna utilizzata dalle librerie, i cui campi non devono mai
essere acceduti direttamente.} in sono memorizzati tutti i dati delle
\constd{CAP\_INHERITABLE}& Capacità dell'insieme \textsl{ereditabile}.\\
\hline
\end{tabular}
- \caption{Valori possibili per il tipo di dato \type{cap\_flag\_t} che
+ \caption{Valori possibili per il tipo di dato \typed{cap\_flag\_t} che
identifica gli insiemi delle \textit{capabilities}.}
\label{tab:cap_set_identifier}
\end{table}
indica su quale dei tre insiemi si intende operare, sempre con i valori di
tab.~\ref{tab:cap_set_identifier}. La capacità che si intende controllare o
impostare invece deve essere specificata attraverso una variabile di tipo
-\type{cap\_value\_t}, che può prendere come valore uno qualunque di quelli
+\typed{cap\_value\_t}, che può prendere come valore uno qualunque di quelli
riportati in tab.~\ref{tab:proc_capabilities}, in questo caso però non è
possibile combinare diversi valori in una maschera binaria, una variabile di
tipo \type{cap\_value\_t} può indicare una sola capacità.\footnote{in
\constd{CAP\_SET} & La capacità è impostata.\\
\hline
\end{tabular}
- \caption{Valori possibili per il tipo di dato \type{cap\_flag\_value\_t} che
+ \caption{Valori possibili per il tipo di dato \typed{cap\_flag\_value\_t} che
indica lo stato di una capacità.}
\label{tab:cap_value_type}
\end{table}
impedendo ogni ulteriore operazione.
All'interno di ogni processo i file aperti sono identificati da un numero
-intero non negativo, che viene chiamato \textit{file descriptor}. Quando un
-file viene aperto la funzione \func{open} restituisce questo numero, tutte le
-ulteriori operazioni dovranno essere compiute specificando questo stesso
-numero come argomento alle varie funzioni dell'interfaccia.
+intero non negativo, che viene chiamato appunto \textit{file descriptor}.
+Quando un file viene aperto la funzione \func{open} restituisce questo numero,
+tutte le ulteriori operazioni dovranno essere compiute specificando questo
+stesso numero come argomento alle varie funzioni dell'interfaccia.
\itindbeg{process~table}
\itindbeg{file~table}
\centering
\includegraphics[width=12cm]{img/procfile}
\caption{Schema della architettura dell'accesso ai file attraverso
- l'interfaccia dei \textit{file descriptor}.}
+ l'interfaccia dei file descriptor.}
\label{fig:file_proc_file}
\end{figure}
\textit{file table}.
\end{itemize*}
-In questa infrastruttura un \textit{file descriptor} non è altro che l'intero
-positivo che indicizza quest'ultima tabella, e che consente di recuperare il
-puntatore alla struttura \kstruct{file} corrispondente al file aperto dal
-processo a cui era stato assegnato questo indice. Una volta ottenuta grazie al
-\textit{file descriptor} la struttura \kstruct{file} corrispondente al file
-voluto nella \textit{file table}, il kernel potrà usare le funzioni messe
-disposizione dal VFS per eseguire sul file tutte le operazioni necessarie.
+In questa infrastruttura un file descriptor non è altro che l'intero positivo
+che indicizza quest'ultima tabella, e che consente di recuperare il puntatore
+alla struttura \kstruct{file} corrispondente al file aperto dal processo a cui
+era stato assegnato questo indice. Una volta ottenuta grazie al file
+descriptor la struttura \kstruct{file} corrispondente al file voluto nella
+\textit{file table}, il kernel potrà usare le funzioni messe disposizione dal
+VFS per eseguire sul file tutte le operazioni necessarie.
Il meccanismo dell'apertura dei file prevede che venga sempre fornito il primo
-\textit{file descriptor} libero nella tabella, e per questo motivo essi
-vengono assegnati in successione tutte le volte che si apre un nuovo file,
-posto che non ne sia stato chiuso nessuno in precedenza.
+file descriptor libero nella tabella, e per questo motivo essi vengono
+assegnati in successione tutte le volte che si apre un nuovo file, posto che
+non ne sia stato chiuso nessuno in precedenza.
\itindbeg{standard~input}
\itindbeg{standard~output}
\textbf{File} & \textbf{Significato} \\
\hline
\hline
- \constd{STDIN\_FILENO} & \textit{file descriptor} dello \textit{standard
- input}.\\
- \constd{STDOUT\_FILENO} & \textit{file descriptor} dello \textit{standard
- output}.\\
- \constd{STDERR\_FILENO} & \textit{file descriptor} dello \textit{standard
- error}.\\
+ \constd{STDIN\_FILENO} & file descriptor dello \textit{standard input}.\\
+ \constd{STDOUT\_FILENO} & file descriptor dello \textit{standard output}.\\
+ \constd{STDERR\_FILENO} & file descriptor dello \textit{standard error}.\\
\hline
\end{tabular}
\caption{Costanti definite in \headfile{unistd.h} per i file standard.}
accesso.
Per ragioni storiche la struttura di dati che rappresenta uno \textit{stream}
-è stata chiamata \type{FILE}, questi oggetti sono creati dalle funzioni di
+è stata chiamata \typed{FILE}, questi oggetti sono creati dalle funzioni di
libreria e contengono tutte le informazioni necessarie a gestire le operazioni
sugli \textit{stream}, come la posizione corrente, lo stato del buffer e degli
indicatori di stato e di fine del file.
un filesystem indicizzato a 64 bit su una macchina con architettura a 32 bit,
questo può non essere possibile lo standard POSIX ha introdotto le nuove
funzioni \funcd{fgetpos} e \funcd{fsetpos}, che invece usano il nuovo tipo
-\type{fpos\_t}, ed i cui prototipi sono:
+\typed{fpos\_t}, ed i cui prototipi sono:
\begin{funcproto}{
\fhead{stdio.h}
\textbf{Tipo} & \textbf{Contenuto} \\
\hline
\hline
- \type{caddr\_t} & Core address.\\
- \type{clock\_t} & Contatore del \textit{process time} (vedi
+ \typed{caddr\_t} & Core address.\\
+ \typed{clock\_t} & Contatore del \textit{process time} (vedi
sez.~\ref{sec:sys_cpu_times}.\\
- \type{dev\_t} & Numero di dispositivo (vedi sez.~\ref{sec:file_mknod}).\\
- \type{gid\_t} & Identificatore di un gruppo (vedi
+ \typed{dev\_t} & Numero di dispositivo (vedi sez.~\ref{sec:file_mknod}).\\
+ \typed{gid\_t} & Identificatore di un gruppo (vedi
sez.~\ref{sec:proc_access_id}).\\
- \type{ino\_t} & Numero di \textit{inode}
+ \typed{ino\_t} & Numero di \textit{inode}
(vedi sez.~\ref{sec:file_vfs_work}).\\
- \type{key\_t} & Chiave per il System V IPC (vedi
+ \typed{key\_t} & Chiave per il System V IPC (vedi
sez.~\ref{sec:ipc_sysv_generic}).\\
- \type{loff\_t} & Posizione corrente in un file.\\
- \type{mode\_t} & Attributi di un file.\\
- \type{nlink\_t} & Contatore dei collegamenti su un file.\\
- \type{off\_t} & Posizione corrente in un file.\\
- \type{pid\_t} & Identificatore di un processo (vedi
+ \typed{loff\_t} & Posizione corrente in un file.\\
+ \typed{mode\_t} & Attributi di un file.\\
+ \typed{nlink\_t} & Contatore dei collegamenti su un file.\\
+ \typed{off\_t} & Posizione corrente in un file.\\
+ \typed{pid\_t} & Identificatore di un processo (vedi
sez.~\ref{sec:proc_pid}).\\
- \type{rlim\_t} & Limite sulle risorse.\\
- \type{sigset\_t}& Insieme di segnali (vedi sez.~\ref{sec:sig_sigset}).\\
- \type{size\_t} & Dimensione di un oggetto.\\
- \type{ssize\_t} & Dimensione in numero di byte ritornata dalle funzioni.\\
- \type{ptrdiff\_t}& Differenza fra due puntatori.\\
- \type{time\_t} & Numero di secondi (in \textit{calendar time}, vedi
+ \typed{rlim\_t} & Limite sulle risorse.\\
+ \typed{sigset\_t}& Insieme di segnali (vedi sez.~\ref{sec:sig_sigset}).\\
+ \typed{size\_t} & Dimensione di un oggetto.\\
+ \typed{ssize\_t} & Dimensione in numero di byte ritornata dalle funzioni.\\
+ \typed{ptrdiff\_t}& Differenza fra due puntatori.\\
+ \typed{time\_t} & Numero di secondi (in \textit{calendar time}, vedi
sez.~\ref{sec:sys_time}).\\
- \type{uid\_t} & Identificatore di un utente (vedi
+ \typed{uid\_t} & Identificatore di un utente (vedi
sez.~\ref{sec:proc_access_id}).\\
\hline
\end{tabular}
presente negli standard con i file di grandi dimensioni, ed in particolare
definire le due funzioni \func{fseeko} e \func{ftello} che al contrario
delle corrispettive \func{fseek} e \func{ftell} usano il tipo di dato
- specifico \ctyp{off\_t} (vedi sez.~\ref{sec:file_io}).
+ specifico \type{off\_t} (vedi sez.~\ref{sec:file_io}).
\item[\macrod{\_LARGEFILE64\_SOURCE}] definendo questa macro si rendono
disponibili le funzioni di una interfaccia alternativa al supporto di valori
a 64 bit nelle funzioni di gestione dei file (non supportati in certi
sistemi), caratterizzate dal suffisso \texttt{64} aggiunto ai vari nomi di
- tipi di dato e funzioni (come \type{off64\_t} al posto di \type{off\_t} o
+ tipi di dato e funzioni (come \typed{off64\_t} al posto di \type{off\_t} o
\funcm{lseek64} al posto di \func{lseek}).
Le funzioni di questa interfaccia alternativa sono state proposte come una
a differenza di quanto avviene per i permessi dei file, fallire in uno dei
passi elencati non comporta il fallimento dell'accesso. Un'ulteriore
differenza rispetto a quanto avviene per i file è che per gli oggetti di IPC
-il valore di \itindex{umask} \textit{umask} (si ricordi quanto esposto in
+il valore di \textit{umask} (si ricordi quanto esposto in
sez.~\ref{sec:file_perm_management}) non ha alcun significato.
dal kernel. Lo schema illustrato in realtà è una semplificazione di quello
usato fino ai kernel della serie 2.2. A partire della serie 2.4 la gestione
delle code di messaggi è effettuata in maniera diversa (e non esiste una
-struttura \struct{msqid\_ds} nel kernel), ma abbiamo mantenuto lo schema
+struttura \kstruct{msqid\_ds} nel kernel), ma abbiamo mantenuto lo schema
precedente dato che illustra in maniera più che adeguata i principi di
funzionamento delle code di messaggi.
\begin{figure}[!htb]
\centering \includegraphics[width=13cm]{img/mqstruct}
- \caption{Schema della struttura di una coda messaggi.}
+ \caption{Schema delle strutture di una coda di messaggi
+ (\kstructd{msqid\_ds} e \kstructd{msg}).}
\label{fig:ipc_mq_schema}
\end{figure}
-A ciascuna coda è associata una struttura \struct{msqid\_ds} la cui
+A ciascuna coda è associata una struttura \kstruct{msqid\_ds} la cui
definizione è riportata in fig.~\ref{fig:ipc_msqid_ds} ed a cui si accede
includendo \headfiled{sys/msg.h};
%
Per capire meglio il funzionamento della funzione riprendiamo in
considerazione la struttura della coda illustrata in
-fig.~\ref{fig:ipc_mq_schema}. Alla chiamata di \func{msgsnd} il nuovo messaggio
-sarà aggiunto in fondo alla lista inserendo una nuova struttura \struct{msg},
-il puntatore \var{msg\_last} di \struct{msqid\_ds} verrà aggiornato, come pure
-il puntatore al messaggio successivo per quello che era il precedente ultimo
-messaggio; il valore di \var{mtype} verrà mantenuto in \var{msg\_type} ed il
-valore di \param{msgsz} in \var{msg\_ts}; il testo del messaggio sarà copiato
-all'indirizzo specificato da \var{msg\_spot}.
+fig.~\ref{fig:ipc_mq_schema}. Alla chiamata di \func{msgsnd} il nuovo
+messaggio sarà aggiunto in fondo alla lista inserendo una nuova struttura
+\kstruct{msg}, il puntatore \var{msg\_last} di \kstruct{msqid\_ds} verrà
+aggiornato, come pure il puntatore al messaggio successivo per quello che era
+il precedente ultimo messaggio; il valore di \var{mtype} verrà mantenuto in
+\var{msg\_type} ed il valore di \param{msgsz} in \var{msg\_ts}; il testo del
+messaggio sarà copiato all'indirizzo specificato da \var{msg\_spot}.
Il valore dell'argomento \param{flag} permette di specificare il comportamento
della funzione. Di norma, quando si specifica un valore nullo, la funzione
\begin{figure}[!htb]
\centering \includegraphics[width=12cm]{img/semtruct}
- \caption{Schema della struttura di un insieme di semafori.}
+ \caption{Schema delle varie strutture di un insieme di semafori
+ (\kstructd{semid\_ds}, \kstructd{sem}, \kstructd{sem\_queue} e
+ \kstructd{sem\_undo}).}
\label{fig:ipc_sem_schema}
\end{figure}
Alla creazione di un nuovo insieme viene allocata una nuova strutture
-\struct{semid\_ds} ed il relativo vettore di strutture \struct{sem}. Quando si
-richiede una operazione viene anzitutto verificato che tutte le operazioni
+\kstruct{semid\_ds} ed il relativo vettore di strutture \kstruct{sem}. Quando
+si richiede una operazione viene anzitutto verificato che tutte le operazioni
possono avere successo; se una di esse comporta il blocco del processo il
kernel crea una struttura \kstruct{sem\_queue} che viene aggiunta in fondo
alla coda di attesa associata a ciascun insieme di semafori, che viene
referenziata tramite i campi \var{sem\_pending} e \var{sem\_pending\_last} di
-\struct{semid\_ds}. Nella struttura viene memorizzato il riferimento alle
+\kstruct{semid\_ds}. Nella struttura viene memorizzato il riferimento alle
operazioni richieste (nel campo \var{sops}, che è un puntatore ad una
struttura \struct{sembuf}) e al processo corrente (nel campo \var{sleeper})
poi quest'ultimo viene messo stato di attesa e viene invocato lo
La funzione apre la coda di messaggi identificata dall'argomento \param{name}
restituendo il descrittore ad essa associato, del tutto analogo ad un file
descriptor, con l'unica differenza che lo standard prevede un apposito tipo
-\type{mqd\_t}. Nel caso di Linux si tratta in effetti proprio di un normale
+\typed{mqd\_t}. Nel caso di Linux si tratta in effetti proprio di un normale
file descriptor; pertanto, anche se questo comportamento non è portabile, lo
si può tenere sotto osservazione con le funzioni dell'I/O multiplexing (vedi
sez.~\ref{sec:file_multiplexing}) come possibile alternativa all'uso
semafori usano la semantica standard dei file per quanto riguarda i controlli
di accesso, questo significa che un nuovo semaforo viene sempre creato con
l'\ids{UID} ed il \ids{GID} effettivo del processo chiamante, e che i permessi
-indicati con \param{mode} vengono filtrati dal valore della \itindex{umask}
-\textit{umask} del processo. Inoltre per poter aprire un semaforo è
-necessario avere su di esso sia il permesso di lettura che quello di
-scrittura.
+indicati con \param{mode} vengono filtrati dal valore della \textit{umask} del
+processo. Inoltre per poter aprire un semaforo è necessario avere su di esso
+sia il permesso di lettura che quello di scrittura.
La funzione restituisce in caso di successo un puntatore all'indirizzo del
semaforo con un valore di tipo \ctyp{sem\_t *}, è questo valore che dovrà
%\index{struttura dati del kernel!{#1}@{{\tt {#1}}}!definizione di}\texttt{#1}%
%\index{#1@{{\tt {#1}} (struttura dati)}!definizione di}\texttt{#1}%
} % struttura dati
-\newcommand{\type}[1]{%
+\newcommand{\typed}[1]{%
\index{tipo di dato!{#1}@{{\tt {#1}}}}\texttt{#1}%
%\index{#1@{{\tt {#1}} (tipo)}}\texttt{#1}%
} % system type
+\newcommand{\type}[1]{%
+\texttt{#1}%
+%\index{tipo di dato!{#1}@{{\tt {#1}}}}\texttt{#1}%
+%\index{#1@{{\tt {#1}} (tipo)}}\texttt{#1}%
+} % system type
\newcommand{\struct}[1]{%
\texttt{#1}%
%\index{struttura dati!{#1}@{{\tt {#1}}}}\texttt{#1}%
prima di queste funzioni è \funcd{sendto} ed il suo prototipo\footnote{il
prototipo illustrato è quello utilizzato dalle \acr{glibc}, che seguono le
\textit{Single Unix Specification}, l'argomento \param{flags} era di tipo
- \texttt{int} nei vari BSD4.*, mentre nelle \acr{libc4} e \acr{libc5} veniva
- usato un \texttt{unsigned int}; l'argomento \param{len} era \texttt{int} nei
- vari BSD4.* e nelle \acr{libc4}, ma \type{size\_t} nelle \acr{libc5}; infine
- l'argomento \param{tolen} era \texttt{int} nei vari BSD4.* nelle \acr{libc4}
- e nelle \acr{libc5}.} è:
+ \ctyp{int} nei vari BSD4.*, mentre nelle \acr{libc4} e \acr{libc5} veniva
+ usato un \texttt{unsigned int}; l'argomento \param{len} era \ctyp{int} nei
+ vari BSD4.* e nelle \acr{libc4}, ma \type{size\_t} nelle \acr{libc5};
+ infine l'argomento \param{tolen} era \ctyp{int} nei vari BSD4.* nelle
+ \acr{libc4} e nelle \acr{libc5}.} è:
\begin{functions}
\headdecl{sys/types.h}
\headdecl{sys/socket.h}
\funcd{recvfrom}, che serve a ricevere i dati inviati da un altro socket; il
suo prototipo\footnote{il prototipo è quello delle \acr{glibc} che seguono le
\textit{Single Unix Specification}, i vari BSD4.*, le \acr{libc4} e le
- \acr{libc5} usano un \texttt{int} come valore di ritorno; per gli argomenti
+ \acr{libc5} usano un \ctyp{int} come valore di ritorno; per gli argomenti
\param{flags} e \param{len} vale quanto detto a proposito di \func{sendto};
- infine l'argomento \param{fromlen} è \texttt{int} per i vari BSD4.*, le
+ infine l'argomento \param{fromlen} è \ctyp{int} per i vari BSD4.*, le
\acr{libc4} e le \acr{libc5}.} è:
\begin{functions}
\headdecl{sys/types.h}
caso \var{errno} assumerà il valore \errcode{ENOMEM}.}
\end{funcproto}
-La funzione incrementa la dimensione dello \textit{heap} di un
-programma del valore indicato dall'argomento \param{increment}, restituendo il
-nuovo indirizzo finale dello stesso. L'argomento è definito come di tipo
-\type{intptr\_t}, ma a seconda della versione delle librerie e del sistema può
-essere indicato con una serie di tipi equivalenti come \ctyp{ptrdiff\_t},
-\ctyp{ssize\_t}, \ctyp{int}. Se invocata con un valore nullo la funzione
+La funzione incrementa la dimensione dello \textit{heap} di un programma del
+valore indicato dall'argomento \param{increment}, restituendo il nuovo
+indirizzo finale dello stesso. L'argomento è definito come di tipo
+\typed{intptr\_t}, ma a seconda della versione delle librerie e del sistema
+può essere indicato con una serie di tipi equivalenti come \type{ptrdiff\_t},
+\type{ssize\_t}, \ctyp{int}. Se invocata con un valore nullo la funzione
permette di ottenere l'attuale posizione della fine del segmento dati.
Queste due funzioni sono state deliberatamente escluse dallo standard POSIX.1
}
\end{funcbox}}
-La macro inizializza il puntatore alla lista di argomenti \param{ap} che
-deve essere una apposita variabile di tipo \type{va\_list}; il
+La macro inizializza il puntatore alla lista di argomenti \param{ap} che deve
+essere una apposita variabile di tipo \type{va\_list}; il
parametro \param{last} deve indicare il nome dell'ultimo degli argomenti fissi
-dichiarati nel prototipo della funzione \textit{variadic}.
+dichiarati nel prototipo della funzione \textit{variadic}.
\macrobeg{va\_arg}
\index{tipo!opaco|(}
In generale però possono esistere anche realizzazioni diverse, ed è per questo
-motivo che invece che di un semplice puntatore viene \type{va\_list} è quello
-che viene chiamato un \textsl{tipo opaco}. Si chiamano così quei tipi di dati,
-in genere usati da una libreria, la cui struttura interna non deve essere
-vista dal programma chiamante (da cui deriva il nome opaco) che li devono
-utilizzare solo attraverso dalle opportune funzioni di gestione.
+motivo che invece che un semplice puntatore, \typed{va\_list} è quello che
+viene chiamato un \textsl{tipo opaco}. Si chiamano così quei tipi di dati, in
+genere usati da una libreria, la cui struttura interna non deve essere vista
+dal programma chiamante (da cui deriva il nome opaco) che li devono utilizzare
+solo attraverso dalle opportune funzioni di gestione.
\index{tipo!opaco|)}
-Per questo motivo una variabile di tipo \type{va\_list} non può essere
+Per questo motivo una variabile di tipo \typed{va\_list} non può essere
assegnata direttamente ad un'altra variabile dello stesso tipo, ma lo standard
ISO C99\footnote{alcuni sistemi che non hanno questa macro provvedono al suo
posto \macrod{\_\_va\_copy} che era il nome proposto in una bozza dello
Quando si esegue la funzione il contesto corrente dello \textit{stack} viene
salvato nell'argomento \param{env}, una variabile di tipo
-\type{jmp\_buf}\footnote{anche questo è un classico esempio di variabile di
+\typed{jmp\_buf}\footnote{anche questo è un classico esempio di variabile di
\textsl{tipo opaco}.} che deve essere stata definita in precedenza. In
genere le variabili di tipo \type{jmp\_buf} vengono definite come variabili
globali in modo da poter essere viste in tutte le funzioni del programma.
\begin{figure}[!htb]
\centering \includegraphics[width=14cm]{img/task_struct}
- \caption{Schema semplificato dell'architettura delle strutture usate dal
- kernel nella gestione dei processi.}
+ \caption{Schema semplificato dell'architettura delle strutture (
+ \kstructd{task\_struct}, \kstructd{fs\_struct}, \kstructd{file\_struct})
+ usate dal kernel nella gestione dei processi.}
\label{fig:proc_task_struct}
\end{figure}
Dato che il numero di processori può variare a seconda delle architetture, per
semplificare l'uso dell'argomento \param{mask} la \acr{glibc} ha introdotto un
-apposito dato di tipo, \type{cpu\_set\_t},\footnote{questa è una estensione
+apposito dato di tipo, \typed{cpu\_set\_t},\footnote{questa è una estensione
specifica della \acr{glibc}, da attivare definendo la macro
\macro{\_GNU\_SOURCE}, non esiste infatti una standardizzazione per questo
tipo di interfaccia e POSIX al momento non prevede nulla al riguardo.} che
\fdecl{void \macrod{CPU\_ZERO}(cpu\_set\_t *set)}
\fdesc{Inizializza un insieme di processori vuoto \param{set}.}
\fdecl{void \macrod{CPU\_SET}(int cpu, cpu\_set\_t *set)}
-\fdesc{Inserisce il processore \param{cpu} nell'insieme di processori \param{set}.}
+\fdesc{Inserisce il processore \param{cpu} nell'insieme di
+ processori \param{set}.}
\fdecl{void \macrod{CPU\_CLR}(int cpu, cpu\_set\_t *set)}
-\fdesc{Rimuove il processore \param{cpu} nell'insieme di processori \param{set}.}
+\fdesc{Rimuove il processore \param{cpu} nell'insieme di
+ processori \param{set}.}
\fdecl{int \macrod{CPU\_ISSET}(int cpu, cpu\_set\_t *set)}
-\fdesc{Controlla se il processore \param{cpu} è nell'insieme di processori \param{set}.}
+\fdesc{Controlla se il processore \param{cpu} è nell'insieme di
+ processori \param{set}.}
}
\end{funcbox}}
condition} (vedi sez.~\ref{sec:proc_race_cond}) deve essere sempre
verificata nei minimi dettagli.
-In questo caso il sistema provvede un tipo di dato, il \type{sig\_atomic\_t},
+In questo caso il sistema provvede un tipo di dato, il \typed{sig\_atomic\_t},
il cui accesso è assicurato essere atomico. In pratica comunque si può
assumere che, in ogni piattaforma su cui è implementato Linux, il tipo
\ctyp{int}, gli altri interi di dimensione inferiore ed i puntatori sono
il programma), per evitare che la directory da cui si è lanciato il processo
resti in uso e non sia possibile rimuoverla o smontare il filesystem che la
contiene.
-\item Impostare la \itindex{umask} maschera dei permessi (di solito con
- \code{umask(0)}) in modo da non essere dipendenti dal valore ereditato da
- chi ha lanciato originariamente il processo.
+\item Impostare la maschera dei permessi (di solito con \code{umask(0)}) in
+ modo da non essere dipendenti dal valore ereditato da chi ha lanciato
+ originariamente il processo.
\item Chiudere tutti i file aperti che non servono più (in generale tutti); in
particolare vanno chiusi i file standard che di norma sono ancora associati
al terminale (un'altra opzione è quella di redirigerli verso
I primi quattro campi sono quattro flag che controllano il comportamento del
terminale; essi sono realizzati come maschera binaria, pertanto il tipo
-\type{tcflag\_t} è di norma realizzato con un intero senza segno di lunghezza
+\typed{tcflag\_t} è di norma realizzato con un intero senza segno di lunghezza
opportuna. I valori devono essere specificati bit per bit, avendo cura di non
modificare i bit su cui non si interviene.
questa infatti, per la poca chiarezza della sintassi del C quando si vanno a
trattare puntatori a funzioni, è molto meno comprensibile. Da un confronto
con il precedente prototipo si può dedurre la definizione di
-\type{sighandler\_t} che è:
+\typed{sighandler\_t} che è:
\includecodesnip{listati/sighandler_t.c}
e cioè un puntatore ad una funzione \ctyp{void} (cioè senza valore di ritorno)
e che prende un argomento di tipo \ctyp{int}. Si noti come si devono usare le
\end{minipage}
\normalsize
\caption{La definizione dell'unione \structd{sigval}, definita anche come
- tipo \type{sigval\_t}.}
+ tipo \typed{sigval\_t}.}
\label{fig:sig_sigval}
\end{figure}
% \const{} & .\\
\hline
\end{tabular}
- \caption{Valori possibili per una variabile di tipo \type{clockid\_t}
+ \caption{Valori possibili per una variabile di tipo \typed{clockid\_t}
usata per indicare a quale tipo di orologio si vuole fare riferimento.}
\label{tab:sig_timer_clockid_types}
\end{table}
l'identificatore del timer come valore per \var{sigev\_value.sival\_int}.
Il terzo argomento deve essere l'indirizzo di una variabile di tipo
-\type{timer\_t} dove sarà scritto l'identificativo associato al timer appena
+\typed{timer\_t} dove sarà scritto l'identificativo associato al timer appena
creato, da usare in tutte le successive funzioni di gestione. Una volta creato
questo identificativo resterà univoco all'interno del processo stesso fintanto
che il timer non viene cancellato.
Le due funzioni prendono come primo argomento la variabile su cui viene
salvato il contesto dello \textit{stack} per permettere il salto non-locale;
-nel caso specifico essa è di tipo \type{sigjmp\_buf}, e non \type{jmp\_buf}
+nel caso specifico essa è di tipo \typed{sigjmp\_buf}, e non \type{jmp\_buf}
come per le analoghe di sez.~\ref{sec:proc_longjmp} in quanto in questo caso
viene salvata anche la maschera dei segnali.
Come già accennato in sez.~\ref{sec:file_multiplexing} la presenza di dati
urgenti viene rilevata in maniera specifica sia di \func{select} (con il
-\itindex{file~descriptor~set} \textit{file descriptor set} \param{exceptfds})
-che da \func{poll} (con la condizione \const{POLLRDBAND}).
+\textit{file descriptor set} \param{exceptfds}) che da \func{poll} (con la
+condizione \const{POLLRDBAND}).
Le modalità di lettura dei dati urgenti sono due, la prima e più comune
avere abilitato l'opzione \texttt{CONFIG\_SYN\_COOKIES} nella compilazione
del kernel.} Prende un valore logico, e di default è disabilitato. Questa
funzionalità serve a fornire una protezione in caso di un attacco di tipo
- \index{SYN~flood} \textit{SYN flood}, e deve essere utilizzato come ultima
- risorsa dato che costituisce una violazione del protocollo TCP e confligge
- con altre funzionalità come le estensioni e può causare problemi per i
- client ed il reinoltro dei pacchetti.
+ \textit{SYN flood}, e deve essere utilizzato come ultima risorsa dato che
+ costituisce una violazione del protocollo TCP e confligge con altre
+ funzionalità come le estensioni e può causare problemi per i client ed il
+ reinoltro dei pacchetti.
\item[\sysctlrelfile{net/ipv4}{tcp\_syn\_retries}] imposta il numero
di tentativi di ritrasmissione dei pacchetti SYN di inizio connessione del
\multicolumn{1}{|c|}{\textbf{Header}} \\
\hline
\hline
- \type{int8\_t} & intero a 8 bit con segno & \headfile{sys/types.h}\\
- \type{uint8\_t} & intero a 8 bit senza segno & \headfile{sys/types.h}\\
- \type{int16\_t} & intero a 16 bit con segno & \headfile{sys/types.h}\\
- \type{uint16\_t} & intero a 16 bit senza segno& \headfile{sys/types.h}\\
- \type{int32\_t} & intero a 32 bit con segno & \headfile{sys/types.h}\\
- \type{uint32\_t} & intero a 32 bit senza segno& \headfile{sys/types.h}\\
+ \typed{int8\_t} & intero a 8 bit con segno & \headfile{sys/types.h}\\
+ \typed{uint8\_t} & intero a 8 bit senza segno & \headfile{sys/types.h}\\
+ \typed{int16\_t} & intero a 16 bit con segno & \headfile{sys/types.h}\\
+ \typed{uint16\_t} & intero a 16 bit senza segno& \headfile{sys/types.h}\\
+ \typed{int32\_t} & intero a 32 bit con segno & \headfile{sys/types.h}\\
+ \typed{uint32\_t} & intero a 32 bit senza segno& \headfile{sys/types.h}\\
\hline
- \type{sa\_family\_t} & famiglia degli indirizzi&\headfile{sys/socket.h}\\
- \type{socklen\_t} & lunghezza (\type{uint32\_t}) dell'indirizzo di
+ \typed{sa\_family\_t} & famiglia degli indirizzi&\headfile{sys/socket.h}\\
+ \typed{socklen\_t} & lunghezza (\type{uint32\_t}) dell'indirizzo di
un socket& \headfile{sys/socket.h}\\
\hline
- \type{in\_addr\_t} & indirizzo IPv4 (\type{uint32\_t}) &
+ \typed{in\_addr\_t} & indirizzo IPv4 (\type{uint32\_t}) &
\headfile{netinet/in.h}\\
- \type{in\_port\_t} & porta TCP o UDP (\type{uint16\_t})&
+ \typed{in\_port\_t} & porta TCP o UDP (\type{uint16\_t})&
\headfile{netinet/in.h}\\
\hline
\end{tabular}
\textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \const{MB\_LEN\_MAX}& 16 & Massima dimensione di un
- carattere esteso.\\
- \const{CHAR\_BIT} & 8 & Numero di bit di \ctyp{char}.\\
- \const{UCHAR\_MAX}& 255 & Massimo di \ctyp{unsigned char}.\\
- \const{SCHAR\_MIN}& -128 & Minimo di \ctyp{signed char}.\\
- \const{SCHAR\_MAX}& 127 & Massimo di \ctyp{signed char}.\\
- \const{CHAR\_MIN} & 0 o -128 & Minimo di \ctyp{char}.\footnotemark\\
- \const{CHAR\_MAX} & 127 o 255 & Massimo di \ctyp{char}.\footnotemark\\
- \const{SHRT\_MIN} & -32768 & Minimo di \ctyp{short}.\\
- \const{SHRT\_MAX} & 32767 & Massimo di \ctyp{short}.\\
- \const{USHRT\_MAX}& 65535 & Massimo di \ctyp{unsigned short}.\\
- \const{INT\_MAX} & 2147483647 & Minimo di \ctyp{int}.\\
- \const{INT\_MIN} &-2147483648 & Minimo di \ctyp{int}.\\
- \const{UINT\_MAX} & 4294967295 & Massimo di \ctyp{unsigned int}.\\
- \const{LONG\_MAX} & 2147483647 & Massimo di \ctyp{long}.\\
- \const{LONG\_MIN} &-2147483648 & Minimo di \ctyp{long}.\\
- \const{ULONG\_MAX}& 4294967295 & Massimo di \ctyp{unsigned long}.\\
+ \constd{MB\_LEN\_MAX}& 16 & Massima dimensione di un
+ carattere esteso.\\
+ \constd{CHAR\_BIT} & 8 & Numero di bit di \ctyp{char}.\\
+ \constd{UCHAR\_MAX}& 255 & Massimo di \ctyp{unsigned char}.\\
+ \constd{SCHAR\_MIN}& -128 & Minimo di \ctyp{signed char}.\\
+ \constd{SCHAR\_MAX}& 127 & Massimo di \ctyp{signed char}.\\
+ \constd{CHAR\_MIN} & 0 o -128 & Minimo di \ctyp{char}.\footnotemark\\
+ \constd{CHAR\_MAX} & 127 o 255 & Massimo di \ctyp{char}.\footnotemark\\
+ \constd{SHRT\_MIN} & -32768 & Minimo di \ctyp{short}.\\
+ \constd{SHRT\_MAX} & 32767 & Massimo di \ctyp{short}.\\
+ \constd{USHRT\_MAX}& 65535 & Massimo di \ctyp{unsigned short}.\\
+ \constd{INT\_MAX} & 2147483647 & Minimo di \ctyp{int}.\\
+ \constd{INT\_MIN} &-2147483648 & Minimo di \ctyp{int}.\\
+ \constd{UINT\_MAX} & 4294967295 & Massimo di \ctyp{unsigned int}.\\
+ \constd{LONG\_MAX} & 2147483647 & Massimo di \ctyp{long}.\\
+ \constd{LONG\_MIN} &-2147483648 & Minimo di \ctyp{long}.\\
+ \constd{ULONG\_MAX}& 4294967295 & Massimo di \ctyp{unsigned long}.\\
\hline
\end{tabular}
\caption{Costanti definite in \headfile{limits.h} in conformità allo standard
\textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \const{LLONG\_MAX}& 9223372036854775807& Massimo di \ctyp{long long}.\\
- \const{LLONG\_MIN}&-9223372036854775808& Minimo di \ctyp{long long}.\\
- \const{ULLONG\_MAX}&18446744073709551615&
- Massimo di \ctyp{unsigned long long}.\\
+ \constd{LLONG\_MAX} & 9223372036854775807& Massimo di \ctyp{long long}.\\
+ \constd{LLONG\_MIN} &-9223372036854775808& Minimo di \ctyp{long long}.\\
+ \constd{ULLONG\_MAX}&18446744073709551615& Massimo di \ctyp{unsigned long
+ long}.\\
\hline
\end{tabular}
\caption{Macro definite in \headfile{limits.h} in conformità allo standard
\label{tab:sys_isoc90_macro}
\end{table}
-Lo standard prevede anche un'altra costante, \const{FOPEN\_MAX}, che può non
+Lo standard prevede anche un'altra costante, \constd{FOPEN\_MAX}, che può non
essere fissa e che pertanto non è definita in \headfile{limits.h}, essa deve
essere definita in \headfile{stdio.h} ed avere un valore minimo di 8. A questi
valori lo standard ISO C90 ne aggiunge altri tre, relativi al tipo \ctyp{long
\textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \const{ARG\_MAX} &131072& Dimensione massima degli argomenti
- passati ad una funzione della famiglia
- \func{exec}.\\
- \const{CHILD\_MAX} & 999& Numero massimo di processi contemporanei
- che un utente può eseguire.\\
- \const{OPEN\_MAX} & 256& Numero massimo di file che un processo
- può mantenere aperti in contemporanea.\\
- \const{STREAM\_MAX}& 8& Massimo numero di stream aperti per
- processo in contemporanea.\\
- \const{TZNAME\_MAX}& 6& Dimensione massima del nome di una
- \textit{timezone} (vedi
- sez.~\ref{sec:sys_time_base})).\\
- \const{NGROUPS\_MAX}& 32& Numero di gruppi supplementari per
- processo (vedi sez.~\ref{sec:proc_access_id}).\\
- \const{SSIZE\_MAX}&32767& Valore massimo del tipo \type{ssize\_t}.\\
+ \constd{ARG\_MAX} &131072& Dimensione massima degli argomenti
+ passati ad una funzione della famiglia
+ \func{exec}.\\
+ \constd{CHILD\_MAX} & 999& Numero massimo di processi contemporanei
+ che un utente può eseguire.\\
+ \constd{OPEN\_MAX} & 256& Numero massimo di file che un processo
+ può mantenere aperti in contemporanea.\\
+ \constd{STREAM\_MAX}& 8& Massimo numero di stream aperti per
+ processo in contemporanea.\\
+ \constd{TZNAME\_MAX}& 6& Dimensione massima del nome di una
+ \textit{timezone} (vedi
+ sez.~\ref{sec:sys_time_base})).\\
+ \constd{NGROUPS\_MAX}& 32& Numero di gruppi supplementari per
+ processo (vedi sez.~\ref{sec:proc_access_id}).\\
+ \constd{SSIZE\_MAX}&32767& Valore massimo del tipo \type{ssize\_t}.\\
\hline
\end{tabular}
\caption{Costanti per i limiti del sistema.}
\textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \const{\_POSIX\_ARG\_MAX} & 4096& Dimensione massima degli argomenti
+ \constd{\_POSIX\_ARG\_MAX} & 4096& Dimensione massima degli argomenti
passati ad una funzione della famiglia
\func{exec}.\\
- \const{\_POSIX\_CHILD\_MAX} & 6& Numero massimo di processi
+ \constd{\_POSIX\_CHILD\_MAX} & 6& Numero massimo di processi
contemporanei che un utente può
eseguire.\\
- \const{\_POSIX\_OPEN\_MAX} & 16& Numero massimo di file che un processo
+ \constd{\_POSIX\_OPEN\_MAX} & 16& Numero massimo di file che un processo
può mantenere aperti in
contemporanea.\\
- \const{\_POSIX\_STREAM\_MAX} & 8& Massimo numero di stream aperti per
+ \constd{\_POSIX\_STREAM\_MAX}& 8& Massimo numero di stream aperti per
processo in contemporanea.\\
- \const{\_POSIX\_TZNAME\_MAX} & 6& Dimensione massima del nome di una
+ \constd{\_POSIX\_TZNAME\_MAX}& 6& Dimensione massima del nome di una
\textit{timezone}
(vedi sez.~\ref{sec:sys_date}). \\
- \const{\_POSIX\_RTSIG\_MAX} & 8& Numero massimo di segnali
+ \constd{\_POSIX\_RTSIG\_MAX} & 8& Numero massimo di segnali
\textit{real-time} (vedi
sez.~\ref{sec:sig_real_time}).\\
- \const{\_POSIX\_NGROUPS\_MAX}& 0& Numero di gruppi supplementari per
+ \constd{\_POSIX\_NGROUPS\_MAX}& 0& Numero di gruppi supplementari per
processo (vedi
sez.~\ref{sec:proc_access_id}).\\
- \const{\_POSIX\_SSIZE\_MAX} &32767& Valore massimo del tipo
+ \constd{\_POSIX\_SSIZE\_MAX} &32767& Valore massimo del tipo
\type{ssize\_t}.\\
% \const{\_POSIX\_AIO\_LISTIO\_MAX}&2& \\
% \const{\_POSIX\_AIO\_MAX} & 1& \\
\textbf{Macro}&\textbf{Significato}\\
\hline
\hline
- \macro{\_POSIX\_JOB\_CONTROL}& Il sistema supporta il
- \textit{job control} (vedi
- sez.~\ref{sec:sess_job_control}).\\
- \macro{\_POSIX\_SAVED\_IDS} & Il sistema supporta gli identificatori del
- gruppo \textit{saved} (vedi
- sez.~\ref{sec:proc_access_id})
- per il controllo di accesso dei processi.\\
- \const{\_POSIX\_VERSION} & Fornisce la versione dello standard POSIX.1
- supportata nel formato YYYYMML (ad esempio
- 199009L).\\
+ \macrod{\_POSIX\_JOB\_CONTROL}& Il sistema supporta il
+ \textit{job control} (vedi
+ sez.~\ref{sec:sess_job_control}).\\
+ \macrod{\_POSIX\_SAVED\_IDS} & Il sistema supporta gli identificatori del
+ gruppo \textit{saved} (vedi
+ sez.~\ref{sec:proc_access_id})
+ per il controllo di accesso dei processi.\\
+ \macrod{\_POSIX\_VERSION} & Fornisce la versione dello standard POSIX.1
+ supportata nel formato YYYYMML (ad esempio
+ 199009L).\\
\hline
\end{tabular}
\caption{Alcune macro definite in \headfile{limits.h} in conformità allo
\end{table}
Oltre ai precedenti valori e a quelli relativi ai file elencati in
-tab.~\ref{tab:sys_posix1_file},, che devono essere obbligatoriamente definiti,
+tab.~\ref{tab:sys_posix1_file}, che devono essere obbligatoriamente definiti,
lo standard POSIX.1 ne prevede molti altri. La lista completa si trova
dall'header file \file{bits/posix1\_lim.h}, da non usare mai direttamente (è
incluso automaticamente all'interno di \headfile{limits.h}). Di questi vale la
\texttt{\_SC\_STREAM\_MAX}& \const{STREAM\_MAX}&
Il massimo numero di stream che un processo
può mantenere aperti in contemporanea. Questo
- limite previsto anche dallo standard ANSI C,
- che specifica la macro {FOPEN\_MAX}.\\
+ limite è previsto anche dallo standard ANSI C,
+ che specifica la macro \const{FOPEN\_MAX}.\\
\texttt{\_SC\_TZNAME\_MAX}& \const{TZNAME\_MAX}&
La dimensione massima di un nome di una
\texttt{timezone} (vedi
\textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \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 \textit{pipe}
+ \constd{LINK\_MAX} &8 & Numero massimo di link a un file.\\
+ \constd{NAME\_MAX}& 14 & Lunghezza in byte di un nome di file. \\
+ \constd{PATH\_MAX}& 256 & Lunghezza in byte di un \textit{pathname}.\\
+ \constd{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
+ \constd{MAX\_CANON}&255 & Dimensione di una riga di terminale in modo
canonico (vedi sez.~\ref{sec:term_io_design}).\\
- \const{MAX\_INPUT}&255 & Spazio disponibile nella coda di input
+ \constd{MAX\_INPUT}&255 & Spazio disponibile nella coda di input
del terminale (vedi
sez.~\ref{sec:term_io_design}).\\
\hline
\textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \const{\_POSIX\_LINK\_MAX} &8 & Numero massimo di link a un file.\\
- \const{\_POSIX\_NAME\_MAX}& 14 & Lunghezza in byte di un nome di file.\\
- \const{\_POSIX\_PATH\_MAX}& 256 & Lunghezza in byte di un
+ \macrod{\_POSIX\_LINK\_MAX} &8 & Numero massimo di link a un file.\\
+ \macrod{\_POSIX\_NAME\_MAX}& 14 & Lunghezza in byte di un nome di file.\\
+ \macrod{\_POSIX\_PATH\_MAX}& 256 & Lunghezza in byte di un
\textit{pathname}.\\
- \const{\_POSIX\_PIPE\_BUF}& 512 & Byte scrivibili atomicamente in una
+ \macrod{\_POSIX\_PIPE\_BUF}& 512 & Byte scrivibili atomicamente in una
\textit{pipe}.\\
- \const{\_POSIX\_MAX\_CANON}&255 & Dimensione di una riga di
+ \macrod{\_POSIX\_MAX\_CANON}&255 & Dimensione di una riga di
terminale in modo canonico.\\
- \const{\_POSIX\_MAX\_INPUT}&255 & Spazio disponibile nella coda di input
+ \macrod{\_POSIX\_MAX\_INPUT}&255 & Spazio disponibile nella coda di input
del terminale.\\
-% \const{\_POSIX\_MQ\_OPEN\_MAX}& 8& \\
-% \const{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\
-% \const{\_POSIX\_FD\_SETSIZE}& 16 & \\
-% \const{\_POSIX\_DELAYTIMER\_MAX}& 32 & \\
+% \macrod{\_POSIX\_MQ\_OPEN\_MAX}& 8& \\
+% \macrod{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\
+% \macrod{\_POSIX\_FD\_SETSIZE}& 16 & \\
+% \macrod{\_POSIX\_DELAYTIMER\_MAX}& 32 & \\
\hline
\end{tabular}
\caption{Costanti dei valori minimi delle caratteristiche dei file per la
Si noti come in fig.~\ref{fig:sys_utsname} le dimensioni delle stringhe di
\struct{utsname} non sono specificate. Il manuale delle \acr{glibc} indica
-due costanti per queste dimensioni, \const{\_UTSNAME\_LENGTH} per i campi
-standard e \const{\_UTSNAME\_DOMAIN\_LENGTH} per quello relativo al nome di
-dominio, altri sistemi usano nomi diversi come \const{SYS\_NMLN} o
-\const{\_SYS\_NMLN} o \const{UTSLEN} che possono avere valori diversi. Dato
+due costanti per queste dimensioni, \constd{\_UTSNAME\_LENGTH} per i campi
+standard e \constd{\_UTSNAME\_DOMAIN\_LENGTH} per quello relativo al nome di
+dominio, altri sistemi usano nomi diversi come \constd{SYS\_NMLN} o
+\constd{\_SYS\_NMLN} o \constd{UTSLEN} che possono avere valori diversi. Dato
che il buffer per \struct{utsname} deve essere preallocato l'unico modo per
farlo in maniera sicura è allora usare come dimensione il valore ottenuto con
\code{sizeof(utsname)}.
mantenuto nei valori di una serie di costanti definite includendo
\headfiled{paths.h}, in particolare quelle che ci interessano sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\const{\_PATH\_UTMP}] specifica il file che contiene il registro per gli
- utenti correntemente collegati, questo è il valore che viene usato se non si
- è utilizzato \func{utmpname} per modificarlo;
-\item[\const{\_PATH\_WTMP}] specifica il file che contiene il registro per
+\item[\constd{\_PATH\_UTMP}] specifica il file che contiene il registro per
+ gli utenti correntemente collegati, questo è il valore che viene usato se
+ non si è utilizzato \func{utmpname} per modificarlo;
+\item[\constd{\_PATH\_WTMP}] specifica il file che contiene il registro per
l'archivio storico degli utenti collegati;
\end{basedescript}
che nel caso di Linux hanno un valore corrispondente ai file
\textbf{Valore} & \textbf{Significato}\\
\hline
\hline
- \const{EMPTY} & Non contiene informazioni valide.\\
- \const{RUN\_LVL} & Identica il runlevel del sistema.\\
- \const{BOOT\_TIME} & Identifica il tempo di avvio del sistema.\\
- \const{OLD\_TIME} & Identifica quando è stato modificato l'orologio di
- sistema.\\
- \const{NEW\_TIME} & Identifica da quanto è stato modificato il
- sistema.\\
- \const{INIT\_PROCESS} & Identifica un processo lanciato da \cmd{init}.\\
- \const{LOGIN\_PROCESS}& Identifica un processo di login.\\
- \const{USER\_PROCESS} & Identifica un processo utente.\\
- \const{DEAD\_PROCESS} & Identifica un processo terminato.\\
-% \const{ACCOUNTING} & ??? \\
+ \constd{EMPTY} & Non contiene informazioni valide.\\
+ \constd{RUN\_LVL} & Identica il runlevel del sistema.\\
+ \constd{BOOT\_TIME} & Identifica il tempo di avvio del sistema.\\
+ \constd{OLD\_TIME} & Identifica quando è stato modificato l'orologio di
+ sistema.\\
+ \constd{NEW\_TIME} & Identifica da quanto è stato modificato il
+ sistema.\\
+ \constd{INIT\_PROCESS} & Identifica un processo lanciato da \cmd{init}.\\
+ \constd{LOGIN\_PROCESS}& Identifica un processo di login.\\
+ \constd{USER\_PROCESS} & Identifica un processo utente.\\
+ \constd{DEAD\_PROCESS} & Identifica un processo terminato.\\
+% \constd{ACCOUNTING} & ??? \\
\hline
\end{tabular}
\caption{Classificazione delle voci del registro a seconda dei
illustra i comandi attualmente disponibili:
\begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}}
-\item[\const{LINUX\_REBOOT\_CMD\_CAD\_OFF}] Disabilita l'uso diretto della
+\item[\constd{LINUX\_REBOOT\_CMD\_CAD\_OFF}] Disabilita l'uso diretto della
combinazione \texttt{Ctrl-Alt-Del}, la cui pressione si traduce nell'invio
- del segnale \const{SIGINT} a \texttt{init} (o più in generale al processo
+ del segnale \signal{SIGINT} a \texttt{init} (o più in generale al processo
con \ids{PID} 1) il cui effetto dipende dalla configurazione di
quest'ultimo.
-\item[\const{LINUX\_REBOOT\_CMD\_CAD\_ON}] Attiva l'uso diretto della
+\item[\constd{LINUX\_REBOOT\_CMD\_CAD\_ON}] Attiva l'uso diretto della
combinazione \texttt{Ctrl-Alt-Del}, la cui pressione si traduce
nell'esecuzione dell'azione che si avrebbe avuto chiamando \func{reboot} con
il comando \const{LINUX\_REBOOT\_CMD\_RESTART}.
-\item[\const{LINUX\_REBOOT\_CMD\_HALT}] Viene inviato sulla console il
+\item[\constd{LINUX\_REBOOT\_CMD\_HALT}] Viene inviato sulla console il
messaggio ``\textit{System halted.}'' l'esecuzione viene bloccata
immediatamente ed il controllo passato al monitor nella ROM (se esiste e
l'architettura lo consente). Se non si è eseguita una sincronizzazione dei
dati su disco con \func{sync} questi saranno perduti.
-\item[\const{LINUX\_REBOOT\_CMD\_KEXEC}] viene eseguito direttamente il nuovo
+\item[\constd{LINUX\_REBOOT\_CMD\_KEXEC}] viene eseguito direttamente il nuovo
kernel che è stato opportunamente caricato in memoria da una
\func{kexec\_load} (che tratteremo a breve) eseguita in precedenza. La
funzionalità è disponibile solo a partire dal kernel 2.6.13 e se il kernel
di dover ripassare dalla inizializzazione da parte del BIOS ed il lancio del
kernel attraverso un bootloader. Se non si è eseguita una sincronizzazione
dei dati su disco con \func{sync} questi saranno perduti.
-\item[\const{LINUX\_REBOOT\_CMD\_POWER\_OFF}] Viene inviato sulla console il
+\item[\constd{LINUX\_REBOOT\_CMD\_POWER\_OFF}] Viene inviato sulla console il
messaggio ``\textit{Power down.}'' l'esecuzione viene bloccata
immediatamente e la macchina, se possibile, viene spenta. Se non si è
eseguita una sincronizzazione dei dati su disco con \func{sync} questi
saranno perduti.
-\item[\const{LINUX\_REBOOT\_CMD\_RESTART}] Viene inviato sulla console il
+\item[\constd{LINUX\_REBOOT\_CMD\_RESTART}] Viene inviato sulla console il
messaggio ``\textit{Restarting system.}'' ed avviata immediatamente la
procedura di riavvio ordinaria. Se non si è eseguita una sincronizzazione
dei dati su disco con \func{sync} questi saranno perduti.
-\item[\const{LINUX\_REBOOT\_CMD\_RESTART2}] Viene inviato sulla console il
+\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'}
\textbf{Valore} & \textbf{Significato}\\
\hline
\hline
- \const{KEXEC\_ON\_CRASH} & Il kernel caricato sarà eseguito
+ \constd{KEXEC\_ON\_CRASH} & Il kernel caricato sarà eseguito
automaticamente in caso di crollo del
sistema.\\
- \const{KEXEC\_PRESERVE\_CONTEXT}& Viene preservato lo stato dei programmi
+ \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
indicato un numero di segmento maggiore
di zero.\\
\hline
- \const{KEXEC\_ARCH\_DEFAULT} & Il kernel caricato verrà eseguito nella
+ \constd{KEXEC\_ARCH\_DEFAULT} & Il kernel caricato verrà eseguito nella
architettura corrente. \\
\texttt{KEXEC\_ARCH\_XXX} & Il kernel caricato verrà eseguito nella
architettura indicata (con \texttt{XXX}
\textbf{Valore} & \textbf{Significato}\\
\hline
\hline
- \const{RUSAGE\_SELF} & Ritorna l'uso delle risorse del processo
+ \constd{RUSAGE\_SELF} & Ritorna l'uso delle risorse del processo
corrente, che in caso di uso dei
\textit{thread} ammonta alla somma delle
risorse utilizzate da tutti i \textit{thread}
del processo.\\
- \const{RUSAGE\_CHILDREN} & Ritorna l'uso delle risorse dell'insieme dei
+ \constd{RUSAGE\_CHILDREN} & Ritorna l'uso delle risorse dell'insieme dei
processi figli di cui è ricevuto lo stato di
terminazione, che a loro volta comprendono
quelle dei loro figli e così via.\\
- \const{RUSAGE\_THREAD} & Ritorna l'uso delle risorse del \textit{thread}
+ \constd{RUSAGE\_THREAD} & Ritorna l'uso delle risorse del \textit{thread}
chiamante.\\
\hline
\end{tabular}
2.6.9, nonostante questo fosse esplicitamente proibito dallo standard POSIX.1,
l'uso di \const{RUSAGE\_CHILDREN} comportava l'inserimento dell'ammontare
delle risorse usate dai processi figli anche quando si era impostata una
-azione di \const{SIG\_IGN} per il segnale \const{SIGCHLD} (per i segnali si
+azione di \const{SIG\_IGN} per il segnale \signal{SIGCHLD} (per i segnali si
veda cap.~\ref{cha:signals}). Il comportamento è stato corretto per aderire
allo standard a partire dal kernel 2.6.9.
riportati nel seguente elenco:
\begin{basedescript}{\desclabelwidth{2.2cm}}%\desclabelstyle{\nextlinelabel}}
-\item[\const{RLIMIT\_AS}] Questa risorsa indica, in byte, la dimensione
+\item[\constd{RLIMIT\_AS}] Questa risorsa indica, in byte, la dimensione
massima consentita per la memoria virtuale di un processo, il cosiddetto
\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
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
+\item[\constd{RLIMIT\_CORE}] Questa risorsa indica, in byte, la massima
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 \textit{core dump}.
-\item[\const{RLIMIT\_CPU}] Questa risorsa indica, in secondi, il massimo tempo
+\item[\constd{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
superamento del limite corrente comporta l'emissione di un segnale di
\signal{SIGXCPU}, la cui azione predefinita (vedi
intercettare sempre \signal{SIGXCPU} e terminare in maniera ordinata il
processo con la prima ricezione.
-\item[\const{RLIMIT\_DATA}] Questa risorsa indica, in byte, la massima
+\item[\constd{RLIMIT\_DATA}] Questa risorsa indica, in byte, la massima
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}.
-\item[\const{RLIMIT\_FSIZE}] Questa risorsa indica, in byte, la massima
+\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
scrivere o di estendere il file oltre questa dimensione riceverà un segnale
di \signal{SIGXFSZ}, che di norma termina il processo. Se questo segnale
viene intercettato la \textit{system call} che ha causato l'errore fallirà
con un errore di \errcode{EFBIG}.
-\item[\const{RLIMIT\_LOCKS}] Questa risorsa indica il numero massimo di
+\item[\constd{RLIMIT\_LOCKS}] Questa risorsa indica il numero massimo di
\textit{file lock} (vedi sez.~\ref{sec:file_locking}) e di \textit{file
lease} (vedi sez.~\ref{sec:file_asyncronous_lease}) che un processo poteva
effettuare. È un limite presente solo nelle prime versioni del kernel 2.4,
pertanto non deve essere più utilizzato.
-\item[\const{RLIMIT\_MEMLOCK}] Questa risorsa indica, in byte, l'ammontare
+\item[\constd{RLIMIT\_MEMLOCK}] Questa risorsa indica, in byte, l'ammontare
massimo di memoria che può essere bloccata in RAM da un processo (vedi
sez.~\ref{sec:proc_mem_lock}). Dato che il \textit{memory locking} viene
effettuato sulle pagine di memoria, il valore indicato viene automaticamente
la semantica della risorsa cambiata.
-\item[\const{RLIMIT\_MSGQUEUE}] Questa risorsa indica il numero massimo di
+\item[\constd{RLIMIT\_MSGQUEUE}] Questa risorsa indica il numero massimo di
byte che possono essere utilizzati da un utente, identificato con
l'\ids{UID} reale del processo chiamante, per le code di messaggi POSIX
(vedi sez.~\ref{sec:ipc_posix_mq}). Per ciascuna coda che viene creata viene
messaggi vuoti che comunque richiede delle risorse di gestione. Questa risorsa
è stata introdotta con il kernel 2.6.8.
-\item[\const{RLIMIT\_NICE}] Questa risorsa indica il numero massimo a cui può
+\item[\constd{RLIMIT\_NICE}] Questa risorsa indica il numero massimo a cui può
essere il portato il valore di \textit{nice} (vedi
sez.~\ref{sec:proc_sched_stand}). Dato che non possono essere usati numeri
negativi per specificare un limite, il valore di \textit{nice} viene
calcolato come \code{20-rlim\_cur}. Questa risorsa è stata introdotta con il
kernel 2.6.12.
-\item[\const{RLIMIT\_NOFILE}] Questa risorsa indica il numero massimo di file
+\item[\constd{RLIMIT\_NOFILE}] Questa risorsa indica il numero massimo di file
che un processo può aprire. Il tentativo di creazione di un ulteriore file
descriptor farà fallire la funzione (\func{open}, \func{dup}, \func{pipe},
ecc.) con un errore \errcode{EMFILE}.
-\item[\const{RLIMIT\_NPROC}] Questa risorsa indica il numero massimo di
+\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
processo chiamante. Se il limite viene raggiunto \func{fork} fallirà con un
\errcode{EAGAIN}.
-\item[\const{RLIMIT\_RSS}] Questa risorsa indica, in pagine di memoria, la
+\item[\constd{RLIMIT\_RSS}] Questa risorsa indica, in pagine di memoria, la
dimensione massima della memoria residente (il cosiddetto RSS
\itindex{Resident~Set~Size~(RSS)} \textit{Resident Set Size}) cioè
l'ammontare della memoria associata al processo che risiede effettivamente
sez.~\ref{sec:file_memory_map}). Presente solo sui i kernel precedenti il
2.4.30.
-\item[\const{RLIMIT\_RTPRIO}] Questa risorsa indica il valore massimo della
+\item[\constd{RLIMIT\_RTPRIO}] Questa risorsa indica il valore massimo della
priorità statica che un processo può assegnarsi o assegnare con
\func{sched\_setscheduler} e \func{sched\_setparam} (vedi
sez.~\ref{sec:proc_real_time}). Il limite è stato introdotto a partire dal
priorità statica ed utilizzare una politica di \textit{scheduling} di tipo
\textit{real-time}.
-\item[\const{RLIMIT\_RTTIME}] Questa risorsa indica, in microsecondi, il tempo
+\item[\constd{RLIMIT\_RTTIME}] Questa risorsa indica, in microsecondi, il tempo
massimo di CPU che un processo eseguito con una priorità statica può
consumare. Il superamento del limite corrente comporta l'emissione di un
segnale di \signal{SIGXCPU}, e quello del limite massimo di \signal{SIGKILL}
kernel 2.6.25 per impedire che un processo \textit{real-time} possa bloccare
il sistema.
-\item[\const{RLIMIT\_SIGPENDING}] Questa risorsa indica il numero massimo di
+\item[\constd{RLIMIT\_SIGPENDING}] Questa risorsa indica il numero massimo di
segnali che possono essere mantenuti in coda per ciascun utente,
identificato per \ids{UID} reale. Il limite comprende sia i segnali normali
che quelli \textit{real-time} (vedi sez.~\ref{sec:sig_real_time}) ed è
segnale che non sia già presente su una coda. Questo limite è stato
introdotto con il kernel 2.6.8.
-\item[\const{RLIMIT\_STACK}] Questa risorsa indica, in byte, la massima
+\item[\constd{RLIMIT\_STACK}] Questa risorsa indica, in byte, la massima
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}.
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
+espresso come multiplo della costante \constd{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}.
Come accennato in sez.~\ref{sec:sys_resource_use} per i kernel precedenti la
versione 2.6.9 il tempo di processore dei processi figli veniva sommato
-comunque chiedendo di ignorare \const{SIGCHLD} anche se lo standard POSIX
+comunque chiedendo di ignorare \signal{SIGCHLD} anche se lo standard POSIX
richiede esplicitamente che questo avvenga solo quando si riceve lo stato di
uscita con una funzione della famiglia delle \func{wait}, anche in questo caso
il comportamento è stato adeguato allo standard a partire dalla versione
\textbf{Nome} & \textbf{Valore} & \textbf{Significato}\\
\hline
\hline
- \const{TIME\_OK} & 0 & Orologio sincronizzato.\\
- \const{TIME\_INS} & 1 & Inserimento di un \textit{leap second}.\\
- \const{TIME\_DEL} & 2 & Cancellazione di un \textit{leap second}.\\
- \const{TIME\_OOP} & 3 & \textit{leap second} in corso.\\
- \const{TIME\_WAIT} & 4 & \textit{leap second} avvenuto.\\
- \const{TIME\_BAD} & 5 & Orologio non sincronizzato.\\
+ \constd{TIME\_OK} & 0 & Orologio sincronizzato.\\
+ \constd{TIME\_INS} & 1 & Inserimento di un \textit{leap second}.\\
+ \constd{TIME\_DEL} & 2 & Cancellazione di un \textit{leap second}.\\
+ \constd{TIME\_OOP} & 3 & \textit{leap second} in corso.\\
+ \constd{TIME\_WAIT} & 4 & \textit{leap second} avvenuto.\\
+ \constd{TIME\_BAD} & 5 & Orologio non sincronizzato.\\
\hline
\end{tabular}
\caption{Possibili valori ritornati da \func{adjtimex} in caso di successo.}
\textbf{Nome} & \textbf{Valore} & \textbf{Significato}\\
\hline
\hline
- \const{ADJ\_OFFSET} & 0x0001 & Imposta la differenza fra il tempo
+ \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}.\\
- \const{ADJ\_FREQUENCY} & 0x0002 & Imposta la differenza in frequenza
+ \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}.\\
- \const{ADJ\_MAXERROR} & 0x0004 & Imposta il valore massimo
+ \constd{ADJ\_MAXERROR} & 0x0004 & Imposta il valore massimo
dell'errore sul tempo, espresso in
microsecondi nel campo
\var{maxerror} di \struct{timex}.\\
- \const{ADJ\_ESTERROR} & 0x0008 & Imposta la stima dell'errore
+ \constd{ADJ\_ESTERROR} & 0x0008 & Imposta la stima dell'errore
sul tempo, espresso in microsecondi
nel campo \var{esterror} di
\struct{timex}.\\
- \const{ADJ\_STATUS} & 0x0010 & Imposta alcuni valori di stato
+ \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}.\\
- \const{ADJ\_TIMECONST} & 0x0020 & Imposta la larghezza di banda del
+ \constd{ADJ\_TIMECONST} & 0x0020 & Imposta la larghezza di banda del
PLL implementato dal kernel,
specificato nel campo
\var{constant} di \struct{timex}.\\
- \const{ADJ\_TICK} & 0x4000 & Imposta il valore dei \textit{tick}
+ \constd{ADJ\_TICK} & 0x4000 & Imposta il valore dei \textit{tick}
del timer in
microsecondi, espresso nel campo
\var{tick} di \struct{timex}.\\
- \const{ADJ\_OFFSET\_SINGLESHOT}&0x8001&Chiede uno spostamento una tantum
+ \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}.\\
-%% tcpsock.tex
+bg%% tcpsock.tex
%%
%% Copyright (C) 2000-2015 Simone Piccardi. Permission is granted to
%% copy, distribute and/or modify this document under the terms of the GNU Free
implementazioni.
In Linux il significato di questo valore è cambiato a partire dal kernel 2.2
-per prevenire l'attacco chiamato \index{SYN~flood} \textit{SYN flood}. Questo
-si basa sull'emissione da parte dell'attaccante di un grande numero di
-pacchetti SYN indirizzati verso una porta, forgiati con indirizzo IP
+per prevenire l'attacco chiamato \itindex{SYN~flood} \textit{SYN
+ flood}. Questo si basa sull'emissione da parte dell'attaccante di un grande
+numero di pacchetti SYN indirizzati verso una porta, forgiati con indirizzo IP
fasullo\footnote{con la tecnica che viene detta \textit{ip spoofing}.} così
che i SYN$+$ACK vanno perduti e la coda delle connessioni incomplete viene
saturata, impedendo di fatto ulteriori connessioni.
possibili condizioni di errore dovute alla rete. Occorre allora specificare
chiaramente quali sono le condizioni per cui un socket risulta essere
``\textsl{pronto}'' quando viene passato come membro di uno dei tre
-\itindex{file~descriptor~set} \textit{file descriptor set} usati da
-\func{select}.
+\textit{file descriptor set} usati da \func{select}.
Le condizioni che fanno si che la funzione \func{select} ritorni segnalando
che un socket (che sarà riportato nel primo insieme di file descriptor) è
allegati alla guida.
In questo caso la funzione comincia (\texttt{\small 8--9}) con l'azzeramento
-del \itindex{file~descriptor~set} \textit{file descriptor set} \var{fset} e
-l'impostazione del valore \var{maxfd}, da passare a \func{select} come massimo
-per il numero di file descriptor. Per determinare quest'ultimo si usa la macro
-\code{max} definita nel nostro file \file{macro.h} che raccoglie una
-collezione di macro di preprocessore di varia utilità.
+del \textit{file descriptor set} \var{fset} e l'impostazione del valore
+\var{maxfd}, da passare a \func{select} come massimo per il numero di file
+descriptor. Per determinare quest'ultimo si usa la macro \code{max} definita
+nel nostro file \file{macro.h} che raccoglie una collezione di macro di
+preprocessore di varia utilità.
La funzione prosegue poi (\texttt{\small 10--41}) con il ciclo principale, che
viene ripetuto indefinitamente. Per ogni ciclo si reinizializza
-(\texttt{\small 11--12}) il \itindex{file~descriptor~set} \textit{file
- descriptor set}, impostando i valori per il file descriptor associato al
-socket \var{socket} e per lo standard input (il cui valore si recupera con la
-funzione \func{fileno}). Questo è necessario in quanto la successiva
-(\texttt{\small 13}) chiamata a \func{select} comporta una modifica dei due
-bit relativi, che quindi devono essere reimpostati all'inizio di ogni ciclo.
+(\texttt{\small 11--12}) il \textit{file descriptor set}, impostando i valori
+per il file descriptor associato al socket \var{socket} e per lo standard
+input (il cui valore si recupera con la funzione \func{fileno}). Questo è
+necessario in quanto la successiva (\texttt{\small 13}) chiamata a
+\func{select} comporta una modifica dei due bit relativi, che quindi devono
+essere reimpostati all'inizio di ogni ciclo.
Si noti come la chiamata a \func{select} venga eseguita usando come primo
argomento il valore di \var{maxfd}, precedentemente calcolato, e passando poi
-il solo \itindex{file~descriptor~set} \textit{file descriptor set} per il
-controllo dell'attività in lettura, negli altri argomenti sono passati tutti
-puntatori nulli, non interessando né il controllo delle altre attività, né
-l'impostazione di un valore di timeout.
+il solo \textit{file descriptor set} per il controllo dell'attività in
+lettura, negli altri argomenti sono passati tutti puntatori nulli, non
+interessando né il controllo delle altre attività, né l'impostazione di un
+valore di timeout.
Al ritorno di \func{select} si provvede a controllare quale dei due file
descriptor presenta attività in lettura, cominciando (\texttt{\small 14--24})
prima (\texttt{\small 19}) si imposta opportunamente \var{eof} ad un valore
non nullo, dopo di che (\texttt{\small 20}) si effettua la chiusura del lato
in scrittura del socket con \func{shutdown}. Infine (\texttt{\small 21}) si
-usa la macro \macro{FD\_CLR} per togliere lo standard input dal
-\itindex{file~descriptor~set} \textit{file descriptor set}.
+usa la macro \macro{FD\_CLR} per togliere lo standard input dal \textit{file
+ descriptor set}.
In questo modo anche se la lettura del file in ingresso è conclusa, la
funzione non esce dal ciclo principale (\texttt{\small 11--50}), ma continua
alto.} che verrà anche (\texttt{\small 4}) inserito nella tabella.
La prima sezione (\texttt{\small 7--10}) del ciclo principale esegue la
-costruzione del \itindex{file~descriptor~set} \textit{file descriptor set}
-\var{fset} in base ai socket connessi in un certo momento; all'inizio ci sarà
-soltanto il socket in ascolto, ma nel prosieguo delle operazioni, verranno
-utilizzati anche tutti i socket connessi registrati nella tabella
-\var{fd\_open}. Dato che la chiamata di \func{select} modifica il valore del
-\itindex{file~descriptor~set} \textit{file descriptor set}, è necessario
-ripetere (\texttt{\small 7}) ogni volta il suo azzeramento, per poi procedere
-con il ciclo (\texttt{\small 8--10}) in cui si impostano i socket trovati
-attivi.
+costruzione del \textit{file descriptor set} \var{fset} in base ai socket
+connessi in un certo momento; all'inizio ci sarà soltanto il socket in
+ascolto, ma nel prosieguo delle operazioni, verranno utilizzati anche tutti i
+socket connessi registrati nella tabella \var{fd\_open}. Dato che la chiamata
+di \func{select} modifica il valore del \textit{file descriptor set}, è
+necessario ripetere (\texttt{\small 7}) ogni volta il suo azzeramento, per poi
+procedere con il ciclo (\texttt{\small 8--10}) in cui si impostano i socket
+trovati attivi.
Per far questo si usa la caratteristica dei file descriptor, descritta in
sez.~\ref{sec:file_open_close}, per cui il kernel associa sempre ad ogni nuovo
diverso da zero; in questo modo se l'unico socket con attività era quello
connesso, avendo opportunamente decrementato il contatore, il ciclo verrà
saltato, e si ritornerà immediatamente (ripetuta l'inizializzazione del
-\itindex{file~descriptor~set} \textit{file descriptor set} con i nuovi valori
-nella tabella) alla chiamata di \func{accept}. Se il socket attivo non è
-quello in ascolto, o ce ne sono comunque anche altri, il valore di \var{n} non
-sarà nullo ed il controllo sarà eseguito. Prima di entrare nel ciclo comunque
-si inizializza (\texttt{\small 28}) il valore della variabile \var{i} che
-useremo come indice nella tabella \var{fd\_open} al valore minimo,
-corrispondente al file descriptor del socket in ascolto.
+\textit{file descriptor set} con i nuovi valori nella tabella) alla chiamata
+di \func{accept}. Se il socket attivo non è quello in ascolto, o ce ne sono
+comunque anche altri, il valore di \var{n} non sarà nullo ed il controllo sarà
+eseguito. Prima di entrare nel ciclo comunque si inizializza (\texttt{\small
+ 28}) il valore della variabile \var{i} che useremo come indice nella tabella
+\var{fd\_open} al valore minimo, corrispondente al file descriptor del socket
+in ascolto.
Il primo passo (\texttt{\small 30}) nella verifica è incrementare il valore
dell'indice \var{i} per posizionarsi sul primo valore possibile per un file
queste problematiche con i socket. Abbiamo però visto in
sez.~\ref{sec:file_multiplexing} come la funzione \func{poll} possa costituire
una alternativa a \func{select}, con alcuni vantaggi.\footnote{non soffrendo
- delle limitazioni dovute all'uso dei \itindex{file~descriptor~set}
- \textit{file descriptor set}.}
+ delle limitazioni dovute all'uso dei \textit{file descriptor set}.}
Ancora una volta in sez.~\ref{sec:file_poll} abbiamo trattato la funzione in
maniera generica, parlando di file descriptor, ma come per \func{select}
Come si può notare la logica del programma è identica a quella vista in
fig.~\ref{fig:TCP_SelectEchod} per l'analogo server basato su \func{select};
la sola differenza significativa è che in questo caso non c'è bisogno di
-rigenerare i \itindex{file~descriptor~set} \textit{file descriptor set} in
-quanto l'uscita è indipendente dai dati in ingresso. Si applicano comunque
-anche a questo server le considerazioni finali di
-sez.~\ref{sec:TCP_serv_select}.
-
+rigenerare i \textit{file descriptor set} in quanto l'uscita è indipendente
+dai dati in ingresso. Si applicano comunque anche a questo server le
+considerazioni finali di sez.~\ref{sec:TCP_serv_select}.