Finito ACL, inizio gestione avanzata della memoria
authorSimone Piccardi <piccardi@gnulinux.it>
Tue, 10 Mar 2009 17:21:51 +0000 (17:21 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Tue, 10 Mar 2009 17:21:51 +0000 (17:21 +0000)
filedir.tex
process.tex

index 4c59dc1cbf458c7407cb470449d773434f2d1f04..8bb46d76e4553405af3ca644ea6a3b79de2476df 100644 (file)
@@ -3779,8 +3779,9 @@ della ACL rappresentata dai dati contenuti nel buffer puntato da
 utilizzo.
 
 Una volta che si disponga della ACL desiderata, questa potrà essere impostata
-su un file o una directory. Per far questo sono disponibili due funzioni; la
-prima è \funcd{acl\_set\_file}, il cui prototipo è:
+su un file o una directory. Per impostare una ACL sono disponibili due
+funzioni; la prima è \funcd{acl\_set\_file}, che opera sia su file che su
+directory, ed il cui prototipo è:
 \begin{functions}
   \headdecl{sys/types.h} 
   \headdecl{sys/acl.h}
@@ -3788,7 +3789,7 @@ prima 
   \funcdecl{int acl\_set\_file(const char *path, acl\_type\_t type, acl\_t
     acl)}
 
-  Imposta una ACL su un file.
+  Imposta una ACL su un file o una directory.
 
   \bodydesc{La funzione restituisce $0$ in caso di successo e $-1$ in caso di
     errore, nel qual caso \var{errno} assumerà uno dei valori:
@@ -3808,12 +3809,20 @@ prima 
 }
 \end{functions}
 
-La funzione ...
-
-%TODO: finire
-
-La seconda funzione che consente di impostare una ACL è \funcd{acl\_set\_fd},
-il cui prototipo è:
+La funzione consente di assegnare la ACL contenuta in \param{acl} al file o
+alla directory indicate dal pathname \param{path}, mentre con \param{type} si
+indica il tipo di ACL utilizzando le constanti di tab.~\ref{tab:acl_type}, ma
+si tenga presente che le ACL di default possono essere solo impostate
+qualora \param{path} indichi una directory. Inoltre perché la funzione abbia
+successo la ACL dovrà essere valida, e contenere tutti le voci necessarie,
+unica eccezione è quella in cui si specifica una ACL vuota per cancellare la
+ACL di default associata a \func{path}.\footnote{questo però è una estensione
+  della implementazione delle ACL di Linux, la bozza di standard POSIX.1e
+  prevedeva l'uso della apposita funzione \funcd{acl\_delete\_def\_file}, che
+  prende come unico argomento il pathname della directory di cui si vuole
+  cancellare l'ACL di default, per i dettagli si ricorra alla pagina di
+  manuale.}  La seconda funzione che consente di impostare una ACL è
+\funcd{acl\_set\_fd}, ed il suo prototipo è:
 \begin{functions}
   \headdecl{sys/types.h} 
   \headdecl{sys/acl.h}
@@ -3837,10 +3846,17 @@ il cui prototipo 
 }
 \end{functions}
 
+La funzione è del tutto è analoga a \funcd{acl\_set\_file} ma opera
+esclusivamente sui file identificati tramite un file descriptor. Non dovendo
+avere a che fare con directory (e con la conseguente possibilità di avere una
+ACL di default) la funzione non necessita che si specifichi il tipo di ACL,
+che sarà sempre di accesso, e prende come unico argomento, a parte il file
+descriptor, la ACL da impostare.
+
 Le funzioni viste finora operano a livello di una intera ACL, eseguendo in una
 sola volta tutte le operazioni relative a tutte le voci in essa contenuta. In
 generale è possibile modificare un singolo valore all'interno di una singola
-voce direttamente con le funzioni previste dallo standardo POSIX.1e.  Queste
+voce direttamente con le funzioni previste dallo standard POSIX.1e.  Queste
 funzioni però sono alquanto macchinose da utilizzare per cui è molto più
 semplice operare direttamente sulla rappresentazione testuale. Questo è il
 motivo per non tratteremo nei dettagli dette funzioni, fornendone solo una
@@ -3855,7 +3871,7 @@ funzione \funcd{acl\_create\_entry} per una voce da aggiungere. Nel caso della
 prima funzione si potrà poi ripetere la lettura per ottenere i puntatori alle
 singole voci successive alla prima.
 
