From: Simone Piccardi Date: Tue, 10 Mar 2009 17:21:51 +0000 (+0000) Subject: Finito ACL, inizio gestione avanzata della memoria X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=b34e359f722d553bc8e9a6808e0f3a48b57f052a Finito ACL, inizio gestione avanzata della memoria --- diff --git a/filedir.tex b/filedir.tex index 4c59dc1..8bb46d7 100644 --- a/filedir.tex +++ b/filedir.tex @@ -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 diff --git a/process.tex b/process.tex index 8f8e657..c332e5c 100644 --- a/process.tex +++ b/process.tex @@ -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