From: Simone Piccardi Date: Sun, 27 May 2012 16:17:11 +0000 (+0000) Subject: Ancora sui timer e rimessi i prototipi delle funzioni X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=2d5c67fed156b7024346332bbde01e31ea5792e9;p=gapil.git Ancora sui timer e rimessi i prototipi delle funzioni --- diff --git a/filedir.tex b/filedir.tex index 2891b77..8b1f942 100644 --- a/filedir.tex +++ b/filedir.tex @@ -6798,10 +6798,10 @@ operazioni si rimanda alla rilettura di sez.~\ref{sec:process_prctl}. \itindend{file~capabilities} -% TODO verificare per process capability bounding set, vedi: -% http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3b7391de67da515c91f48aa371de77cb6cc5c07e +% NOTE per dati relativi al process capability bounding set, vedi: +% http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3b7391de67da515c91f48aa371de77cb6cc5c07e -% TODO capire cosa cambia con i patch vari, vedi +% NOTE riferimenti ai vari cambiamenti vedi: % http://lwn.net/Articles/280279/ % http://lwn.net/Articles/256519/ % http://lwn.net/Articles/211883/ @@ -6812,7 +6812,7 @@ breve descrizione ed il nome delle costanti che le identificano, è riportato in tab.~\ref{tab:proc_capabilities};\footnote{l'elenco presentato questa tabella, ripreso dalla pagina di manuale (accessibile con \texttt{man capabilities}) e dalle definizioni in - \texttt{include/linux/capabilities.h}, è aggiornato al kernel 2.6.26.} la + \texttt{include/linux/capabilities.h}, è aggiornato al kernel 3.2.} la tabella è divisa in due parti, la prima riporta le \textit{capabilities} previste anche nella bozza dello standard POSIX1.e, la seconda quelle specifiche di Linux. Come si può notare dalla tabella alcune @@ -6893,57 +6893,51 @@ opportuno dettagliare maggiormente. sez.~\ref{sec:file_asyncronous_lease}) pur non essendo proprietari del file (dal kernel 2.4).\\ - \const{CAP\_LINUX\_IMMUTABLE}& Impostare sui file gli - attributi \textit{immutable} e - \itindex{append~mode} \textit{append-only} (vedi + \const{CAP\_LINUX\_IMMUTABLE}& Impostare sui file gli attributi + \textit{immutable} e \itindex{append~mode} + \textit{append-only} (vedi sez.~\ref{sec:file_perm_overview}) se supportati.\\ - \const{CAP\_MKNOD} & Creare - \index{file!di~dispositivo} file di dispositivo - con \func{mknod} (vedi + \const{CAP\_MKNOD} & Creare \index{file!di~dispositivo} file di + dispositivo con \func{mknod} (vedi sez.~\ref{sec:file_mknod}) (dal kernel 2.4).\\ \const{CAP\_NET\_ADMIN} & Eseguire alcune operazioni privilegiate sulla rete.\\ - \const{CAP\_NET\_BIND\_SERVICE}& Porsi in ascolto - su porte riservate (vedi + \const{CAP\_NET\_BIND\_SERVICE}& Porsi in ascolto su porte riservate (vedi sez.~\ref{sec:TCP_func_bind}).\\ \const{CAP\_NET\_BROADCAST}& Consentire l'uso di socket in \itindex{broadcast} \textit{broadcast} e \itindex{multicast} \textit{multicast}.\\ - \const{CAP\_NET\_RAW} & Usare socket \texttt{RAW} e - \texttt{PACKET} (vedi sez.~\ref{sec:sock_type}).\\ + \const{CAP\_NET\_RAW} & Usare socket \texttt{RAW} e \texttt{PACKET} + (vedi sez.~\ref{sec:sock_type}).\\ \const{CAP\_SETPCAP} & Effettuare modifiche privilegiate alle \textit{capabilities}.\\ - \const{CAP\_SYS\_ADMIN} & Eseguire una serie di compiti - amministrativi.\\ - \const{CAP\_SYS\_BOOT} & Eseguire un riavvio del - sistema (vedi sez.~\ref{sec:sys_reboot}).\\ - \const{CAP\_SYS\_CHROOT}& Eseguire la funzione - \func{chroot} (vedi sez.~\ref{sec:file_chroot}).\\ + \const{CAP\_SYS\_ADMIN} & Eseguire una serie di compiti amministrativi.\\ + \const{CAP\_SYS\_BOOT} & Eseguire un riavvio del sistema (vedi + sez.~\ref{sec:sys_reboot}).\\ + \const{CAP\_SYS\_CHROOT}& Eseguire la funzione \func{chroot} (vedi + sez.~\ref{sec:file_chroot}).\\ \const{CAP\_MAC\_ADMIN} & Amministrare il \textit{Mandatory Access Control} di Smack (dal kernel 2.6.25).\\ \const{CAP\_MAC\_OVERRIDE}& Evitare il \textit{Mandatory Access Control} di Smack (dal kernel 2.6.25).\\ - \const{CAP\_SYS\_MODULE}& Caricare e rimuovere moduli del - kernel.\\ - \const{CAP\_SYS\_NICE} & Modificare le varie priorità dei - processi (vedi sez.~\ref{sec:proc_priority}).\\ - \const{CAP\_SYS\_PACCT} & Usare le funzioni di - \textit{accounting} dei processi (vedi - sez.~\ref{sec:sys_bsd_accounting}).\\ + \const{CAP\_SYS\_MODULE}& Caricare e rimuovere moduli del kernel.\\ + \const{CAP\_SYS\_NICE} & Modificare le varie priorità dei processi (vedi + sez.~\ref{sec:proc_priority}).\\ + \const{CAP\_SYS\_PACCT} & Usare le funzioni di \textit{accounting} dei + processi (vedi + sez.~\ref{sec:sys_bsd_accounting}).\\ \const{CAP\_SYS\_PTRACE}& La capacità di tracciare qualunque processo con \func{ptrace} (vedi sez.~\ref{sec:process_ptrace}).\\ - \const{CAP\_SYS\_RAWIO} & Operare sulle porte - di I/O con \func{ioperm} e \func{iopl} (vedi + \const{CAP\_SYS\_RAWIO} & Operare sulle porte di I/O con \func{ioperm} e + \func{iopl} (vedi sez.~\ref{sec:process_io_port}).\\ - \const{CAP\_SYS\_RESOURCE}& Superare le varie limitazioni - sulle risorse.\\ - \const{CAP\_SYS\_TIME} & Modificare il tempo di sistema - (vedi sez.~\ref{sec:sys_time}).\\ - \const{CAP\_SYS\_TTY\_CONFIG}&Simulare un \textit{hangup} - della console, con la funzione - \func{vhangup}.\\ + \const{CAP\_SYS\_RESOURCE}& Superare le varie limitazioni sulle risorse.\\ + \const{CAP\_SYS\_TIME} & Modificare il tempo di sistema (vedi + sez.~\ref{sec:sys_time}).\\ + \const{CAP\_SYS\_TTY\_CONFIG}&Simulare un \textit{hangup} della console, + con la funzione \func{vhangup}.\\ \const{CAP\_SYSLOG} & Gestire il buffer dei messaggi del kernel, (vedi sez.~\ref{sec:sess_daemon}), introdotta dal kernel 2.6.38 come capacità diff --git a/signal.tex b/signal.tex index d1a744a..2d0fa2c 100644 --- a/signal.tex +++ b/signal.tex @@ -3012,23 +3012,24 @@ tab.~\ref{tab:sig_timer_clockid_types}. specificato) che non può essere modificato e non cambia neanche in caso di reimpostazione dell'orologio di sistema.\\ - \const{CLOCK\_MONOTONIC\_RAW}&Simile al precedente, ma non subisce gli - aggiustamenti dovuti all'uso di NTP (viene - usato per fare riferimento ad una fonte - hardware). Questo orologio è specifico di - Linux, ed è disponibile a partire dal kernel - 2.6.28.\\ - \const{CLOCK\_PROCESS\_CPUTIME\_ID}& contatore del tempo di CPU usato + \const{CLOCK\_PROCESS\_CPUTIME\_ID}& Contatore del tempo di CPU usato da un processo (il \textit{process time} di sez.~\ref{sec:sys_cpu_times}, nel totale di \textit{system time} e \textit{user time}) comprensivo di tutto il tempo di CPU usato da eventuali \itindex{thread} \textit{thread}.\\ - \const{CLOCK\_THREAD\_CPUTIME\_ID}& contatore del tempo di CPU + \const{CLOCK\_THREAD\_CPUTIME\_ID}& Contatore del tempo di CPU (\textit{user time} e \textit{system time}) usato da un singolo \itindex{thread} \textit{thread}.\\ + \hline + \const{CLOCK\_MONOTONIC\_RAW}&Simile al precedente, ma non subisce gli + aggiustamenti dovuti all'uso di NTP (viene + usato per fare riferimento ad una fonte + hardware). Questo orologio è specifico di + Linux, ed è disponibile a partire dal kernel + 2.6.28.\\ \const{CLOCK\_BOOTTIME} & Identico a \const{CLOCK\_MONOTONIC} ma tiene conto anche del tempo durante il quale il sistema è stato sospeso (nel caso di @@ -3055,18 +3056,17 @@ tab.~\ref{tab:sig_timer_clockid_types}. \end{table} -% TODO: aggiungere le estensioni introdotte con il 2.6.38, verificandone il +% Note: aggiungere le estensioni introdotte, verificandone il % funzionamento, vedi http://lwn.net/Articles/429595/ -% TODO: dal 2.6.39 anche CLOCK_BOOTTIME_ALARM e CLOCK_BOOTTIME -% TODO: dal 3.0 anche i cosiddetti Posix Alarm Timers, con +% NOTE: dal 2.6.39 anche CLOCK_BOOTTIME_ALARM e CLOCK_BOOTTIME +% NOTE: dal 3.0 anche i cosiddetti Posix Alarm Timers, con % CLOCK_REALTIME_ALARM vedi http://lwn.net/Articles/429925/ Per poter utilizzare queste funzionalità le \acr{glibc} richiedono che la macro \macro{\_POSIX\_C\_SOURCE} sia definita ad un valore maggiore o uguale di \texttt{199309L} (vedi sez.~\ref{sec:intro_gcc_glibc_std}), inoltre i programmi che le usano devono essere collegati con la libreria delle -estensioni \textit{real-time} usando esplicitamente l'opzione -\texttt{-lrt}. +estensioni \textit{real-time} usando esplicitamente l'opzione \texttt{-lrt}. Si tenga presente inoltre che la disponibilità di queste funzionalità avanzate può essere controllato dalla definizione della macro \macro{\_POSIX\_TIMERS} @@ -3111,9 +3111,10 @@ tab.~\ref{tab:sig_timer_clockid_types} o con il risultato di una chiamata a \func{clock\_getcpuclockid} (che tratteremo a breve), il secondo argomento invece è sempre il puntatore \param{tp} ad una struttura \struct{timespec} (vedi fig.~\ref{fig:sys_timespec_struct}) che deve essere stata -precedentemente allocata; nel primo caso questa dovrà anche essere stata -inizializzata con il valore che si vuole impostare sull'orologio, mentre nel -secondo verrà restituito al suo interno il valore corrente dello stesso. +precedentemente allocata. Per \func{clock\_settime} questa dovrà anche essere +stata inizializzata con il valore che si vuole impostare sull'orologio, mentre +per \func{clock\_gettime} verrà restituito al suo interno il valore corrente +dello stesso. Si tenga presente inoltre che per eseguire un cambiamento sull'orologio generale di sistema \const{CLOCK\_REALTIME} occorrono i privilegi @@ -3129,29 +3130,30 @@ possibilità di modifiche anche per \const{CLOCK\_PROCESS\_CPUTIME\_ID} e \const{CLOCK\_THREAD\_CPUTIME\_ID}, il kernel non le consente. Oltre alle due funzioni precedenti, lo standard POSIX prevede una terza -funzione che consenta di ottenere la risoluzione effettiva fornita da un certo -orologio, la funzione è \funcd{clock\_getres} ed il suo prototipo è: -\begin{functions} - \headdecl{time.h} +funzione di sistema che consenta di ottenere la risoluzione effettiva fornita +da un certo orologio, la funzione è \funcd{clock\_getres} ed il suo prototipo +è: - \funcdecl{int clock\_getres(clockid\_t clockid, struct timespec *res)} - - Legge la risoluzione di un orologio \textit{real-time}. - - \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di - errore, nel qual caso \var{errno} assumerà uno dei seguenti valori: +\begin{funcproto}{ +\fhead{time.h} +\fdecl{int clock\_getres(clockid\_t clockid, struct timespec *res)} +\fdesc{Legge la risoluzione di un orologio \textit{real-time}.} +} + +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual + caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{EFAULT}] l'indirizzo di \param{res} non è valido. \item[\errcode{EINVAL}] il valore specificato per \param{clockid} non è valido. \end{errlist} } -\end{functions} +\end{funcproto} La funzione richiede come primo argomento l'indicazione dell'orologio di cui si vuole conoscere la risoluzione (effettuata allo stesso modo delle due precedenti) e questa verrà restituita in una struttura \struct{timespec} -all'indirizzo puntato dall'argomento \param{res}. +all'indirizzo puntato dall'argomento \param{res}. Come accennato il valore di questa risoluzione dipende sia dall'hardware disponibile che dalla implementazione delle funzioni, e costituisce il limite @@ -3159,6 +3161,18 @@ minimo di un intervallo di tempo che si può indicare. Qualunque valore si voglia utilizzare nelle funzioni di impostazione che non corrisponda ad un multiplo intero di questa risoluzione, sarà troncato in maniera automatica. +Gli orologi elencati nella seconda sezione di +tab.~\ref{tab:sig_timer_clockid_types} sono delle estensioni specifiche di +Linux, create per rispondere ad alcune esigenze specifiche, come quella di +tener conto di eventuali periodi di sospensione del sistema, e presenti solo +nelle versioni più recenti del kernel. In particolare gli ultimi due, +contraddistinti dal suffusso \texttt{\_ALARM}, hanno un impiego particolare, +derivato dalle esigenze emerse con Android per l'uso di Linux sui cellulari, +che consente di creare timer che possono scattare, riattivando il sistema, +anche quando questo è in sospensione. Per il loro utilizzo è prevista la +necessità di una capacità specifica, \const{CAP\_WAKE\_ALARM} (vedi +sez.~\ref{sec:proc_capabilities}). + Si tenga presente inoltre che con l'introduzione degli \textit{high resolution timer} i due orologi \const{CLOCK\_PROCESS\_CPUTIME\_ID} e \const{CLOCK\_THREAD\_CPUTIME\_ID} fanno riferimento ai contatori presenti in @@ -3187,27 +3201,27 @@ Per poter gestire questo tipo di problematiche lo standard ha previsto una apposita funzione che sia in grado di ottenere l'identificativo dell'orologio associato al \textit{process time} di un processo, la funzione è \funcd{clock\_getcpuclockid} ed il suo prototipo è: -\begin{functions} - \headdecl{time.h} - \funcdecl{int clock\_getcpuclockid(pid\_t pid, clockid\_t *clockid)} - - Ottiene l'identificatore dell'orologio di CPU usato da un processo. - - \bodydesc{La funzione restituisce 0 in caso di successo o un numero positivo - in caso di errore, nel qual caso \var{errno} assumerà uno dei seguenti - valori: +\begin{funcproto}{ +\fhead{time.h} +\fdecl{int clock\_getcpuclockid(pid\_t pid, clockid\_t *clockid)} +\fdesc{Ottiene l'identificatore dell'orologio di CPU usato da un processo.} +} + +{La funzione ritorna $0$ in caso di successo ed un numero positivo per un + errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{ENOSYS}] non c'è il supporto per ottenere l'orologio relativo al \textit{process time} di un altro processo, e \param{pid} non corrisponde al processo corrente. \item[\errcode{EPERM}] il chiamante non ha il permesso di accedere alle - informazioni relative al processo \param{pid}. + informazioni relative al processo \param{pid}, avviene solo se è + disponibile il supporto per leggere l'orologio relativo ad un altro + processo. \item[\errcode{ESRCH}] non esiste il processo \param{pid}. \end{errlist} } -\end{functions} - +\end{funcproto} La funzione ritorna l'identificativo di un orologio di sistema associato ad un processo indicato tramite l'argomento \param{pid}. Un utente normale, posto @@ -3216,59 +3230,58 @@ può accedere soltanto ai dati relativi ai propri processi. Del tutto analoga a \func{clock\_getcpuclockid}, ma da utilizzare per ottenere l'orologio associato ad un \textit{thread} invece che a un processo, è -\funcd{pthread\_getcpuclockid},\footnote{per poter usare la funzione, come per +\funcd{pthread\_getcpuclockid},\footnote{per poterla utilizzare, come per qualunque funzione che faccia riferimento ai \textit{thread}, occorre effettuare il collegamento alla relativa libreria di gestione compilando il programma con \texttt{-lpthread}.} il cui prototipo è: -\begin{functions} - \headdecl{pthread.h} - \headdecl{time.h} - \funcdecl{int pthread\_getcpuclockid(pthread\_t thread, clockid\_t *clockid)} - - Ottiene l'identificatore dell'orologio di CPU associato ad un - \textit{thread}. - - \bodydesc{La funzione restituisce 0 in caso di successo o un numero positivo - in caso di errore, nel qual caso \var{errno} assumerà uno dei seguenti - valori: +\begin{funcproto}{ +\fhead{pthread.h} +\fhead{time.h} +\fdecl{int pthread\_getcpuclockid(pthread\_t thread, clockid\_t *clockid)} +\fdesc{Ottiene l'identificatore dell'orologio di CPU associato ad un + \textit{thread}.} +} + +{La funzione ritorna $0$ in caso di successo ed un numero positivo per un + errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{ENOENT}] la funzione non è supportata dal sistema. \item[\errcode{ESRCH}] non esiste il \textit{thread} identificato - da \param{thread}. \end{errlist} -} -\end{functions} + } +\end{funcproto} -% TODO, dal 2.6.39 aggiunta clock_adjtime +% TODO, dal 2.6.39 aggiunta clock_adjtime % TODO manca clock_nanosleep, referenziata in sez.~\ref{sec:sig_gen_beha} Con l'introduzione degli orologi ad alta risoluzione è divenuto possibile ottenere anche una gestione più avanzata degli allarmi; abbiamo già visto in sez.~\ref{sec:sig_alarm_abort} come l'interfaccia di \func{setitimer} derivata -da BSD presenti delle serie limitazioni,\footnote{in particolare la - possibilità di perdere un segnale sotto carico.} tanto che nello standard -POSIX.1-2008 questa viene marcata come obsoleta, e ne viene fortemente -consigliata la sostituzione con nuova interfaccia definita dallo standard -POSIX.1-2001 che va sotto il nome di \textit{POSIX Timer API}. Questa -interfaccia è stata introdotta a partire dal kernel 2.6, anche se il supporto -di varie funzionalità è stato aggiunto solo in un secondo tempo. +da BSD presenti delle serie limitazioni, come la possibilità di perdere un +segnale sotto carico, tanto che nello standard POSIX.1-2008 questa viene +marcata come obsoleta, e ne viene fortemente consigliata la sostituzione con +nuova interfaccia definita dallo standard POSIX.1-2001 che va sotto il nome di +\textit{POSIX Timer API}. Questa interfaccia è stata introdotta a partire dal +kernel 2.6, anche se il supporto di varie funzionalità da essa previste è +stato aggiunto solo in un secondo tempo. Una delle principali differenze della nuova interfaccia è che un processo può utilizzare un numero arbitrario di timer; questi vengono creati (ma non -avviati) tramite la funzione \funcd{timer\_create}, il cui prototipo è: -\begin{functions} - \headdecl{signal.h} - \headdecl{time.h} +avviati) tramite la funzione di sistema \funcd{timer\_create}, il cui +prototipo è: - \funcdecl{int timer\_create(clockid\_t clockid, struct sigevent *evp, +\begin{funcproto}{ +\fhead{signal.h} +\fhead{time.h} +\fdecl{int timer\_create(clockid\_t clockid, struct sigevent *evp, timer\_t *timerid)} - - Crea un nuovo timer Posix. - - \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di - errore, nel qual caso \var{errno} assumerà uno dei seguenti valori: +\fdesc{Crea un nuovo timer Posix.} +} + +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual + caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{EAGAIN}] fallimento nel tentativo di allocare le strutture dei timer. @@ -3278,23 +3291,25 @@ avviati) tramite la funzione \funcd{timer\_create}, il cui prototipo è: \item[\errcode{ENOMEM}] errore di allocazione della memoria. \end{errlist} } -\end{functions} +\end{funcproto} La funzione richiede tre argomenti: il primo argomento serve ad indicare quale tipo di orologio si vuole utilizzare e prende uno dei valori di -tab.~\ref{tab:sig_timer_clockid_types},\footnote{di detti valori però non è - previsto l'uso di \const{CLOCK\_MONOTONIC\_RAW} mentre - \const{CLOCK\_PROCESS\_CPUTIME\_ID} e \const{CLOCK\_THREAD\_CPUTIME\_ID} - sono disponibili solo a partire dal kernel 2.6.12.} si può così fare -riferimento sia ad un tempo assoluto che al tempo utilizzato dal processo (o -\textit{thread}) stesso. +tab.~\ref{tab:sig_timer_clockid_types}; di detti valori però non è previsto +l'uso di \const{CLOCK\_MONOTONIC\_RAW} mentre +\const{CLOCK\_PROCESS\_CPUTIME\_ID} e \const{CLOCK\_THREAD\_CPUTIME\_ID} sono +disponibili solo a partire dal kernel 2.6.12. Si può così fare riferimento sia +ad un tempo assoluto che al tempo utilizzato dal processo (o \textit{thread}) +stesso. Si possono inoltre utilizzare, posto di avere un kernel che li +supporti, gli orologi aggiuntivi della seconda parte di +tab.~\ref{tab:sig_timer_clockid_types}. Il secondo argomento richiede una trattazione più dettagliata, in quanto introduce una struttura di uso generale, \struct{sigevent}, che viene utilizzata anche da altre funzioni, come quelle per l'I/O asincrono (vedi sez.~\ref{sec:file_asyncronous_io}) o le code di messaggi POSIX (vedi -sez.~\ref{sec:ipc_posix_mq})) e che serve ad indicare in maniera generica un -meccanismo di notifica. +sez.~\ref{sec:ipc_posix_mq}) e che serve ad indicare in maniera generica un +meccanismo di notifica. \begin{figure}[!htb] \footnotesize \centering @@ -3308,13 +3323,13 @@ meccanismo di notifica. \end{figure} La struttura \struct{sigevent} (accessibile includendo \headfile{time.h}) è -riportata in fig.~\ref{fig:struct_sigevent};\footnote{la definizione effettiva - dipende dall'implementazione, quella mostrata è la versione descritta nella - pagina di manuale di \func{timer\_create}.} il campo \var{sigev\_notify} è -il più importante essendo quello che indica le modalità della notifica, gli -altri dipendono dal valore che si è specificato per \var{sigev\_notify}, si -sono riportati in tab.~\ref{tab:sigevent_sigev_notify}. La scelta del -meccanismo di notifica viene fatta impostando uno dei valori di +riportata in fig.~\ref{fig:struct_sigevent}, la definizione effettiva dipende +dall'implementazione, quella mostrata è la versione descritta nella pagina di +manuale di \func{timer\_create}. Il campo \var{sigev\_notify} è il più +importante essendo quello che indica le modalità della notifica, gli altri +dipendono dal valore che si è specificato per \var{sigev\_notify}, si sono +riportati in tab.~\ref{tab:sigevent_sigev_notify}. La scelta del meccanismo di +notifica viene fatta impostando uno dei valori di tab.~\ref{tab:sigevent_sigev_notify} per \var{sigev\_notify}, e fornendo gli eventuali ulteriori argomenti necessari a secondo della scelta effettuata. Diventa così possibile indicare l'uso di un segnale o l'esecuzione @@ -3364,9 +3379,9 @@ effettuata. Diventa così possibile indicare l'uso di un segnale o l'esecuzione \footnotetext{nel caso dei \textit{timer} questa funzionalità è considerata un esempio di pessima implementazione di una interfaccia, richiesta dallo - standard POSIX, ma da evitare totalmente, a causa della possibilità di - creare disservizi generando una gran quantità di processi, tanto che ne è - stata richiesta addirittura la rimozione.} + standard POSIX, ma da evitare totalmente nell'uso ordinario, a causa della + possibilità di creare disservizi generando una gran quantità di processi, + tanto che ne è stata richiesta addirittura la rimozione.} Nel caso di \func{timer\_create} occorrerà passare alla funzione come secondo argomento l'indirizzo di una di queste strutture per indicare le modalità con @@ -3395,19 +3410,19 @@ sia stato impostato, dal limite \const{RLIMIT\_SIGPENDING}. Una volta creato il timer \func{timer\_create} ed ottenuto il relativo identificatore, si può attivare o disattivare un allarme (in gergo -\textsl{armare} o \textsl{disarmare} il timer) con la funzione +\textsl{armare} o \textsl{disarmare} il timer) con la funzione di sistema \funcd{timer\_settime}, il cui prototipo è: -\begin{functions} - \headdecl{signal.h} - \headdecl{time.h} - \funcdecl{int timer\_settime(timer\_t timerid, int flags, const struct +\begin{funcproto}{ +\fhead{signal.h} +\fhead{time.h} +\fdecl{int timer\_settime(timer\_t timerid, int flags, const struct itimerspec *new\_value, struct itimerspec *old\_value)} - - Arma o disarma il timer POSIX. - - \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di - errore, nel qual caso \var{errno} assumerà uno dei seguenti valori: +\fdesc{Arma o disarma un timer POSIX..} +} + +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual + caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{EFAULT}] si è specificato un indirizzo non valido per \param{new\_value} o \param{old\_value}. @@ -3416,7 +3431,7 @@ identificatore, si può attivare o disattivare un allarme (in gergo 999999999. \end{errlist} } -\end{functions} +\end{funcproto} La funzione richiede che si indichi la scadenza del timer con l'argomento \param{new\_value}, che deve essere specificato come puntatore ad @@ -3487,22 +3502,22 @@ ad avere scadenze multiple, e lo stesso può accadere anche se si usa un Per questo motivo il gestore del segnale o il \textit{thread} di notifica può ottenere una indicazione di quante volte il timer è scaduto dall'invio della -notifica utilizzando la funzione \funcd{timer\_getoverrun}, il cui prototipo è: -\begin{functions} - \headdecl{time.h} +notifica utilizzando la funzione di sistema \funcd{timer\_getoverrun}, il cui +prototipo è: - \funcdecl{int timer\_getoverrun(timer\_t timerid)} - - Ottiene il numero di scadenze di un timer POSIX. - - \bodydesc{La funzione restituisce il numero di scadenze di un timer in caso - di successo e $-1$ in caso di errore, nel qual caso \var{errno} assumerà - il valore: +\begin{funcproto}{ +\fhead{time.h} +\fdecl{int timer\_getoverrun(timer\_t timerid)} +\fdesc{Ottiene il numero di scadenze di un timer POSIX.} +} + +{La funzione ritorna il numero di scadenze di un timer in caso di successo e + $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{EINVAL}] \param{timerid} non indica un timer valido. \end{errlist} } -\end{functions} +\end{funcproto} La funzione ritorna il numero delle scadenze avvenute, che può anche essere nullo se non ve ne sono state. Come estensione specifica di Linux,\footnote{in @@ -3519,24 +3534,26 @@ informazione, l'identificativo del timer, in questo caso nel campo Qualora si voglia rileggere lo stato corrente di un timer, ed ottenere il tempo mancante ad una sua eventuale scadenza, si deve utilizzare la funzione -\funcd{timer\_gettime}, il cui prototipo è: -\begin{functions} - \headdecl{time.h} +di sistema \funcd{timer\_gettime}, il cui prototipo è: - \funcdecl{int timer\_gettime(timer\_t timerid, int flags, struct + +\begin{funcproto}{ +\fhead{time.h} +\fdecl{int timer\_gettime(timer\_t timerid, int flags, struct itimerspec *curr\_value)} - - Legge lo stato di un timer POSIX. - - \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di - errore, nel qual caso \var{errno} assumerà uno dei seguenti valori: +\fdesc{Legge lo stato di un timer POSIX.} +} + +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual + caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{EFAULT}] si è specificato un indirizzo non valido per \param{curr\_value}. \item[\errcode{EINVAL}] \param{timerid} non indica un timer valido. \end{errlist} } -\end{functions} +\end{funcproto} + La funzione restituisce nella struttura \struct{itimerspec} puntata da \param{curr\_value} il tempo restante alla prossima scadenza nel campo @@ -3555,22 +3572,22 @@ singolo (in gergo \textit{one shot}). Infine, quando un timer non viene più utilizzato, lo si può cancellare, rimuovendolo dal sistema e recuperando le relative risorse, effettuando in sostanza l'operazione inversa rispetto a \funcd{timer\_create}. Per questo -compito lo standard prevede una apposita funzione \funcd{timer\_delete}, il -cui prototipo è: -\begin{functions} - \headdecl{time.h} +compito lo standard prevede una apposita funzione di sistema, +\funcd{timer\_delete}, il cui prototipo è: - \funcdecl{int timer\_delete(timer\_t timerid)} - - Cancella un timer POSIX. - - \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di - errore, nel qual caso \var{errno} assumerà uno dei seguenti valori: - \begin{errlist} +\begin{funcproto}{ +\fhead{time.h} +\fdecl{int timer\_delete(timer\_t timerid)} +\fdesc{Cancella un timer POSIX.} +} + +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual + caso \var{errno} assumerà uno dei valori: + \begin{errlist} \item[\errcode{EINVAL}] \param{timerid} non indica un timer valido. - \end{errlist} + \end{errlist} } -\end{functions} +\end{funcproto} La funzione elimina il timer identificato da \param{timerid}, disarmandolo se questo era stato attivato. Nel caso, poco probabile ma comunque possibile, che @@ -3588,16 +3605,19 @@ In questo ultimo paragrafo esamineremo le rimanenti funzioni di gestione dei segnali non descritte finora, relative agli aspetti meno utilizzati e più ``\textsl{esoterici}'' della interfaccia. -La prima di queste funzioni è \funcd{sigpending}, anch'essa introdotta dallo -standard POSIX.1; il suo prototipo è: -\begin{prototype}{signal.h} -{int sigpending(sigset\_t *set)} - -Scrive in \param{set} l'insieme dei segnali pendenti. - - \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un - errore.} -\end{prototype} +La prima di queste funzioni è la funzione di sistema \funcd{sigpending}, +anch'essa introdotta dallo standard POSIX.1, il suo prototipo è: + +\begin{funcproto}{ +\fhead{signal.h} +\fdecl{int sigpending(sigset\_t *set)} +\fdesc{Legge l'insieme dei segnali pendenti.} +} + +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual + caso \var{errno} assumerà solo il valore \errcode{EFAULT} nel suo + significato generico.} +\end{funcproto} La funzione permette di ricavare quali sono i segnali pendenti per il processo in corso, cioè i segnali che sono stati inviati dal kernel ma non sono stati @@ -3641,25 +3661,27 @@ uno \itindex{stack} \textit{stack} di dimensione sufficiente. Come accennato, per poter essere usato, lo \itindex{stack} \textit{stack} per i segnali deve essere indicato al sistema attraverso la funzione \funcd{sigaltstack}; il suo prototipo è: -\begin{prototype}{signal.h} -{int sigaltstack(const stack\_t *ss, stack\_t *oss)} - -Installa un nuovo \textit{stack} per i segnali. - - \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un - errore, nel qual caso \var{errno} assumerà i valori: +\begin{funcproto}{ +\fhead{signal.h} +\fdecl{int sigaltstack(const stack\_t *ss, stack\_t *oss)} +\fdesc{Installa uno \textit{stack} alternativo per i gestori di segnali.} +} + +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual + caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{EFAULT}] si è cercato di cambiare lo \textit{stack} - alternativo mentre questo è attivo (cioè il processo è in esecuzione su di - esso). + \item[\errcode{EFAULT}] uno degli indirizzi degli argomenti non è valido. \item[\errcode{EINVAL}] \param{ss} non è nullo e \var{ss\_flags} contiene un valore diverso da zero che non è \const{SS\_DISABLE}. \item[\errcode{ENOMEM}] la dimensione specificata per il nuovo \textit{stack} è minore di \const{MINSIGSTKSZ}. - \item[\errcode{EPERM}] uno degli indirizzi non è valido. - \end{errlist}} -\end{prototype} + \item[\errcode{EPERM}] si è cercato di cambiare lo \textit{stack} + alternativo mentre questo è attivo (cioè il processo è in esecuzione su di + esso). + \end{errlist} +} +\end{funcproto} La funzione prende come argomenti puntatori ad una struttura di tipo \var{stack\_t}, definita in fig.~\ref{fig:sig_stack_t}. I due valori