-Una volta ottenuti detti puntatori si porà operare sui contenuti delle singole
+Una volta ottenuti detti puntatori si potrà operare sui contenuti delle singole
 voci; con le funzioni \funcd{acl\_get\_tag\_type}, \funcd{acl\_get\_qualifier},
 \funcd{acl\_get\_permset} si potranno leggere rispettivamente tipo,
 qualificatore e permessi mentre con le corrispondente funzioni
@@ -3866,13 +3882,9 @@ vengono utilizzati tipi di dato ad hoc.\footnote{descritti nelle singole
 ad un altra con \funcd{acl\_copy\_entry} o eliminare una voce da una ACL con
 \funcd{acl\_delete\_entry}.
 
-
-
 \itindend{Access~Control~List}
 
-
-% TODO trattare le ACL, la documentazione di sistema è nei pacchetti
-% libacl1-dev e acl 
+% la documentazione di sistema è nei pacchetti libacl1-dev e acl 
 % vedi anche http://www.suse.de/~agruen/acl/linux-acls/online/
 
 
@@ -4002,9 +4014,10 @@ programmi e librerie) di cui il server potrebbe avere bisogno.
 % LocalWords:  fsetxattr flags XATTR REPLACE listxattr llistxattr flistxattr by
 % LocalWords:  removexattr lremovexattr fremovexattr attributename  lacl acl
 % LocalWords:  OBJ setfacl len any prefix separator options NUMERIC IDS SMART
-% LocalWords:  INDENT major number IDE Documentation makedev fopendir proc
+% LocalWords:  INDENT major number IDE Documentation makedev fopendir proc copy
 
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
+% LocalWords:  euidaccess eaccess delete def tag qualifier permset
index 8f8e6579af4b39de3ed0b1317c8e6721795f7dff..c332e5c0a12a2b094dfab9848a51b16abda01c4f 100644 (file)
@@ -182,7 +182,7 @@ che si pu
   Registra la funzione \param{function} per la chiamata all'uscita dal
   programma.
   
-  \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
+  \bodydesc{La funzione restituisce $0$ in caso di successo e $-1$ in caso di
     fallimento, \var{errno} non viene modificata.}
 \end{prototype}
 \noindent la funzione richiede come argomento l'indirizzo di una opportuna
@@ -198,7 +198,7 @@ definita su altri sistemi; il suo prototipo 
   Registra la funzione \param{function} per la chiamata all'uscita dal
   programma. 
   
-  \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
+  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
     fallimento, \var{errno} non viene modificata.}
 \end{prototype}
 
@@ -761,7 +761,7 @@ ugiale di 500). La prima funzione 
 \begin{prototype}{unistd.h}{int brk(void *end\_data\_segment)}
   Sposta la fine del segmento dei dati.
   
-  \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
+  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
     fallimento, nel qual caso \var{errno} assumerà il valore \errval{ENOMEM}.}
 \end{prototype}
 
@@ -906,7 +906,7 @@ prototipi sono:
   \funcdecl{int munlock(const void *addr, size\_t len)}
   Rimuove il blocco della paginazione su un intervallo di memoria.
   
-  \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e -1 in
+  \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e $-1$ in
     caso di errore, nel qual caso \var{errno} assumerà uno dei
     valori seguenti:
   \begin{errlist}
@@ -985,16 +985,71 @@ ci si scrive sopra.
 \itindend{memory~locking}
 
 
