Finita la parte sulle capabilities.
authorSimone Piccardi <piccardi@gnulinux.it>
Sun, 19 Mar 2006 23:29:58 +0000 (23:29 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sun, 19 Mar 2006 23:29:58 +0000 (23:29 +0000)
listati/getcap.c [new file with mode: 0644]
prochand.tex
sources/getcap.c

diff --git a/listati/getcap.c b/listati/getcap.c
new file mode 100644 (file)
index 0000000..fc2fd3c
--- /dev/null
@@ -0,0 +1,21 @@
+    if (!pid) {
+       capab = cap_get_proc();
+       if (capab == NULL) {
+           perror("cannot get current process capabilities");
+           return 1;
+       }
+    } else {
+       capab = cap_init();
+       res = capgetp(pid, capab);
+       if (res) {
+           perror("cannot get process capabilities");
+           return 1;
+       }
+    }
+
+    string = cap_to_text(capab, NULL);
+    printf("Capability: %s\n", string);
+
+    cap_free(capab);
+    cap_free(string);
+    return 0;
index cb431836af3ed2fb3b99ba82c8aa61dcce3cba15..099b1ffac1c7fa077f58696a7e8edf27a674d912 100644 (file)
@@ -152,7 +152,7 @@ interrupt,\footnote{pi
 comunque a che esso sia invocato periodicamente, generando un interrupt
 periodico secondo la frequenza specificata dalla costante \const{HZ}, definita
 in \file{asm/param.h}, ed il cui valore è espresso in Hertz.\footnote{Fino al
-  kernel 2.4 l valore usuale di questa costante era 100, per tutte le
+  kernel 2.4 il valore usuale di questa costante era 100, per tutte le
   architetture eccetto l'alpha, per la quale era 1000. Occorre fare attenzione
   a non confondere questo valore con quello dei clock tick (vedi
   sez.~\ref{sec:sys_unix_time}).}
@@ -327,14 +327,14 @@ condivisa, pertanto padre e figlio vedono variabili diverse.
 Per quanto riguarda la gestione della memoria, in generale
 il\index{segmento!testo} segmento di testo, che è identico per i due processi,
 è condiviso e tenuto in read-only per il padre e per i figli. Per gli altri
-segmenti Linux utilizza la tecnica del \textit{copy on
-  write}\itindex{copy~on~write}; questa tecnica comporta che una pagina di
-memoria viene effettivamente copiata per il nuovo processo solo quando ci
-viene effettuata sopra una scrittura (e si ha quindi una reale differenza fra
-padre e figlio). In questo modo si rende molto più efficiente il meccanismo
-della creazione di un nuovo processo, non essendo più necessaria la copia di
-tutto lo spazio degli indirizzi virtuali del padre, ma solo delle pagine di
-memoria che sono state modificate, e solo al momento della modifica stessa.
+segmenti Linux utilizza la tecnica del \textit{copy on write}
+\itindex{copy~on~write}; questa tecnica comporta che una pagina di memoria
+viene effettivamente copiata per il nuovo processo solo quando ci viene
+effettuata sopra una scrittura (e si ha quindi una reale differenza fra padre
+e figlio). In questo modo si rende molto più efficiente il meccanismo della
+creazione di un nuovo processo, non essendo più necessaria la copia di tutto
+lo spazio degli indirizzi virtuali del padre, ma solo delle pagine di memoria
+che sono state modificate, e solo al momento della modifica stessa.
 
 La differenza che si ha nei due processi è che nel processo padre il valore di
 ritorno della funzione \func{fork} è il \acr{pid} del processo figlio, mentre
@@ -454,19 +454,19 @@ ciclo successivo), mentre la terza volta 
 (fino alla conclusione) e poi il padre.
 
 In generale l'ordine di esecuzione dipenderà, oltre che dall'algoritmo di
-scheduling usato dal kernel, dalla particolare situazione in cui si trova la
-macchina al momento della chiamata, risultando del tutto impredicibile.
-Eseguendo più volte il programma di prova e producendo un numero diverso di
-figli, si sono ottenute situazioni completamente diverse, compreso il caso in
-cui il processo padre ha eseguito più di una \func{fork} prima che uno dei
-figli venisse messo in esecuzione.
+\itindex{scheduler} scheduling usato dal kernel, dalla particolare situazione
+in cui si trova la macchina al momento della chiamata, risultando del tutto
+impredicibile.  Eseguendo più volte il programma di prova e producendo un
+numero diverso di figli, si sono ottenute situazioni completamente diverse,
+compreso il caso in cui il processo padre ha eseguito più di una \func{fork}
+prima che uno dei figli venisse messo in esecuzione.
 
 Pertanto non si può fare nessuna assunzione sulla sequenza di esecuzione delle
 istruzioni del codice fra padre e figli, né sull'ordine in cui questi potranno
 essere messi in esecuzione. Se è necessaria una qualche forma di precedenza
 occorrerà provvedere ad espliciti meccanismi di sincronizzazione, pena il
-rischio di incorrere nelle cosiddette \textit{race
-  condition}\itindex{race~condition} (vedi sez.~\ref{sec:proc_race_cond}).
+rischio di incorrere nelle cosiddette \textit{race condition}
+\itindex{race~condition} (vedi sez.~\ref{sec:proc_race_cond}).
 
 Si noti inoltre che essendo i segmenti di memoria utilizzati dai singoli
 processi completamente separati, le modifiche delle variabili nei processi
@@ -639,7 +639,7 @@ padre, che costituiva un inutile appesantimento in tutti quei casi in cui la
 \func{fork} veniva fatta solo per poi eseguire una \func{exec}. La funzione
 venne introdotta in BSD per migliorare le prestazioni.
 
-Dato che Linux supporta il \textit{copy on write}\itindex{copy~on~write} la
+Dato che Linux supporta il \textit{copy on write} \itindex{copy~on~write} la
 perdita di prestazioni è assolutamente trascurabile, e l'uso di questa
 funzione (che resta un caso speciale della system call \func{\_\_clone}) è
 deprecato; per questo eviteremo di trattarla ulteriormente.
@@ -788,19 +788,19 @@ terminale (prima dello scadere dei 10 secondi) otterremo:
 \end{verbatim} %$
 \normalsize e come si vede, dato che non si è fatto nulla per riceverne lo
 stato di terminazione, i tre processi figli sono ancora presenti pur essendosi
-conclusi, con lo stato di zombie\index{zombie} e l'indicazione che sono stati
+conclusi, con lo stato di zombie \index{zombie} e l'indicazione che sono stati
 terminati.
 
-La possibilità di avere degli zombie\index{zombie} deve essere tenuta sempre
+La possibilità di avere degli zombie \index{zombie} deve essere tenuta sempre
 presente quando si scrive un programma che deve essere mantenuto in esecuzione
 a lungo e creare molti figli. In questo caso si deve sempre avere cura di far
 leggere l'eventuale stato di uscita di tutti i figli (in genere questo si fa
 attraverso un apposito \textit{signal handler}, che chiama la funzione
 \func{wait}, vedi sez.~\ref{sec:sig_sigchld} e sez.~\ref{sec:proc_wait}).
