%% fileadv.tex
%%
-%% Copyright (C) 2000-2005 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2000-2006 Simone Piccardi. Permission is granted to
%% copy, distribute and/or modify this document under the terms of the GNU Free
%% Documentation License, Version 1.1 or any later version published by the
%% Free Software Foundation; with the Invariant Sections being "Un preambolo",
funzione.
L'uso di \param{sigmask} è stato introdotto allo scopo di prevenire possibili
-\textit{race condition}\itindex{race~condition} quando ci si deve porre in
+\textit{race condition} \itindex{race~condition} quando ci si deve porre in
attesa sia di un segnale che di dati. La tecnica classica è quella di
utilizzare il gestore per impostare una variabile globale e controllare questa
nel corpo principale del programma; abbiamo visto in
può fare conto sul fatto che all'arrivo di un segnale essa verrebbe interrotta
e si potrebbero eseguire di conseguenza le operazioni relative al segnale e
alla gestione dati con un ciclo del tipo:
-\includecodesnip{listati/select_race.c} qui però emerge una \textit{race
- condition},\itindex{race~condition} perché se il segnale arriva prima della
-chiamata a \func{select}, questa non verrà interrotta, e la ricezione del
-segnale non sarà rilevata.
+\includecodesnip{listati/select_race.c}
+qui però emerge una \itindex{race~condition} \textit{race condition}, perché
+se il segnale arriva prima della chiamata a \func{select}, questa non verrà
+interrotta, e la ricezione del segnale non sarà rilevata.
Per questo è stata introdotta \func{pselect} che attraverso l'argomento
\param{sigmask} permette di riabilitare la ricezione il segnale
\func{pselect} la ricezione del segnale sarà abilitata, ed in caso di
interruzione si potranno eseguire le relative operazioni.
+% TODO pselect è stata introdotta nel kernel 2.6.16 (o 15 o 17?) insieme a
+% ppoll mettere e verificare
\subsection{La funzione \func{poll}}
tramite \var{errno}.
+% TODO accennare a ppoll
+
%\subsection{L'interfaccia di \textit{epoll}}
%\label{sec:file_epoll}
% placeholder ...
\errcode{EINVAL} siano rilevati immediatamente al momento della chiamata,
potrebbero anche emergere nelle fasi successive delle operazioni. Lettura e
scrittura avvengono alla posizione indicata da \var{aio\_offset}, a meno che
-il file non sia stato aperto in \textit{append mode} (vedi
-sez.~\ref{sec:file_open}), nel qual caso le scritture vengono effettuate
+il file non sia stato aperto in \itindex{append~mode} \textit{append mode}
+(vedi sez.~\ref{sec:file_open}), nel qual caso le scritture vengono effettuate
comunque alla fine de file, nell'ordine delle chiamate a \func{aio\_write}.
Si tenga inoltre presente che deallocare la memoria indirizzata da
un \const{SIGSEGV}. \\
\const{MAP\_LOCKED} & Se impostato impedisce lo swapping delle pagine
mappate.\\
- \const{MAP\_GROWSDOWN} & Usato per gli stack. Indica
+ \const{MAP\_GROWSDOWN} & Usato per gli \itindex{stack} stack. Indica
che la mappatura deve essere effettuata con gli
indirizzi crescenti verso il basso.\\
\const{MAP\_ANONYMOUS} & La mappatura non è associata a nessun file. Gli
\label{sec:file_locking}
\index{file!locking|(}
+
In sez.~\ref{sec:file_sharing} abbiamo preso in esame le modalità in cui un
sistema unix-like gestisce la condivisione dei file da parte di processi
diversi. In quell'occasione si è visto come, con l'eccezione dei file aperti
-in \textit{append mode}, quando più processi scrivono contemporaneamente sullo
-stesso file non è possibile determinare la sequenza in cui essi opereranno.
+in \itindex{append~mode} \textit{append mode}, quando più processi scrivono
+contemporaneamente sullo stesso file non è possibile determinare la sequenza
+in cui essi opereranno.
-Questo causa la possibilità di una \textit{race condition}
-\itindex{race~condition}; in generale le situazioni più comuni sono due:
-l'interazione fra un processo che scrive e altri che leggono, in cui questi
-ultimi possono leggere informazioni scritte solo in maniera parziale o
-incompleta; o quella in cui diversi processi scrivono, mescolando in maniera
-imprevedibile il loro output sul file.
+Questo causa la possibilità di una \itindex{race~condition} \textit{race
+ condition}; in generale le situazioni più comuni sono due: l'interazione fra
+un processo che scrive e altri che leggono, in cui questi ultimi possono
+leggere informazioni scritte solo in maniera parziale o incompleta; o quella
+in cui diversi processi scrivono, mescolando in maniera imprevedibile il loro
+output sul file.
In tutti questi casi il \textit{file locking} è la tecnica che permette di
evitare le \textit{race condition}\itindex{race~condition}, attraverso una
voce nella file table, ma con il valore del \acr{pid} del processo.
Quando si richiede un lock il kernel effettua una scansione di tutti i lock
-presenti sul file\footnote{scandisce cioè la
- \itindex{linked~list}\textit{linked list} delle strutture
- \struct{file\_lock}, scartando automaticamente quelle per cui
- \var{fl\_flags} non è \const{FL\_POSIX}, così che le due interfacce restano
- ben separate.} per verificare se la regione richiesta non si sovrappone ad
-una già bloccata, in caso affermativo decide in base al tipo di lock, in caso
-negativo il nuovo lock viene comunque acquisito ed aggiunto alla lista.
+presenti sul file\footnote{scandisce cioè la \itindex{linked~list}
+ \textit{linked list} delle strutture \struct{file\_lock}, scartando
+ automaticamente quelle per cui \var{fl\_flags} non è \const{FL\_POSIX}, così
+ che le due interfacce restano ben separate.} per verificare se la regione
+richiesta non si sovrappone ad una già bloccata, in caso affermativo decide in
+base al tipo di lock, in caso negativo il nuovo lock viene comunque acquisito
+ed aggiunto alla lista.
Nel caso di rimozione invece questa viene effettuata controllando che il
\acr{pid} del processo richiedente corrisponda a quello contenuto nel lock.
\subsection{Il \textit{mandatory locking}}
\label{sec:file_mand_locking}
+\itindbeg{mandatory~locking|(}
+
Il \textit{mandatory locking} è una opzione introdotta inizialmente in SVr4,
per introdurre un file locking che, come dice il nome, fosse effettivo
indipendentemente dai controlli eseguiti da un processo. Con il
quando esso viene utilizzato per attivare il \textit{mandatory locking}.}
L'uso del \textit{mandatory locking} presenta vari aspetti delicati, dato che
-neanche root può passare sopra ad un lock; pertanto un processo che blocchi un
-file cruciale può renderlo completamente inaccessibile, rendendo completamente
-inutilizzabile il sistema\footnote{il problema si potrebbe risolvere
- rimuovendo il bit \itindex{sgid~bit} \acr{sgid}, ma non è detto che sia così
- facile fare questa operazione con un sistema bloccato.} inoltre con il
-\textit{mandatory locking} si può bloccare completamente un server NFS
-richiedendo una lettura su un file su cui è attivo un lock. Per questo motivo
-l'abilitazione del mandatory locking è di norma disabilitata, e deve essere
-attivata filesystem per filesystem in fase di montaggio (specificando
-l'apposita opzione di \func{mount} riportata in
+neanche l'amministratore può passare sopra ad un lock; pertanto un processo
+che blocchi un file cruciale può renderlo completamente inaccessibile,
+rendendo completamente inutilizzabile il sistema\footnote{il problema si
+ potrebbe risolvere rimuovendo il bit \itindex{sgid~bit} \acr{sgid}, ma non è
+ detto che sia così facile fare questa operazione con un sistema bloccato.}
+inoltre con il \textit{mandatory locking} si può bloccare completamente un
+server NFS richiedendo una lettura su un file su cui è attivo un lock. Per
+questo motivo l'abilitazione del mandatory locking è di norma disabilitata, e
+deve essere attivata filesystem per filesystem in fase di montaggio
+(specificando l'apposita opzione di \func{mount} riportata in
tab.~\ref{tab:sys_mount_flags}, o con l'opzione \code{-o mand} per il comando
omonimo).
qual caso la funzione fallisce con il solito \errcode{EAGAIN}) che comporta la
possibilità di modificare il file.
\index{file!locking|)}
+\itindend{mandatory~locking|(}
%%% mode: latex
%%% TeX-master: "gapil"
%%% End:
+
+% LocalWords: dell'I locking multiplexing cap dell' sez system call socket BSD
+% LocalWords: descriptor client deadlock NONBLOCK EAGAIN polling select kernel
+% LocalWords: pselect like sys unistd int fd readfds writefds exceptfds struct
+% LocalWords: timeval errno EBADF EINTR EINVAL ENOMEM sleep tab signal void of
+% LocalWords: CLR ISSET SETSIZE POSIX read NULL nell'header l'header glibc fig
+% LocalWords: libc header psignal sigmask SOURCE XOPEN timespec sigset race DN
+% LocalWords: condition sigprocmask tut self trick oldmask poll XPG pollfd l'I
+% LocalWords: ufds unsigned nfds RLIMIT NOFILE EFAULT ndfs events revents hung
+% LocalWords: POLLIN POLLRDNORM POLLRDBAND POLLPRI POLLOUT POLLWRNORM POLLERR
+% LocalWords: POLLWRBAND POLLHUP POLLNVAL POLLMSG SysV stream ASYNC SETOWN FAQ
+% LocalWords: GETOWN fcntl SETFL SIGIO SETSIG Stevens driven siginfo sigaction
+% LocalWords: all'I nell'I Frequently Unanswered Question SIGHUP lease holder
+% LocalWords: breaker truncate write SETLEASE arg RDLCK WRLCK UNLCK GETLEASE
+% LocalWords: uid capabilities capability EWOULDBLOCK notify dall'OR ACCESS st
+% LocalWords: pread readv MODIFY pwrite writev ftruncate creat mknod mkdir buf
+% LocalWords: symlink rename DELETE unlink rmdir ATTRIB chown chmod utime lio
+% LocalWords: MULTISHOT thread linkando librt layer aiocb asyncronous control
+% LocalWords: block ASYNCHRONOUS lseek fildes nbytes reqprio PRIORITIZED sigev
+% LocalWords: PRIORITY SCHEDULING opcode listio sigevent signo value function
+% LocalWords: aiocbp ENOSYS append error const EINPROGRESS fsync return ssize
+% LocalWords: DSYNC fdatasync SYNC cancel ECANCELED ALLDONE CANCELED suspend
+% LocalWords: NOTCANCELED list nent timout sig NOP WAIT NOWAIT size count iov
+% LocalWords: iovec vector EOPNOTSUPP EISDIR len memory mapping mapped swap NB
+% LocalWords: mmap length prot flags off MAP FAILED ANONYMOUS EACCES SHARED SH
+% LocalWords: only ETXTBSY DENYWRITE ENODEV filesystem EPERM EXEC noexec table
+% LocalWords: ENFILE lenght segment violation SIGSEGV FIXED msync munmap copy
+% LocalWords: DoS Denial Service EXECUTABLE NORESERVE LOCKED swapping stack fs
+% LocalWords: GROWSDOWN ANON GiB POPULATE prefaulting SIGBUS fifo VME fork old
+% LocalWords: exec atime ctime mtime mprotect addr EACCESS mremap address new
+% LocalWords: long MAYMOVE realloc VMA virtual Ingo Molnar remap pages pgoff
+% LocalWords: dall' fault cache linker prelink advisory discrectionary lock fl
+% LocalWords: flock shared exclusive operation dup inode linked NFS cmd ENOLCK
+% LocalWords: EDEADLK whence SEEK CUR type pid GETLK SETLK SETLKW all'inode HP
+% LocalWords: switch bsd lockf mandatory SVr sgid group root mount mand TRUNC
+% LocalWords: SVID UX Documentation