-% TODO documentare \func{madvise}
-% TODO documentare \func{mincore}
+\index{memoria~virtuale|)} 
 
 
-\index{memoria~virtuale|)} 
+\subsection{Gestione avanzata dell'allocazione della memoria} 
+\label{sec:proc_memory_adv_management}
+
+La trattazione delle funzioni di allocazione di sez.~\ref{sec:proc_mem_alloc}
+si è limitata a coprire le esigenze generiche di un programma, in cui non si
+hanno dei requisiti specifici e si lascia il controllo delle modalità di
+allocazione alle funzioni di libreria.  Tuttavia esistono una serie di casi in
+cui può essere necessario avere un controllo più dettagliato delle modalità
+con cui la memoria viene allocata; nel qual caso potranno venire in aiuto le
+funzioni trattate in questa sezione.
+
+Le prime funzioni che tratteremo sono quelle che consentono di richiedere di
+allocare un blocco di memoria ``\textsl{allineato}'' ad un multiplo una certa
+dimensione. Questo tipo di esigenza emerge usualmente quando si devono
+allocare dei buffer da utilizzare per eseguire dell'I/O diretto su dispositivi
+a blocchi. In questo caso infatti il trasferimento di dati viene eseguito per
+blocchi di dimensione fissa, ed è richiesto che l'indirizzo di partenza del
+buffer sia un multiplo intero di questa dimensione, usualmente 512 byte. In
+tal caso l'uso di \func{malloc} non è sufficiente, ed occorre utilizzare una
+funzione specifica.
+
+Tradizionalmente per rispondere a questa esigenza sono state crate due
+funzioni diverse, \funcd{memalign} e \funcd{valloc}, oggi obsolete; i
+rispettivi prototipi sono:
+\begin{functions}
+  \headdecl{malloc.h} 
+
+  \funcdecl{void *valloc(size\_t size)} Alloca un blocco di memoria allineato
+  alla dimensione di una pagina di memoria.
+
+  \funcdecl{void *memalign(size\_t boundary, size\_t size)}
+  Alloca un blocco di memoria allineato ad un multiplo di \param{boundary}.
+  
+  \bodydesc{Entrambe le funzioni ritornano un puntatore al blocco di memoria
+    allocato in caso di successo e \val{NULL} in caso di errore, nel qual
+    caso \var{errno} assumerà uno dei valori seguenti:
+  \begin{errlist}
+  \item[\errcode{ENOMEM}] non c'è memoria sufficiente per l'allocazione.
+  \item[\errcode{EINVAL}] \param{boundary} non è multiplo di due.
+  \end{errlist}
+}
+\end{functions}
 
+Le funzioni restituiscono il puntatore al buffer di memoria allocata, che per
+\func{memalign} sarà un multiplo di \param{boundary} mentre per \func{valloc}
+un multiplo della dimensione di una pagina di memoria. Nel caso della versione
+fornita dalle \acr{glibc} la memoria allocata con queste funzioni deve essere
+liberata con \func{free}.
 
-% \subsection{Gestione avanzata dell'allocazione della memoria} 
-% \label{sec:proc_mem_malloc_custom}
+Nessuna delle due funzioni ha una chiara standardizzazione (nessuna delle due
+compare in POSIX.1), ed inoltre ci sono indicazione discordi sui file che ne
+contengono la definizione;\footnote{secondo SUSv2 \func{valloc} è definita in
+  \texttt{stdlib.h}, mentre sia le \acr{glibc} che le precedenti \acr{libc4} e
+  \acr{lic5} la dichiarano in \texttt{malloc.h}, lo stesso vale per
+  \func{memalign} che in alcuni sistemi è dichiarata in \texttt{stdlib.h}.}
+per questo motivo il loro uso è sconsigliato, essendo state sostituite dalla
+nuova \funcd{posix\_memalign}, che è stata standardizzata in POSIX.1d; il suo
+prototipo è:
 
+
+% TODO documentare \func{madvise}
+% TODO documentare \func{mincore}
 % TODO: trattare le funzionalità avanzate di \func{malloc}
 % TODO: trattare \func{memalign}
 % TODO: trattare \func{valloc}
@@ -1069,7 +1124,7 @@ Esegue il parsing degli argomenti passati da linea di comando
 riconoscendo le possibili opzioni segnalate con \param{optstring}.
 
 \bodydesc{Ritorna il carattere che segue l'opzione, \cmd{':'} se manca un
-  parametro all'opzione, \cmd{'?'} se l'opzione è sconosciuta, e -1 se non
+  parametro all'opzione, \cmd{'?'} se l'opzione è sconosciuta, e $-1$ se non
   esistono altre opzioni.}
 \end{prototype}
 
@@ -1086,7 +1141,7 @@ due punti \texttt{':'}; nel caso di fig.~\ref{fig:proc_argv_argc} ad esempio la
 stringa di opzioni avrebbe dovuto contenere \texttt{"r:m"}.
 
 La modalità di uso di \func{getopt} è pertanto quella di chiamare più volte la
-funzione all'interno di un ciclo, fintanto che essa non ritorna il valore -1
+funzione all'interno di un ciclo, fintanto che essa non ritorna il valore $-1$
 che indica che non ci sono più opzioni. Nel caso si incontri un'opzione non
 dichiarata in \param{optstring} viene ritornato il carattere \texttt{'?'}
 mentre se un'opzione che lo richiede non è seguita da un parametro viene
@@ -1297,7 +1352,7 @@ ambiente, i loro prototipi sono i seguenti:
   \funcdecl{int putenv(char *string)} Aggiunge la stringa \param{string}
   all'ambiente.
   
-  \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e -1 per un
+  \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e $-1$ per un
     errore, che è sempre \errval{ENOMEM}.}
 \end{functions}
 \noindent la terza, \funcd{unsetenv}, serve a cancellare una variabile di