-Questa operazione è necessaria perché anche se gli
-\textit{zombie}\index{zombie} non consumano risorse di memoria o processore,
-occupano comunque una voce nella tabella dei processi, che a lungo andare
-potrebbe esaurirsi.
+Questa operazione è necessaria perché anche se gli \textit{zombie}
+\index{zombie} non consumano risorse di memoria o processore, occupano
+comunque una voce nella tabella dei processi, che a lungo andare potrebbe
+esaurirsi.
 
 Si noti che quando un processo adottato da \cmd{init} termina, esso non
 diviene uno \textit{zombie}\index{zombie}; questo perché una delle funzioni di
@@ -818,7 +818,7 @@ processo che li ha generati, in modo che \cmd{init} possa adottarli e
 provvedere a concluderne la terminazione.
 
 
-\subsection{Le funzioni \func{wait} e  \func{waitpid}}
+\subsection{Le funzioni \func{wait} e \func{waitpid}}
 \label{sec:proc_wait}
 
 Uno degli usi più comuni delle capacità multitasking di un sistema unix-like
@@ -1278,12 +1278,12 @@ forma \cmd{\#!/path/to/interpreter [argomenti]} dove l'interprete indicato
 deve essere un programma valido (binario, non un altro script) che verrà
 chiamato come se si fosse eseguito il comando \cmd{interpreter [argomenti]
   filename}.\footnote{si tenga presente che con Linux quanto viene scritto
-  come \texttt{argomenti} viene passato all'inteprete come un unico argomento
+  come \texttt{argomenti} viene passato all'interprete come un unico argomento
   con una unica stringa di lunghezza massima di 127 caratteri e se questa
   dimensione viene ecceduta la stringa viene troncata; altri Unix hanno
   dimensioni massime diverse, e diversi comportamenti, ad esempio FreeBSD
   esegue la scansione della riga e la divide nei vari argomenti e se è troppo
-  lunga restitituisce un errore di \const{ENAMETOOLONG}, una comparazione dei
+  lunga restituisce un errore di \const{ENAMETOOLONG}, una comparazione dei
   vari comportamenti si trova su
   \href{http://www.in-ulm.de/~mascheck/various/shebang/}
   {\texttt{http://www.in-ulm.de/\tild mascheck/various/shebang/}}.}
@@ -1575,10 +1575,9 @@ l'\textsl{user-ID effettivo} del processo per cedere i privilegi occorre
 ricorrere ad altre funzioni.
 
 Le due funzioni \funcd{setreuid} e \funcd{setregid} derivano da BSD che, non
-supportando\footnote{almeno fino alla versione 4.3+BSD TODO, FIXME verificare
-  e aggiornare la nota.} gli identificatori del gruppo \textit{saved}, le usa
-per poter scambiare fra di loro \textit{effective} e \textit{real}. I
-rispettivi prototipi sono:
+supportando\footnote{almeno fino alla versione 4.3+BSD.} gli identificatori
+del gruppo \textit{saved}, le usa per poter scambiare fra di loro
+\textit{effective} e \textit{real}. I rispettivi prototipi sono:
 \begin{functions}
 \headdecl{unistd.h}
 \headdecl{sys/types.h}
@@ -1924,6 +1923,9 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e
     \textbf{Capacità}&\textbf{Descrizione}\\
     \hline
     \hline
+%
+% POSIX-draft defined capabilities.
+%
     \const{CAP\_CHOWN}      & la capacità di cambiare proprietario e gruppo
                               proprietario di un file (vedi
                               sez.~\ref{sec:file_chown}).\\
@@ -1967,53 +1969,14 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e
                               di impostare il bit \acr{sgid} su un file anche
                               quando questo è relativo ad un gruppo cui non si
                               appartiene (vedi sez.~\ref{sec:file_chmod}).\\ 
-    \const{CAP\_IPC\_LOCK}  & la capacità di effettuare il \textit{memory
-                              locking} \itindex{memory~locking} con le
-                              funzioni \func{mlock}, \func{mlockall},
-                              \func{shmctl}, \func{mmap} (vedi
-                              sez.~\ref{sec:proc_mem_lock} e 
-                              sez.~\ref{sec:file_memory_map}). \\  
-    \const{CAP\_IPC\_OWNER} & la capacità di evitare il controllo dei permessi
-                              per le operazioni sugli oggetti di
-                              intercomunicazione fra processi (vedi
-                              sez.~\ref{sec:ipc_sysv}).\\  
     \const{CAP\_KILL}       & la capacità di mandare segnali a qualunque
                               processo (vedi sez.~\ref{sec:sig_kill_raise}).\\
-    \const{CAP\_LEASE}      & la capacità di creare dei \textit{file lease}
-                              \index{file!lease} su di un file (vedi
-                              sez.~\ref{sec:file_asyncronous_lease})
-                              indipendentemente dalla proprietà dello
-                              stesso.\footnotemark\\
-    \const{CAP\_LINUX\_IMMUTABLE}& la capacità di impostare gli attributi
-                              \textit{immutable} e \textit{append only} per i
-                              file su un filesystem che supporta questi
-                              attributi estesi.\\ 
-    \const{CAP\_MKNOD}      & la capacità di creare file di dispositivo con la
-                              funzione \func{mknod} (vedi
-                              sez.~\ref{sec:file_mknod}).\footnotemark\\ 
-    \const{CAP\_NET\_ADMIN} & la capacità di eseguire alcune operazioni
-                              privilegiate sulla rete (impostare le opzioni
-                              privilegiate dei socket, abilitare il
-                              multicasting, impostare interfacce di rete e
-                              tabella di instradamento).\\
-    \const{CAP\_NET\_BIND\_SERVICE}& la capacità di porre in ascolto server
-                              su porte riservate (vedi
-                              sez.~\ref{sec:TCP_func_bind}).\\ 
-    \const{CAP\_NET\_BROADCAST}& la capacità di consentire l'uso di socket in
-                              broadcast e multicast.\\
-    \const{CAP\_NET\_RAW}   & la capacità di usare socket \texttt{RAW} e
-                              \texttt{PACKET} (quelli che permettono di creare
-                              pacchetti nei protocolli di basso livello).\\
     \const{CAP\_SETGID}     & la capacità di manipolare i group ID dei
                               processi, sia il principale che i supplementari,
                               (vedi sez.~\ref{sec:proc_setgroups} che quelli
                               trasmessi tramite i \index{socket} socket
                               \textit{unix domain} (vedi
                               sez.~\ref{sec:unix_socket}).\\
-    \const{CAP\_SETPCAP}    & la capacità di impostare o rimuovere una capacità
-                              (limitatamente a quelle che il processo
-                              chiamante ha nel suo insieme di capacità
-                              permesse) da qualunque processo.\\
     \const{CAP\_SETUID}     & la capacità di manipolare gli user ID del
                               processo (con \func{setuid}, \func{setreuid},
                               \func{setresuid}, \func{setfsuid}) e di
@@ -2021,25 +1984,64 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e
                               dell'\textsl{uid} nel passaggio delle
                               credenziali coi socket unix domain (vedi
                               sez.~\ref{sec:unix_socket_xxx}).\\ 
+%
+% Linux specific capabilities
+%
+\hline
+    \const{CAP\_SETPCAP}    & la capacità di impostare o rimuovere una capacità
+                              (limitatamente a quelle che il processo
+                              chiamante ha nel suo insieme di capacità
+                              permesse) da qualunque processo.\\
+    \const{CAP\_LINUX\_IMMUTABLE}& la capacità di impostare gli attributi
+                              \textit{immutable} e \textit{append only} per i
+                              file su un filesystem che supporta questi
+                              attributi estesi.\\ 
+    \const{CAP\_NET\_BIND\_SERVICE}& la capacità di porre in ascolto server
+                              su porte riservate (vedi
+                              sez.~\ref{sec:TCP_func_bind}).\\ 
+    \const{CAP\_NET\_BROADCAST}& la capacità di consentire l'uso di socket in
+                              broadcast e multicast.\\
+    \const{CAP\_NET\_ADMIN} & la capacità di eseguire alcune operazioni
+                              privilegiate sulla rete (impostare le opzioni
+                              privilegiate dei socket, abilitare il
+                              multicasting, impostare interfacce di rete e
+                              tabella di instradamento).\\
+    \const{CAP\_NET\_RAW}   & la capacità di usare socket \texttt{RAW} e
+                              \texttt{PACKET} (quelli che permettono di creare
+                              pacchetti nei protocolli di basso livello).\\
+    \const{CAP\_IPC\_LOCK}  & la capacità di effettuare il \textit{memory
+                              locking} \itindex{memory~locking} con le
+                              funzioni \func{mlock}, \func{mlockall},
+                              \func{shmctl}, \func{mmap} (vedi
+                              sez.~\ref{sec:proc_mem_lock} e 
+                              sez.~\ref{sec:file_memory_map}). \\  
+    \const{CAP\_IPC\_OWNER} & la capacità di evitare il controllo dei permessi
+                              per le operazioni sugli oggetti di
+                              intercomunicazione fra processi (vedi
+                              sez.~\ref{sec:ipc_sysv}).\\  
+    \const{CAP\_SYS\_MODULE}& la capacità di caricare e rimuovere moduli del
+                              kernel. \\ 
+    \const{CAP\_SYS\_RAWIO} & la capacità di eseguire operazioni sulle porte
+                              di I/O con \func{ioperm} e \func{iopl} (vedi
+                              sez.~\ref{sec:file_io_port}).\\
+    \const{CAP\_SYS\_CHROOT}& la capacità di eseguire la funzione
+                              \func{chroot} (vedi
+                              sez.~\ref{sec:file_chroot}).\\
+    \const{CAP\_SYS\_PTRACE}& consente di tracciare qualunque processo con
+                              \func{ptrace} (vedi 
+                              sez.~\ref{sec:xxx_ptrace}).\\
+% TODO documentatare ptrace 
+    \const{CAP\_SYS\_PACCT} & la capacità di usare le funzioni di
+                              \textit{accounting} dei processi (vedi
+                              sez.~\ref{sec:sys_bsd_accounting}).\\ 
     \const{CAP\_SYS\_ADMIN} & la capacità di eseguire una serie di compiti
                               amministrativi (come impostare le quote,
                               attivare e disattivare la swap, montare,
                               rimontare e smontare filesystem, ecc.). \\
-    \const{CAP\_SYS\_BOOT}  & la capacità di fare eseguire un reboot del
+    \const{CAP\_SYS\_BOOT}  & la capacità di fare eseguire un riavvio del
                               sistema.\\
-    \const{CAP\_SYS\_CHROOT}& la capacità di eseguire la funzione
-                              \func{chroot} (vedi
-                              sez.~\ref{sec:file_chroot}).\\
-    \const{CAP\_SYS\_MODULE}& la capacità di caricare e rimuovere moduli del
-                              kernel. \\ 
     \const{CAP\_SYS\_NICE}  & la capacità di modificare le priorità dei
                               processi (vedi sez.~\ref{sec:proc_priority}). \\ 
-    \const{CAP\_SYS\_PACCT} & la capacità di usare le funzioni di
-                              \textit{accounting} dei processi (vedi
-                              sez.~\ref{sec:sys_bsd_accounting}).\\ 
-    \const{CAP\_SYS\_RAWIO} & la capacità di eseguire operazioni sulle porte
-                              di I/O con \func{ioperm} e \func{iopl} (vedi
-                              sez.~\ref{sec:file_io_port}).\\
     \const{CAP\_SYS\_RESOURCE}& la capacità di superare le limitazioni sulle
                               risorse, aumentare le quote disco, usare lo
                               spazio disco riservato all'amministratore.\\ 
@@ -2048,10 +2050,17 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e
     \const{CAP\_SYS\_TTY\_CONFIG}& la capacità di simulare un \textit{hangup}
                               della console, con la funzione
                               \func{vhangup}.\\
-    \const{CAP\_SYS\_PTRACE}& consente di tracciare qualunque processo con
-                              \func{ptrace} (vedi 
-                              sez.~\ref{sec:xxx_ptrace}).\\
-% TODO documentatare ptrace 
+    \const{CAP\_MKNOD}      & la capacità di creare file di dispositivo con la
+                              funzione \func{mknod} (vedi
+                              sez.~\ref{sec:file_mknod}).\footnotemark\\ 
+    \const{CAP\_LEASE}      & la capacità di creare dei \textit{file lease}
+                              \index{file!lease} su di un file (vedi
+                              sez.~\ref{sec:file_asyncronous_lease})
+                              indipendentemente dalla proprietà dello
+                              stesso.\footnotemark\\
+    \const{CAP\_SETFCAP}    & la capacità di impostare le
+                              \textit{capabilities} di un file (non
+                              supportata).\\ 
     \hline
   \end{tabular}
   \caption{Le costanti che identificano le \textit{capabilities} presenti nel
@@ -2059,10 +2068,10 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e
 \label{tab:proc_capabilities}
 \end{table}
 
-\footnotetext[21]{questa capacità è presente soltato a partire dai kernel
+\footnotetext[21]{questa capacità è presente soltanto a partire dai kernel
   della serie 2.4.x.}
 
-\footnotetext{questa capacità è presente soltato a partire dai kernel della
+\footnotetext{questa capacità è presente soltanto a partire dai kernel della
   serie 2.4.x.}
 
 Per gestire questo nuovo meccanismo ciascun processo porta con sé tre distinti
@@ -2078,9 +2087,12 @@ vengono mantenuti in forma di tre diverse maschere binarie,\footnote{il kernel
 ciascun bit corrisponde ad una capacità diversa; se ne è riportato
 l'elenco,\footnote{si tenga presente che l'elenco delle \textit{capabilities}
   presentato questa tabella, ripreso dalla relativa pagina di manuale
-  (accessibile con \texttt{man capabilities}), è quello aggiornato al kernel
-  2.6.6.} con una breve descrizione, ed il nome delle costanti che
-identificano i singoli bit, in tab.~\ref{tab:proc_capabilities}.
+  (accessibile con \texttt{man capabilities}) e dalle definizioni in
+  \texttt{sys/capabilities.h}, è quello aggiornato al kernel 2.6.6.} con una
+breve descrizione, ed il nome delle costanti che identificano i singoli bit,
+in tab.~\ref{tab:proc_capabilities}; la tabella è divisa in due parti, la
+prima riporta le \textit{capabilities} previste nella bozza dello standard
+POSIX1.e, la seconda quelle specifiche di Linux.
 
 L'utilizzo di tre distinti insiemi serve a fornire una interfaccia flessibile
 per l'uso delle \textit{capabilities}, con scopi analoghi a quelli per cui
@@ -2181,7 +2193,7 @@ fig.~\ref{fig:cap_kernel_struct}, come i prototipi delle due funzioni
 \func{capget} e \func{capset}, sono soggette ad essere modificate con il
 cambiamento del kernel (in particolare i tipi di dati delle strutture) ed
 anche se finora l'interfaccia è risultata stabile, non c'è nessuna
-assicurazione che questa venga mantenuta. Pertando se si vogliono scrivere
+assicurazione che questa venga mantenuta. Pertanto se si vogliono scrivere
 programmi portabili che possano essere eseguiti su qualunque versione del
 kernel è opportuno utilizzare le interfacce di alto livello.
 
@@ -2248,7 +2260,7 @@ relativi dati. La funzione 
 
 La funzione restituisce il puntatore \type{cap\_t} ad uno stato inizializzato
 con tutte le \textit{capabilities} azzerate. In caso di errore (cioè quando
-non c'è memoria suffuciente ad allocare i dati) viene restituito \macro{NULL}
+non c'è memoria sufficiente ad allocare i dati) viene restituito \macro{NULL}
 ed \var{errno} viene impostata a \errval{ENOMEM}.  La memoria necessaria a
 mantenere i dati viene automaticamente allocata da \func{cap\_init}, ma dovrà
 essere disallocata esplicitamente quando non più necessaria utilizzando la
@@ -2426,7 +2438,8 @@ La funzione ritorna l'indirizzo di una stringa contente la descrizione
 testuale del contenuto del \textit{capabilities state} \param{caps} passato
 come argomento, e, qualora l'argomento \param{length\_p} sia diverso da
 \val{NULL}, restituisce nella variabile intera da questo puntata la lunghezza
-della stringa. 
+della stringa. La stringa restituita viene allocata automaticamente dalla
+funzione e deve essere liberata con \func{cap\_free}.
 
 Fin quei abbiamo trattato delle funzioni di manipolazione dei
 \textit{capabilities state}; quando si vuole eseguire la lettura delle
@@ -2469,7 +2482,16 @@ prototipo\footnote{su alcune pagine di manuale la funzione 
 La funzione legge il valore delle \textit{capabilities} del processo indicato
 con l'argomento \param{pid}, salvando il risultato nel \textit{capabilities
   state} all'indirizzo \param{cap\_d} che deve essere stato creato in
-precedenza. Qualora il processo non esista si avrà un errore di \errval{ESRCH}.
+precedenza. Qualora il processo non esista si avrà un errore di
+\errval{ESRCH}. Gli stessi valori possono essere letti direttamente nel
+filesystem \textit{proc}, nei file \texttt{/proc/<pid>/status}; ad esempio per
+\texttt{init} si otterrà qualcosa del tipo:
+\begin{Verbatim}
+...
+CapInh: 0000000000000000
+CapPrm: 00000000fffffeff
+CapEff: 00000000fffffeff  
+\end{Verbatim}
 
 Infine per impostare le \textit{capabilities} del processo corrente (non
 esiste una funzione che permetta di cambiare le \textit{capabilities} di un
@@ -2487,7 +2509,51 @@ prototipo 
   }
 \end{functions}
 
+La funzione modifica le \textit{capabilities} del processo corrente secondo
+quanto specificato con l'argomento \param{cap\_p}, posto che questo sia
+possibile nei termini spiegati in precedenza (non sarà ad esempio possibile
+impostare capacità non presenti nell'insieme di quelle permesse). In caso di
+successo i nuovi valori saranno effettivi al ritorno della funzione, in caso
+di fallimento invece lo stato delle capacità resterà invariato. Si tenga
+presente che \textsl{tutte} le capacità specificate tramite \param{cap\_p}
+devono essere permesse; se anche una sola non lo è la funzione fallirà, e per
+quanto appena detto, lo stato delle \textit{capabilities} non verrà modificato
+(neanche per le parti eventualmente permesse).
+
+Come esempio di utilizzo di queste funzioni nei sorgenti allegati alla guida
+si è distribuito il programma \texttt{getcap.c}, che consente di leggere le
+\textit{capabilities} del processo corrente\footnote{vale a dire di sé stesso,
+  quando lo si lancia, il che può sembrare inutile, ma serve a mostrarci quali
+  sono le \textit{capabilities} standard che ottiene un processo lanciato
+  dalla riga di comando.} o tramite l'opzione \texttt{-p}, quelle di un
+processo qualunque il cui pid viene passato come parametro dell'opzione.
+
+\begin{figure}[htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includecodesample{listati/getcap.c}
+  \end{minipage} 
+  \normalsize
+  \caption{Corpo principale del programma \texttt{getcap.c}.}
+  \label{fig:proc_getcap}
+\end{figure}
 
+La sezione principale del programma è riportata in fig.~\ref{fig:proc_getcap},
+e si basa su una condizione sulla variabile \var{pid} che se si è usato
+l'opzione \texttt{-p} è impostata (nella sezione di gestione delle opzioni,
+che si è tralasciata) al valore del \textsl{pid} del processo di cui si vuole
+leggere le \textit{capabilities} e nulla altrimenti. Nel primo caso
+(\texttt{\small 1--6}) si utilizza direttamente (\texttt{\small 2})
+\func{cap\_get\_proc} per ottenere lo stato delle capacità del processo, nel
+secondo (\texttt{\small 7--14}) prima si inizializza (\texttt{\small 8}) uno
+stato vuoto e poi (\texttt{\small 9}) si legge il valore delle capacità del
+processo indicato.
+
+Il passo successivo è utilizzare (\texttt{\small 16}) \func{cap\_to\_text} per
+tradurre in una stringa lo stato, e poi (\texttt{\small 17}) stamparlo; infine
+(\texttt{\small 19--20}) si libera la memoria allocata dalle precedenti
+funzioni con \func{cap\_free} per poi ritornare dal ciclo principale della
+funzione.
 
 \itindend{capabilities}
 
@@ -3100,7 +3166,7 @@ su quali processori far eseguire un determinato processo attraverso una
   \texttt{len} è stato eliminato, successivamente si è introdotta la versione
   riportata con però un secondo argomento di tipo \texttt{size\_t cpusetsize}
   (anche questa citata nella pagina di manuale); la versione citata è quella
-  riportata nel manuale delle \textsl{glibc} e corripondente alla definizione
+  riportata nel manuale delle \textsl{glibc} e corrispondente alla definizione
   presente in \file{sched.h}.} è:
 \begin{prototype}{sched.h}
   {int sched\_setaffinity (pid\_t pid, const cpu\_set\_t *cpuset)} 
@@ -3152,7 +3218,7 @@ di processore.
 Per facilitare l'uso dell'argomento \param{cpuset} le \acr{glibc} hanno
 introdotto un apposito dato di tipo, \ctyp{cpu\_set\_t},\footnote{questa è una
   estensione specifica delle \acr{glibc}, da attivare definendo la macro
-  \macro{\_GNU\_SOURCE}, non esiste infatti una standardardizzazione per
+  \macro{\_GNU\_SOURCE}, non esiste infatti una standardizzazione per
   questo tipo di interfaccia e POSIX al momento non prevede nulla al
   riguardo.} che permette di identificare un insieme di processori. Il dato è
 una maschera binaria: in generale è un intero a 32 bit in cui ogni bit
@@ -3207,7 +3273,7 @@ valore per un processo specifico usando la funzione
 La funzione restituirà all'indirizzo specificato da \param{cpuset} il valore
 della maschera di affinità del processo, così da poterla riutilizzare per una
 successiva reimpostazione. In questo caso non sono necessari privilegi
-paricolari.  
+particolari.  
 
 È chiaro che queste funzioni per la gestione dell'affinità hanno significato
 soltanto su un sistema multiprocessore, esse possono comunque essere
@@ -3378,3 +3444,40 @@ varie funzioni di libreria, che sono identificate aggiungendo il suffisso
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
+
+% LocalWords:  multitasking like VMS child process identifier pid sez shell fig
+% LocalWords:  parent kernel init pstree keventd kswapd table struct linux call
+% LocalWords:  nell'header scheduler system interrupt timer HZ asm Hertz clock
+% LocalWords:  l'alpha tick fork wait waitpid exit exec image glibc int pgid ps
+% LocalWords:  sid threads thread Ingo Molnar ppid getpid getppid sys unistd
+% LocalWords:  void ForkTest tempnam pathname sibling cap errno EAGAIN ENOMEM
+% LocalWords:  stack read only copy write tab client spawn forktest sleep PATH
+% LocalWords:  source LIBRARY scheduling race condition printf descriptor dup
+% LocalWords:  close group session tms lock vfork execve BSD stream main abort
+% LocalWords:  SIGABRT SIGCHLD SIGHUP foreground SIGCONT termination signal ANY
+% LocalWords:  handler kill EINTR POSIX options WNOHANG ECHILD option WUNTRACED
+% LocalWords:  dump bits rusage getrusage heap const filename argv envp EACCES
+% LocalWords:  filesystem noexec EPERM suid sgid root nosuid ENOEXEC ENOENT ELF
+% LocalWords:  ETXTBSY EINVAL ELIBBAD BIG EFAULT EIO ENAMETOOLONG ELOOP ENOTDIR
+% LocalWords:  ENFILE EMFILE argc execl path execv execle execlp execvp vector
+% LocalWords:  list environ NULL umask pending utime cutime ustime fcntl linker
+% LocalWords:  opendir libc interpreter FreeBSD capabilities Mandatory Access
+% LocalWords:  Control MAC SELinux Security Modules LSM superuser uid gid saved
+% LocalWords:  effective euid egid dell' fsuid fsgid getuid geteuid getgid SVr
+% LocalWords:  getegid IDS NFS setuid setgid all' logout utmp screen xterm TODO
+% LocalWords:  setreuid setregid FIXME ruid rgid seteuid setegid setresuid size
+% LocalWords:  setresgid getresuid getresgid value result argument setfsuid DAC
+% LocalWords:  setfsgid NGROUPS sysconf getgroups getgrouplist groups ngroups
+% LocalWords:  setgroups initgroups patch LIDS CHOWN OVERRIDE Discrectionary
+% LocalWords:  SEARCH chattr sticky NOATIME socket domain immutable append mmap
+% LocalWords:  broadcast multicast multicasting memory locking mlock mlockall
+% LocalWords:  shmctl ioperm iopl chroot ptrace accounting swap reboot hangup
+% LocalWords:  vhangup mknod lease permitted inherited inheritable bounding AND
+% LocalWords:  capability capget capset header ESRCH undef version obj clear
+% LocalWords:  pag ssize length proc capgetp prehemptive cache runnable Stopped
+% LocalWords:  Uninterrutible SIGSTOP soft slice nice niceness counter which
+% LocalWords:  getpriority who setpriority RTLinux RTAI Adeos fault FIFO First
+% LocalWords:  yield Robin setscheduler policy param OTHER priority setparam
+% LocalWords:  min getparam getscheduler interval robin ENOSYS fifo ping long
+% LocalWords:  affinity setaffinity unsigned mask cpu NUMA CLR ISSET SETSIZE
+% LocalWords:  getaffinity assembler deadlock REENTRANT SAFE
index 116f3cbbfbeb9f8bac1161cbac3724964ed3592b..19974eebdb559e73c6b6385e0935bdb9ed1f644f 100644 (file)
@@ -110,6 +110,7 @@ int main(int argc, char *argv[])
     printf("Capability: %s\n", string);
 
     cap_free(capab);
+    cap_free(string);
     return 0;
 }
 /*