X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileunix.tex;h=782afc976b1323f9208a209d80099bb82b66e033;hp=0863017c1c74a1a54c14b75be656517290420a5f;hb=17bae834f41549575a11ddf444d97de8d575269e;hpb=da0899b61653d07d75c8df134906261f1afd2485 diff --git a/fileunix.tex b/fileunix.tex index 0863017..782afc9 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -1,6 +1,6 @@ %% fileunix.tex %% -%% Copyright (C) 2000-2002 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2003 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 "Prefazione", @@ -50,10 +50,10 @@ Quando un file viene aperto la funzione \func{open} restituisce questo numero, tutte le ulteriori operazioni saranno compiute specificando questo stesso valore come argomento alle varie funzioni dell'interfaccia. -Per capire come funziona il meccanismo occorre spiegare a grandi linee come è -che il kernel gestisce l'interazione fra processi e file. Il kernel mantiene -sempre un elenco dei processi attivi nella cosiddetta \textit{process table} -ed un elenco dei file aperti nella \textit{file table}. +Per capire come funziona il meccanismo occorre spiegare a grandi linee come il +kernel gestisce l'interazione fra processi e file. Il kernel mantiene sempre +un elenco dei processi attivi nella cosiddetta \textit{process table} ed un +elenco dei file aperti nella \textit{file table}. La \textit{process table} è una tabella che contiene una voce per ciascun processo attivo nel sistema. In Linux ciascuna voce è costituita da una @@ -129,7 +129,7 @@ quindi alla lettura della tastiera). Il secondo file inviati i dati in uscita (sempre nel caso della shell, è associato all'uscita del terminale, e quindi alla scrittura sullo schermo). Il terzo è lo \textit{standard error}, su cui viene inviato l'output relativo agli errori, -ed è anch'esso associato all'uscita del termininale. Lo standard POSIX.1 +ed è anch'esso associato all'uscita del terminale. Lo standard POSIX.1 provvede tre costanti simboliche, definite nell'header \file{unistd.h}, al posto di questi valori numerici: \begin{table}[htb] @@ -253,7 +253,7 @@ usato sempre il file descriptor con il valore pi valore specifica anche una modalità di operazione (vedi sotto), e comporta che \func{open} ritorni immediatamente (l'opzione ha senso solo per le fifo, torneremo questo in \secref{sec:ipc_named_pipe}). \\ - \const{O\_NOCTTY} & se \param{pathname} si riferisce ad un device di + \const{O\_NOCTTY} & se \param{pathname} si riferisce ad un dispositivo di terminale, questo non diventerà il terminale di controllo, anche se il processo non ne ha ancora uno (si veda \secref{sec:sess_ctrl_term}). \\ \const{O\_SHLOCK} & opzione di BSD, acquisisce uno shared lock (vedi @@ -300,7 +300,7 @@ usato sempre il file descriptor con il valore pi \func{write} bloccherà fino al completamento della scrittura di tutti dati sul sull'hardware sottostante.\\ \const{O\_FSYNC} & sinonimo di \const{O\_SYNC}. \\ - \const{O\_NOATIME} & blocca l'aggiornamento dei tempi dei di accesso dei + \const{O\_NOATIME} & blocca l'aggiornamento dei tempi di accesso dei file (vedi \secref{sec:file_file_times}). In Linux questa opzione non è disponibile per il singolo file ma come opzione per il filesystem in fase di montaggio.\\ @@ -317,9 +317,10 @@ usato sempre il file descriptor con il valore pi file con un nome univoco e la funzione \func{link} per verificarne l'esistenza (vedi \secref{sec:ipc_file_lock}).} -\footnotetext[3]{\textit{Denial of Service}, si chiamano così attacchi miranti - ad impedire un servizio causando una qualche forma di carico eccessivo per - il sistema, che resta bloccato nelle risposte all'attacco.} +\footnotetext[3]{\textit{Denial of Service}\index{DoS}, si chiamano così + attacchi miranti ad impedire un servizio causando una qualche forma di + carico eccessivo per il sistema, che resta bloccato nelle risposte + all'attacco.} \footnotetext[4]{il problema è che NFS non supporta la scrittura in append, ed il kernel deve simularla, ma questo comporta la possibilità di una race @@ -335,20 +336,17 @@ descriptor che si otterr alcune applicazioni per sostituire i file corrispondenti ai file standard visti in \secref{sec:file_std_descr}: se ad esempio si chiude lo standard input e si apre subito dopo un nuovo file questo diventerà il nuovo standard -input (avrà cioè il file descriptor 0). - -Il nuovo file descriptor non è condiviso con nessun altro processo (torneremo -sulla condivisione dei file, in genere accessibile dopo una \func{fork}, in -\secref{sec:file_sharing}). Il nuovo file descriptor è impostato per restare -aperto attraverso una \func{exec} (come accennato in \secref{sec:proc_exec}) e -l'offset è impostato all'inizio del file. - -L'argomento \param{mode} specifica i permessi con cui il file viene -eventualmente creato; i valori possibili sono gli stessi già visti in -\secref{sec:file_perm_overview} e possono essere specificati come OR binario -delle costanti descritte in \tabref{tab:file_bit_perm}. Questi permessi sono -filtrati dal valore di \var{umask} (vedi \secref{sec:file_umask}) per il -processo. +input (avrà cioè il file descriptor 0). Il nuovo file descriptor non è +condiviso con nessun altro processo (torneremo sulla condivisione dei file, in +genere accessibile dopo una \func{fork}, in \secref{sec:file_sharing}) ed è +impostato per restare aperto attraverso una \func{exec} (come accennato in +\secref{sec:proc_exec}); l'offset è impostato all'inizio del file. + +L'argomento \param{mode} indica i permessi con cui il file viene creato; i +valori possibili sono gli stessi già visti in \secref{sec:file_perm_overview} +e possono essere specificati come OR binario delle costanti descritte in +\tabref{tab:file_bit_perm}. Questi permessi sono filtrati dal valore di +\var{umask} (vedi \secref{sec:file_umask}) per il processo. La funzione prevede diverse opzioni, che vengono specificate usando vari bit dell'argomento \param{flags}. Alcuni di questi bit vanno anche a costituire @@ -356,33 +354,33 @@ il flag di stato del file (o \textit{file status flag}), che campo \var{f\_flags} della struttura \struct{file} (al solito si veda lo schema di \figref{fig:file_proc_file}). Essi sono divisi in tre categorie principali: -\begin{itemize} +\begin{itemize*} \item \textsl{i bit delle modalità di accesso}: specificano con quale modalità si accederà al file: i valori possibili sono lettura, scrittura o lettura/scrittura. Uno di questi bit deve essere sempre specificato quando si apre un file. Vengono impostati alla chiamata da \func{open}, e possono - essere riletti con una \func{fcntl} (fanno parte del \textit{file status - flag}), ma non possono essere modificati. + essere riletti con \func{fcntl} (fanno parte del \textit{file status flag}), + ma non possono essere modificati. \item \textsl{i bit delle modalità di apertura}: permettono di specificare alcune delle caratteristiche del comportamento di \func{open} quando viene eseguita. Hanno effetto solo al momento della chiamata della funzione e non sono memorizzati né possono essere riletti. \item \textsl{i bit delle modalità di operazione}: permettono di specificare alcune caratteristiche del comportamento delle future operazioni sul file - (come la \func{read} o la \func{write}). Anch'essi fanno parte del - \textit{file status flag}. Il loro valore è impostato alla chiamata di - \func{open}, ma possono essere riletti e modificati (insieme alle - caratteristiche operative che controllano) con una \func{fcntl}. -\end{itemize} + (come \func{read} o \func{write}). Anch'essi fan parte del \textit{file + status flag}. Il loro valore è impostato alla chiamata di \func{open}, ma + possono essere riletti e modificati (insieme alle caratteristiche operative + che controllano) con una \func{fcntl}. +\end{itemize*} -In \tabref{tab:file_open_flags} si sono riportate, ordinate e divise fra loro +In \tabref{tab:file_open_flags} sono riportate, ordinate e divise fra loro secondo le tre modalità appena elencate, le costanti mnemoniche associate a -ciascuno di questi bit. Dette costanti possono essere combinate fra di loro -con un OR aritmetico per costruire il valore (in forma di maschera binaria) -dell'argomento \param{flags} da passare alla \func{open} per specificarne il -comportamento. I due flag \const{O\_NOFOLLOW} e \const{O\_DIRECTORY} sono -estensioni specifiche di Linux, e deve essere definita la macro -\macro{\_GNU\_SOURCE} per poterli usare. +ciascuno di questi bit. Dette costanti possono essere combinate fra loro con +un OR aritmetico per costruire il valore (in forma di maschera binaria) +dell'argomento \param{flags} da passare alla \func{open}. I due flag +\const{O\_NOFOLLOW} e \const{O\_DIRECTORY} sono estensioni specifiche di +Linux, e deve essere definita la macro \macro{\_GNU\_SOURCE} per poterli +usare. Nelle prime versioni di Unix i valori di \param{flag} specificabili per \func{open} erano solo quelli relativi alle modalità di accesso del file. Per @@ -406,7 +404,7 @@ descriptor ritorna disponibile; il suo prototipo Chiude il descrittore \param{fd}. \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di errore, - ed in questo caso \var{errno} assumerà uno dei valori: + con \var{errno} che assume i valori: \begin{errlist} \item[\errcode{EBADF}] \param{fd} non è un descrittore valido. \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale. @@ -461,7 +459,7 @@ ad un valore qualsiasi con la funzione \funcd{lseek}, il cui prototipo \funcdecl{off\_t lseek(int fd, off\_t offset, int whence)} Imposta la posizione attuale nel file. - \bodydesc{La funzione ritorna valore della posizione corrente in caso di + \bodydesc{La funzione ritorna il valore della posizione corrente in caso di successo e -1 in caso di errore nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} @@ -491,20 +489,19 @@ seguenti valori\footnote{per compatibilit Come accennato in \secref{sec:file_file_size} con \func{lseek} è possibile impostare la posizione corrente anche oltre la fine del file, e alla -successiva scrittura il file sarà esteso. La chiamata non causa nessuna -attività di input/output, si limita a modificare la posizione corrente nel -kernel (cioè \var{f\_pos} in \param{file}, vedi \figref{fig:file_proc_file}). - -Dato che la funzione ritorna la nuova posizione, usando il valore zero per -\param{offset} si può riottenere la posizione corrente nel file chiamando la -funzione con \code{lseek(fd, 0, SEEK\_CUR)}. +successiva scrittura il file sarà esteso. La chiamata non causa nessun accesso +al file, si limita a modificare la posizione corrente (cioè il valore +\var{f\_pos} in \param{file}, vedi \figref{fig:file_proc_file}). Dato che la +funzione ritorna la nuova posizione, usando il valore zero per \param{offset} +si può riottenere la posizione corrente nel file chiamando la funzione con +\code{lseek(fd, 0, SEEK\_CUR)}. Si tenga presente inoltre che usare \const{SEEK\_END} non assicura affatto che la successiva scrittura avvenga alla fine del file, infatti se questo è stato aperto anche da un altro processo che vi ha scritto, la fine del file può essersi spostata, ma noi scriveremo alla posizione impostata in precedenza -(questa è una potenziale sorgente di \textit{race condition} -\index{race condition}, vedi \secref{sec:file_atomic}). +(questa è una potenziale sorgente di +\textit{race condition}\index{race condition}, vedi \secref{sec:file_atomic}). Non tutti i file supportano la capacità di eseguire una \func{lseek}, in questo caso la funzione ritorna l'errore \errcode{EPIPE}. Questo, oltre che per @@ -521,7 +518,7 @@ indefinito. \label{sec:file_read} -Una volta che un file è stato aperto (con il permesso in lettura) su possono +Una volta che un file è stato aperto (con il permesso in lettura) si possono leggere i dati che contiene utilizzando la funzione \funcd{read}, il cui prototipo è: \begin{prototype}{unistd.h}{ssize\_t read(int fd, void * buf, size\_t count)} @@ -545,24 +542,21 @@ prototipo La funzione tenta di leggere \param{count} byte a partire dalla posizione corrente nel file. Dopo la lettura la posizione sul file è spostata automaticamente in avanti del numero di byte letti. Se \param{count} è zero la -funzione restituisce zero senza nessun altro risultato. - -Si deve sempre tener presente che non è detto che la funzione \func{read} -restituisca sempre il numero di byte richiesto, ci sono infatti varie ragioni -per cui la funzione può restituire un numero di byte inferiore; questo è un -comportamento normale, e non un errore, che bisogna sempre tenere presente. +funzione restituisce zero senza nessun altro risultato. Si deve sempre tener +presente che non è detto che la funzione \func{read} restituisca sempre il +numero di byte richiesto, ci sono infatti varie ragioni per cui la funzione +può restituire un numero di byte inferiore; questo è un comportamento normale, +e non un errore, che bisogna sempre tenere presente. La prima e più ovvia di queste ragioni è che si è chiesto di leggere più byte di quanto il file ne contenga. In questo caso il file viene letto fino alla sua fine, e la funzione ritorna regolarmente il numero di byte letti -effettivamente. - -Raggiunta la fine del file, alla ripetizione di un'operazione di lettura, -otterremmo il ritorno immediato di \func{read} con uno zero. La condizione di -raggiungimento della fine del file non è un errore, e viene segnalata appunto -da un valore di ritorno di \func{read} nullo. Ripetere ulteriormente la -lettura non avrebbe nessun effetto se non quello di continuare a ricevere zero -come valore di ritorno. +effettivamente. Raggiunta la fine del file, alla ripetizione di un'operazione +di lettura, otterremmo il ritorno immediato di \func{read} con uno zero. La +condizione di raggiungimento della fine del file non è un errore, e viene +segnalata appunto da un valore di ritorno di \func{read} nullo. Ripetere +ulteriormente la lettura non avrebbe nessun effetto se non quello di +continuare a ricevere zero come valore di ritorno. Con i \textsl{file regolari} questa è l'unica situazione in cui si può avere un numero di byte letti inferiore a quello richiesto, ma questo non è vero @@ -576,20 +570,19 @@ con un numero di byte inferiore a quelli richiesti. Lo stesso comportamento avviene caso di lettura dalla rete (cioè su un socket\index{socket}, come vedremo in \secref{sec:sock_io_behav}), o per la lettura da certi file di dispositivo, come le unità a nastro, che -restituiscono sempre i dati ad un singolo blocco alla volta. +restituiscono sempre i dati ad un singolo blocco alla volta. In realtà anche le due condizioni segnalate dagli errori \errcode{EINTR} e \errcode{EAGAIN} non sono errori. La prima si verifica quando la \func{read} è bloccata in attesa di dati in ingresso e viene interrotta da un segnale; in tal caso l'azione da intraprendere è quella di rieseguire la funzione. -Torneremo in dettaglio sull'argomento in \secref{sec:sig_gen_beha}. - -La seconda si verifica quando il file è in modalità non bloccante (vedi +Torneremo in dettaglio sull'argomento in \secref{sec:sig_gen_beha}. La +seconda si verifica quando il file è in modalità non bloccante (vedi \secref{sec:file_noblocking}) e non ci sono dati in ingresso: la funzione -allora ritorna immediatamente con un errore \errcode{EAGAIN}\footnote{sotto - BSD per questo errore viene usata la costante \errcode{EWOULDBLOCK}, in - Linux, con le glibc, questa è sinonima di \errcode{EAGAIN}.} che indica -soltanto che occorrerà provare a ripetere la lettura. +allora ritorna immediatamente con un errore \errcode{EAGAIN}\footnote{BSD usa + per questo errore la costante \errcode{EWOULDBLOCK}, in Linux, con le + \acr{glibc}, questa è sinonima di \errcode{EAGAIN}.} che indica soltanto che +occorrerà provare a ripetere la lettura. La funzione \func{read} è una delle system call fondamentali, esistenti fin dagli albori di Unix, ma nella seconda versione delle \textit{Single Unix @@ -612,7 +605,7 @@ posizione \param{offset}, nel buffer \param{buf}. \end{prototype} \noindent che però diventa accessibile solo con la definizione della macro: \begin{verbatim} - #define _XOPEN_SOURCE 500 +#define _XOPEN_SOURCE 500 \end{verbatim} Questa funzione serve quando si vogliono leggere dati dal file senza @@ -645,10 +638,10 @@ scrivere su di esso utilizzando la funzione \funcd{write}, il cui prototipo chiuso in lettura; in questo caso viene anche generato il segnale \const{SIGPIPE}, se questo viene gestito (o bloccato o ignorato) la funzione ritorna questo errore. - \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale prima di - aver potuto scrivere qualsiasi dato. - \item[\errcode{EAGAIN}] la funzione non aveva nessun dato da restituire e si - era aperto il file in modalità \const{O\_NONBLOCK}. + \item[\errcode{EINTR}] si è stati interrotti da un segnale prima di aver + potuto scrivere qualsiasi dato. + \item[\errcode{EAGAIN}] ci si sarebbe bloccati, ma il file era aperto in + modalità \const{O\_NONBLOCK}. \end{errlist} ed inoltre \errval{EBADF}, \errval{EIO}, \errval{EISDIR}, \errval{EBADF}, \errval{ENOSPC}, \errval{EINVAL} e \errval{EFAULT} ed eventuali altri errori @@ -712,7 +705,7 @@ confronti dell'accesso allo stesso file da parte di processi diversi. \label{fig:file_mult_acc} \end{figure} -Il primo caso è quello in cui due processi diversi che aprono lo stesso file +Il primo caso è quello in cui due processi diversi aprono lo stesso file su disco; sulla base di quanto visto in \secref{sec:file_fd} avremo una situazione come quella illustrata in \figref{fig:file_mult_acc}: ciascun processo avrà una sua voce nella \textit{file table} referenziata da un @@ -951,7 +944,7 @@ dell'output fra l'esecuzione di una \func{fork} e la successiva \func{exec}; diventa così possibile associare un file (o una pipe) allo standard input o allo standard output (torneremo sull'argomento in \secref{sec:ipc_pipe_use}, quando tratteremo le pipe). Per fare questo in genere occorre prima chiudere -il file che si vuole sostituire, cossicché il suo file descriptor possa esser +il file che si vuole sostituire, cosicché il suo file descriptor possa esser restituito alla chiamata di \func{dup}, come primo file descriptor disponibile. @@ -983,7 +976,7 @@ funzione di controllo dei file \func{fnctl} (che esamineremo in la sintassi \code{fnctl(oldfd, F\_DUPFD, newfd)} e se si usa 0 come valore per \param{newfd} diventa equivalente a \func{dup}. -La sola differenza fra le due funzioni\footnote{a parte la sistassi ed i +La sola differenza fra le due funzioni\footnote{a parte la sintassi ed i diversi codici di errore.} è che \func{dup2} chiude il file descriptor \param{newfd} se questo è già aperto, garantendo che la duplicazione sia effettuata esattamente su di esso, invece \func{fcntl} restituisce il primo @@ -999,13 +992,13 @@ tutta una serie di operazioni ausiliarie che descriptor, che non riguardano la normale lettura e scrittura di dati, ma la gestione sia delle loro proprietà, che di tutta una serie di ulteriori funzionalità che il kernel può mettere a disposizione.\footnote{ad esempio si - gesticono con questa funzione l'I/O asincrono (vedi - \secref{sec:file_asyncronous_io}) e il file locking\index{file!locking} - (vedi \secref{sec:file_locking}).} + gestiscono con questa funzione varie modalità di I/O asincrono (vedi + \secref{sec:file_asyncronous_operation}) e il file + locking\index{file!locking} (vedi \secref{sec:file_locking}).} -Per queste operazioni di manipolazione e di controllo su proprietà e -caratteristiche un file descriptor, viene usata la funzione \funcd{fcntl}, il -cui prototipo è: +Per queste operazioni di manipolazione e di controllo delle varie proprietà e +caratteristiche di un file descriptor, viene usata la funzione \funcd{fcntl}, +il cui prototipo è: \begin{functions} \headdecl{unistd.h} \headdecl{fcntl.h} @@ -1024,95 +1017,130 @@ cui prototipo \end{errlist}} \end{functions} -Il comportamento di questa funzione è determinato dal valore del comando -\param{cmd} che le viene fornito; in \secref{sec:file_dup} abbiamo incontrato -un esempio per la duplicazione dei file descriptor, una lista dei possibili -valori è riportata di seguito: + +Il primo argomento della funzione è sempre il numero di file descriptor +\var{fd} su cui si vuole operare. Il comportamento di questa funzione, il +numero e il tipo degli argomenti, il valore di ritorno e gli eventuali errori +sono determinati dal valore dell'argomento \param{cmd} che in sostanza +corrisponde all'esecuzione di un determinato \textsl{comando}; in +\secref{sec:file_dup} abbiamo incontrato un esempio dell'uso di \func{fcntl} +per la duplicazione dei file descriptor, una lista di tutti i possibili valori +per \var{cmd} è riportata di seguito: \begin{basedescript}{\desclabelwidth{2.0cm}} \item[\const{F\_DUPFD}] trova il primo file descriptor disponibile di valore - maggiore o uguale ad \param{arg} e ne fa una copia di \param{fd}. In caso di - successo ritorna il nuovo file descriptor. Gli errori possibili sono - \errcode{EINVAL} se \param{arg} è negativo o maggiore del massimo consentito - o \errcode{EMFILE} se il processo ha già raggiunto il massimo numero di - descrittori consentito. + maggiore o uguale ad \param{arg} e ne fa una copia di \param{fd}. Ritorna il + nuovo file descriptor in caso di successo e -1 in caso di errore. Gli errori + possibili sono \errcode{EINVAL} se \param{arg} è negativo o maggiore del + massimo consentito o \errcode{EMFILE} se il processo ha già raggiunto il + massimo numero di descrittori consentito. \item[\const{F\_SETFD}] imposta il valore del \textit{file descriptor flag} al valore specificato con \param{arg}. Al momento l'unico bit usato è quello di \textit{close-on-exec}\index{close-on-exec}, identificato dalla costante \const{FD\_CLOEXEC}, che serve a richiedere che il file venga chiuso nella - esecuzione di una \func{exec} (vedi \secref{sec:proc_exec}). + esecuzione di una \func{exec} (vedi \secref{sec:proc_exec}). Ritorna un + valore nullo in caso di successo e -1 in caso di errore. \item[\const{F\_GETFD}] ritorna il valore del \textit{file descriptor flag} di - \param{fd}, se \const{FD\_CLOEXEC} è impostato i file descriptor aperti - vengono chiusi attraverso una \func{exec} altrimenti (il comportamento - predefinito) restano aperti. -\item[\const{F\_GETFL}] ritorna il valore del \textit{file status flag}, - permette cioè di rileggere quei bit impostati da \func{open} all'apertura del - file che vengono memorizzati (quelli riportati nella prima e terza sezione - di \tabref{tab:file_open_flags}). + \param{fd} o -1 in caso di errore; se \const{FD\_CLOEXEC} è impostato i file + descriptor aperti vengono chiusi attraverso una \func{exec} altrimenti (il + comportamento predefinito) restano aperti. +\item[\const{F\_GETFL}] ritorna il valore del \textit{file status flag} in + caso di successo o -1 in caso di errore; permette cioè di rileggere quei bit + impostati da \func{open} all'apertura del file che vengono memorizzati + (quelli riportati nella prima e terza sezione di + \tabref{tab:file_open_flags}). \item[\const{F\_SETFL}] imposta il \textit{file status flag} al valore - specificato da \param{arg}, possono essere impostati solo i bit riportati - nella terza sezione di \tabref{tab:file_open_flags}.\footnote{la pagina di - manuale riporta come impostabili solo \const{O\_APPEND}, - \const{O\_NONBLOCK} e \const{O\_ASYNC}.} + specificato da \param{arg}, ritorna un valore nullo in caso di successo o -1 + in caso di errore. Possono essere impostati solo i bit riportati nella terza + sezione di \tabref{tab:file_open_flags}.\footnote{la pagina di manuale + riporta come impostabili solo \const{O\_APPEND}, \const{O\_NONBLOCK} e + \const{O\_ASYNC}.} \item[\const{F\_GETLK}] richiede un controllo sul file lock specificato da - \param{lock}, sovrascrivendo la struttura da esso puntata con il risultato - (questa funzionalità è trattata in dettaglio in - \secref{sec:file_posix_lock}). + \param{lock}, sovrascrivendo la struttura da esso puntata con il risultato, + ritorna un valore nullo in caso di successo o -1 in caso di errore. Questa + funzionalità è trattata in dettaglio in \secref{sec:file_posix_lock}. \item[\const{F\_SETLK}] richiede o rilascia un file lock a seconda di quanto specificato nella struttura puntata da \param{lock}. Se il lock è tenuto da qualcun'altro ritorna immediatamente restituendo -1 e imposta \var{errno} a - \errcode{EACCES} o \errcode{EAGAIN} (questa funzionalità è trattata in - dettaglio in \secref{sec:file_posix_lock}). + \errcode{EACCES} o \errcode{EAGAIN}, in caso di successo ritorna un valore + nullo. Questa funzionalità è trattata in dettaglio in + \secref{sec:file_posix_lock}. \item[\const{F\_SETLKW}] identica a \const{F\_SETLK} eccetto per il fatto che la funzione non ritorna subito ma attende che il blocco sia rilasciato. Se l'attesa viene interrotta da un segnale la funzione restituisce -1 e imposta - \var{errno} a \errcode{EINTR} (questa funzionalità è trattata in dettaglio in - \secref{sec:file_posix_lock}). + \var{errno} a \errcode{EINTR}, in caso di successo ritorna un valore nullo. + Questa funzionalità è trattata in dettaglio in \secref{sec:file_posix_lock}. \item[\const{F\_GETOWN}] restituisce il \acr{pid} del processo o l'identificatore del process group\footnote{i \texttt{process group} sono - (vedi \secref{sec:sess_proc_group}) sono raggruppamenti di processi usati - nel controllo di sessione; a ciascuno di essi è associato un - identificatore (un numero positivo analogo al \acr{pid}).} che è preposto - alla ricezione dei segnali \const{SIGIO} e \const{SIGURG} per gli eventi - associati al file descriptor \param{fd}. Nel caso di un process group viene - restituito un valore negativo il cui valore assoluto corrisponde - all'identificatore del process group. + (vedi \secref{sec:sess_proc_group}) raggruppamenti di processi usati nel + controllo di sessione; a ciascuno di essi è associato un identificatore + (un numero positivo analogo al \acr{pid}).} che è preposto alla ricezione + dei segnali \const{SIGIO} e \const{SIGURG} per gli eventi associati al file + descriptor \param{fd}. Nel caso di un process group viene restituito un + valore negativo il cui valore assoluto corrisponde all'identificatore del + process group. In caso di errore viene restituito -1. \item[\const{F\_SETOWN}] imposta, con il valore dell'argomento \param{arg}, l'identificatore del processo o del \textit{process group} che riceverà i segnali \const{SIGIO} e \const{SIGURG} per gli eventi associati al file - descriptor \param{fd}. Come per \const{F\_GETOWN}, per impostare un process - group si deve usare per \param{arg} un valore negativo, il cui valore - assoluto corrisponde all'identificatore del process group. + descriptor \param{fd}, ritorna un valore nullo in caso di successo o -1 in + caso di errore. Come per \const{F\_GETOWN}, per impostare un + \textit{process group} si deve usare per \param{arg} un valore negativo, il + cui valore assoluto corrisponde all'identificatore del \textit{process + group}. \item[\const{F\_GETSIG}] restituisce il valore del segnale inviato quando ci sono dati disponibili in ingresso su un file descriptor aperto ed impostato per l'I/O asincrono (si veda \secref{sec:file_asyncronous_io}). Il valore 0 indica il valore predefinito (che è \const{SIGIO}), un valore diverso da zero indica il segnale richiesto, (che può essere anche lo stesso - \const{SIGIO}). + \const{SIGIO}). In caso di errore ritorna -1. \item[\const{F\_SETSIG}] imposta il segnale da inviare quando diventa - possibile effettuare I/O sul file descriptor in caso di I/O asincrono. Il + possibile effettuare I/O sul file descriptor in caso di I/O asincrono, + ritorna un valore nullo in caso di successo o -1 in caso di errore. Il valore zero indica di usare il segnale predefinito, \const{SIGIO}. Un altro - valore (compreso lo stesso \const{SIGIO}) specifica il segnale voluto; l'uso - di un valore diverso da zero permette inoltre, se si è installato il - gestore del segnale come \var{sa\_sigaction} usando + valore diverso da zero (compreso lo stesso \const{SIGIO}) specifica il + segnale voluto; l'uso di un valore diverso da zero permette inoltre, se si è + installato il gestore del segnale come \var{sa\_sigaction} usando \const{SA\_SIGINFO}, (vedi \secref{sec:sig_sigaction}), di rendere - disponibili al gestore informazioni ulteriori informazioni riguardo il - file che ha generato il segnale attraverso i valori restituiti in - \struct{siginfo\_t} (come vedremo in - \secref{sec:file_asyncronous_io}).\footnote{i due comandi \const{F\_SETSIG} - e \const{F\_GETSIG} sono una estensione specifica di Linux.} + disponibili al gestore informazioni ulteriori riguardo il file che ha + generato il segnale attraverso i valori restituiti in \struct{siginfo\_t} + (come vedremo in \secref{sec:file_asyncronous_io}).\footnote{i due comandi + \const{F\_SETSIG} e \const{F\_GETSIG} sono una estensione specifica di + Linux.} +\item[\const{F\_SETLEASE}] imposta o rimuove un \textit{file + lease}\footnote{questa è una nuova funzionalità, specifica di Linux, e + presente solo a partire dai kernel della serie 2.4.x, in cui il processo + che detiene un \textit{lease} su un file riceve una notifica qualora un + altro processo cerca di eseguire una \func{open} o una \func{truncate} su + di esso.} sul file descriptor \var{fd} a seconda del valore del terzo + argomento, che in questo caso è un \ctyp{int}, ritorna un valore nullo in + caso di successo o -1 in caso di errore. Questa funzionalità avanzata è + trattata in dettaglio in \secref{sec:file_asyncronous_operation}. +\item[\const{F\_GETLEASE}] restituisce il tipo di \textit{file lease} che il + processo detiene nei confronti del file descriptor \var{fd} o -1 in caso di + errore. Con questo comando il terzo argomento può essere omesso. Questa + funzionalità avanzata è trattata in dettaglio in + \secref{sec:file_asyncronous_operation}. +\item[\const{F\_NOTIFY}] attiva un meccanismo di notifica per cui viene + riportata al processo chiamante, tramite il segnale \const{SIGIO} (o altro + segnale specificato con \const{F\_SETSIG}) ogni modifica eseguita o + direttamente sulla directory cui \var{fd} fa riferimento, o su uno dei file + in essa contenuti; ritorna un valore nullo in caso di successo o -1 in caso + di errore. Questa funzionalità avanzata, disponibile dai kernel della serie + 2.4.x, è trattata in dettaglio in \secref{sec:file_asyncronous_operation}. \end{basedescript} La maggior parte delle funzionalità di \func{fcntl} sono troppo avanzate per -poter essere affrontate in dettaglio a questo punto; saranno riprese più -avanti quando affronteremo le problematiche ad esse relative (in particolare -le tematiche relative all'I/O asincrono sono trattate in maniera esaustiva in -\secref{sec:file_asyncronous_io} mentre quelle relative al \textit{file +poter essere affrontate in tutti i loro aspetti a questo punto; saranno +pertanto riprese più avanti quando affronteremo le problematiche ad esse +relative. In particolare le tematiche relative all'I/O asincrono e ai vari +meccanismi di notifica saranno trattate in maniera esaustiva in +\secref{sec:file_asyncronous_operation} mentre quelle relative al \textit{file locking}\index{file!locking} saranno esaminate in \secref{sec:file_locking}). + Si tenga presente infine che quando si usa la funzione per determinare le modalità di accesso con cui è stato aperto il file (attraverso l'uso del -comando \const{F\_GETFL}) è necessario estrarre i bit corripondenti nel +comando \const{F\_GETFL}) è necessario estrarre i bit corrispondenti nel \textit{file status flag} che si è ottenuto. Infatti la definizione corrente di quest'ultimo non assegna bit separati alle tre diverse modalità \const{O\_RDONLY}, \const{O\_WRONLY} e \const{O\_RDWR}.\footnote{in Linux