sistema (come mount point).
\item[\errcode{EINVAL}] \param{newpath} contiene un prefisso di
\param{oldpath} o più in generale si è cercato di creare una directory come
- sottodirectory di se stessa.
+ sotto-directory di se stessa.
\item[\errcode{ENOTDIR}] Uno dei componenti dei pathname non è una directory
o \param{oldpath} è una directory e \param{newpath} esiste e non è una
directory.
il filesystem su cui si è cercato di creare \func{pathname} non supporta
l'operazione.
\item[\errcode{EINVAL}] Il valore di \param{mode} non indica un file, una
- fifo o un dipositivo.
+ fifo o un dispositivo.
\item[\errcode{EEXIST}] \param{pathname} esiste già o è un link simbolico.
\end{errlist}
ed inoltre anche \errval{EFAULT}, \errval{EACCES}, \errval{ENAMETOOLONG},
Legge una voce dal \textit{directory stream}.
- \bodydesc{La funzione restituisce il puntatore alla struttura contentente i
+ \bodydesc{La funzione restituisce il puntatore alla struttura contenente i
dati in caso di successo e \val{NULL} altrimenti, in caso di descrittore
non valido \var{errno} assumerà il valore \errval{EBADF}, il valore
\val{NULL} viene restituito anche quando si raggiunge la fine dello
La funzione restituisce in \param{result} (come \textit{value result
argument}) l'indirizzo dove sono stati salvati i dati, che di norma
-corriponde a quallo della struttura precedentemente allocata e specificata
+corrisponde a quello della struttura precedentemente allocata e specificata
dall'argomento \param{entry} (anche se non è assicurato che la funzione usi lo
spazio fornito dall'utente).
campo \var{d\_name}, che contiene il nome del file nella forma di una stringa
terminata da uno zero,\footnote{lo standard POSIX non specifica una lunghezza,
ma solo un limite \const{NAME\_MAX}; in SVr4 la lunghezza del campo è
- definta come \code{NAME\_MAX+1} che di norma porta al valore di 256 byte
+ definita come \code{NAME\_MAX+1} che di norma porta al valore di 256 byte
usato anche in Linux.} ed il campo \var{d\_ino}, che contiene il numero di
-inode cui il file è associato (di solito corriponde al campo \var{st\_ino} di
+inode cui il file è associato (di solito corrisponde al campo \var{st\_ino} di
\struct{stat}).
\begin{figure}[!htb]
\bodydesc{La funzione restituisce la posizione corrente nello stream (un
numero positivo) in caso di successo, e -1 altrimenti, nel qual caso
\var{errno} assume solo il valore di \errval{EBADF}, corrispondente ad un
- valore errrato per \param{dir}.}
+ valore errato per \param{dir}.}
\end{prototype}
La sola funzione di posizionamento nello stream prevista dallo standard POSIX
\funcdecl{void rewinddir(DIR *dir)}
- Si posiziona all'inzio di un \textit{directory stream}.
+ Si posiziona all'inizio di un \textit{directory stream}.
\end{functions}
La funzione legge tutte le voci della directory indicata dall'argomento
\param{dir}, passando ciascuna di esse come argomento alla funzione di
\param{select}; se questa ritorna un valore diverso da zero la voce viene
-inserita in una struttura allocata dinamicamante con \func{malloc}, qualora si
+inserita in una struttura allocata dinamicamente con \func{malloc}, qualora si
specifichi un valore \val{NULL} per \func{select} vengono selezionate tutte le
voci. Tutte le voci selezionate vengono poi inserite un una lista (anch'essa
allocata con \func{malloc}, che viene riordinata tramite \func{qsort} usando
A ciascun processo è associata una directory nel filesystem che è chiamata
directory corrente o directory di lavoro (\textit{current working directory})
che è quella a cui si fa riferimento quando un filename è espresso in forma
-relativa, dove il ``relativa'' fa riferimento appunto a questa directory.
+relativa, dove il ``\textsl{relativa}'' fa riferimento appunto a questa
+directory.
Quando un utente effettua il login, questa directory viene impostata alla
\textit{home directory} del suo account. Il comando \cmd{cd} della shell
-1 in caso di errore, nel qual caso \var{errno} assumerà i valori:
\begin{errlist}
\item[\errcode{EINVAL}] \param{template} non termina con \code{XXXXXX}.
- \item[\errcode{EEXIST}] non è riuscita a creare un file temporano, il
+ \item[\errcode{EEXIST}] non è riuscita a creare un file temporaneo, il
contenuto di \param{template} è indefinito.
\end{errlist}}
\end{prototype}
del controllo di accesso ai file, che viene implementato per qualunque
filesystem standard.\footnote{per standard si intende che implementa le
caratteristiche previste dallo standard POSIX. In Linux sono disponibili
- anche una serie di altri filesystem, come quelli di Windiws e del Mac, che
+ anche una serie di altri filesystem, come quelli di Windows e del Mac, che
non supportano queste caratteristiche.} In questa sezione ne esamineremo i
concetti essenziali e le funzioni usate per gestirne i vari aspetti.
Per una spiegazione dettagliata degli identificatori associati ai processi si
veda \secref{sec:proc_perms}; normalmente, a parte quanto vedremo in
-\secref{sec:file_suid_sgid}, l'userid effettivo e il groupid effectivo
+\secref{sec:file_suid_sgid}, l'userid effettivo e il groupid effettivo
corrispondono ai valori dell'\acr{uid} e del \acr{gid} dell'utente che ha
lanciato il processo, mentre i groupid supplementari sono quelli dei gruppi
cui l'utente appartiene.
Usare la semantica BSD ha il vantaggio che il \acr{gid} viene sempre
automaticamente propagato, restando coerente a quello della directory di
-partenza, in tutte le sottodirectory.
+partenza, in tutte le sotto-directory.
La semantica SVr4 offre la possibilità di scegliere, ma per ottenere lo stesso
risultato di coerenza che si ha con BSD necessita che per le nuove directory
venga anche propagato anche il bit \acr{sgid}. Questo è il comportamento
predefinito del comando \cmd{mkdir}, ed è in questo modo ad esempio che Debian
-assicura che le sottodirectory create nella home di un utente restino sempre
+assicura che le sotto-directory create nella home di un utente restino sempre
con il \acr{gid} del gruppo primario dello stesso.
\acr{s}&\acr{s}&\acr{t}&r&w&x&r&w&x&r&w&x& \\
\hline
\hline
- 1&-&-&-&-&-&-&-&-&-&-&-&Se eseguito ha i permessi del propritario\\
- -&1&-&-&-&1&-&-&-&-&-&-&Se eseguito ha i permessi del gruppo propritario\\
+ 1&-&-&-&-&-&-&-&-&-&-&-&Se eseguito ha i permessi del proprietario\\
+ -&1&-&-&-&1&-&-&-&-&-&-&Se eseguito ha i permessi del gruppo proprietario\\
-&1&-&-&-&0&-&-&-&-&-&-&Il \textit{mandatory locking} è abilitato\\
-&-&1&-&-&-&-&-&-&-&-&-&Non utilizzato\\
-&-&-&1&-&-&-&-&-&-&-&-&Permesso di lettura per il proprietario\\
\label{sec:file_chroot}
Benché non abbia niente a che fare con permessi, utenti e gruppi, la funzione
-\func{chroot} viene usata spesso per restringere le capacità di acccesso di un
+\func{chroot} viene usata spesso per restringere le capacità di accesso di un
programma ad una sezione limitata del filesystem, per cui ne parleremo in
questa sezione.
\figref{fig:proc_task_struct}.} che è la directory che per il processo
costituisce la radice dell'albero dei file e rispetto alla quale vengono
risolti i pathname assoluti (si ricordi quanto detto in
-\secref{sec:file_organization}). La radice viene eredidata dal padre per ogni
+\secref{sec:file_organization}). La radice viene ereditata dal padre per ogni
processo figlio, e quindi di norma coincide con la \file{/} del sistema.
In certe situazioni però per motivi di sicurezza non si vuole che un processo
Ma quando ad un processo restano i privilegi di root esso potrà sempre portare
la directory di lavoro corrente fuori dalla \textit{chroot jail} creando una
-sottodirectory ed eseguendo una \func{chroot} su di essa. Per questo motivo
+sotto-directory ed eseguendo una \func{chroot} su di essa. Per questo motivo
l'uso di questa funzione non ha molto senso quando un processo necessita dei
privilegi di root per le sue normali operazioni.
-Un caso tipico di uso di \func{chroot} è quello di un server ftp anonimo, in
+Un caso tipico di uso di \func{chroot} è quello di un server FTP anonimo, in
questo caso infatti si vuole che il server veda solo i file che deve
trasferire, per cui in genere si esegue una \func{chroot} sulla directory che
contiene i file. Si tenga presente però che in questo caso occorrerà
processo alla volta (nel qual caso basta usare due fifo, una per leggere ed
una per scrivere), le cose diventano invece molto più complesse quando si
vuole effettuare una comunicazione fra il server ed un numero imprecisato di
-client; se il primo infatti può ricevere le richieste attraverso una fifo
-``nota'', per le risposte non si può fare altrettanto, dato che, per la
-struttura sequenziale delle fifo, i client dovrebbero sapere, prima di
+client; se il primo infatti può ricevere le richieste attraverso una fifo```\textsl{nota}'', per le risposte non si può fare altrettanto, dato che, per
+la struttura sequenziale delle fifo, i client dovrebbero sapere, prima di
leggerli, quando i dati inviati sono destinati a loro.
Per risolvere questo problema, si può usare un'architettura come quella
utilizzando il valore del contatore come indicatore del ``numero di risorse''
ancora disponibili.
-Il sistema di comunicazione interprocesso di \textit{SysV IPC} prevede anche i
+Il sistema di comunicazione inter-processo di \textit{SysV IPC} prevede anche i
semafori, ma gli oggetti utilizzati non sono semafori singoli, ma gruppi di
semafori detti \textsl{insiemi} (o \textit{semaphore set}); la funzione che
permette di creare o ottenere l'identificatore di un insieme di semafori è
effettuata in forma di messaggio.} o quando non può avvenire secondo una
modalità predefinita.
-Un esempio classico di uso della memoria condivisa è quello del ``monitor'',
-in cui essa viene per scambiare informazioni fra un processo ``server'' che vi
-scrive dei dati di interesse generale che ha ottenuto, e tutti i processi
-``client'' interessati agli stessi dati che così possono leggerli in maniera
-completamente asincrona. Con questo schema di funzionamento da una parte si
-evita che ciascun processo ``client'' debbia compiere l'operazione,
-potenzialmente onerosa, di ricavare e trattare i dati, e dall'altra si evita
-al processo ``server'' di dover gestire l'invio a tutti i client di tutti i
-dati (non potendo il server sapere quali di essi servono effettivamente al
-singolo client).
+Un esempio classico di uso della memoria condivisa è quello del
+``\textit{monitor}'', in cui essa viene per scambiare informazioni fra un
+processo ``server'' che vi scrive dei dati di interesse generale che ha
+ottenuto, e tutti i processi ``client'' interessati agli stessi dati che così
+possono leggerli in maniera completamente asincrona. Con questo schema di
+funzionamento da una parte si evita che ciascun processo ``client'' debba
+compiere l'operazione, potenzialmente onerosa, di ricavare e trattare i dati,
+e dall'altra si evita al processo ``server'' di dover gestire l'invio a tutti
+i client di tutti i dati (non potendo il server sapere quali di essi servono
+effettivamente al singolo client).
Nel nostro caso implementeremo un ``monitor'' di una directory: un processo si
incaricherà di tenere sotto controllo alcuni parametri relativi ad una
-directory (il numero dei file contenuti, la dimenzione totale, ecc.) che
+directory (il numero dei file contenuti, la dimensione totale, ecc.) che
saranno salvati in un segmento di memoria condivisa cui altri processi
potranno accedere per ricavare la parte di informazione che interessa.