From: Simone Piccardi Date: Mon, 5 Nov 2001 23:27:42 +0000 (+0000) Subject: Completata (rozzamente) open, creato nuovo capito sull'I/O avanzato (con X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=d07e28ddd45c73db1d6087127daf51d158e5e822 Completata (rozzamente) open, creato nuovo capito sull'I/O avanzato (con uno scheletro elementare). Ispell e rifiniture sul resto --- diff --git a/fileunix.tex b/fileunix.tex index 077c659..9f02114 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -218,46 +218,59 @@ Il nuovo file descriptor non sulla condivisione dei file, in genere accessibile dopo una \func{fork}, in \secref{sec:file_sharing}). Il nuovo file descriptor è settato di default per restare aperto attraverso una \func{exec} (come accennato in -\secref{sec:proc_exec}) ed l'offset è settato all'inizio del file. - -La funzione prevede diverse modalità di apertura di un file, che vengono -specificate dal parametro \var{flags}, questo parametro viene settato come -maschera binaria attraverso OR aritmetico delle costanti che identificano i -vari flag. Questi ultimi sono poi divisibili in tre categorie principali: +\secref{sec:proc_exec}) ed l'offset è settato all'inizio del file. + +Il parametro \var{mode} specifica i permessi con cui il file viene +eventualmente creato; i valori possibili 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 +filtrati dal valore di \file{umask} per il processo. + +La funzione prevede diverse opzioni, che vengono specificate usando vari bit +del parametro \var{flags}. Alcuni di questi vanno anche a costituire lo il +flag di stato del file (o \textit{file status flag}), che è mantenuto nel +campo \var{f\_flags} della struttura \var{file} (vedi \curfig). Questi +bit sono divisi in tre categorie principali: \begin{itemize} -\item \textsl{le modalità di accesso}, che specificano con quale modalità si - accede al file: lettura, scrittura o lettura/scrittura. Uno di questi - valori deve essere sempre specificato, vengono settati alla chiamata da - \func{open}, e possono essere riletti con una \func{fcntl}, ma non - modificati. -\item \textsl{le modalità di apertura}, che permettono di specificare alcuni - dei modi di funzionamento di \func{open}. Hanno effetto solo al momento - della chiamata e non sono memorizzati nè possono essere riletti. -\item \textsl{le modalità di operazione}, che permettono di specificare alcuni - effetti del comportamento delle operazioni sul file (come la \func{read} o - la \func{write}). Sono settati alla chiamata da \func{open}, ma possono - essere riletti e modificati con una una \func{fcntl}. +\item \textsl{i bit delle modalità di accesso}: specificano con quale modalità + si accede 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 settati alla chiamata da \func{open}, e possono + essere riletti con una \func{fcntl} (fanno parte del \textit{file status + flag}), ma non modificati. +\item \textsl{i bit delle modalità di apertura}: permettono di specificare + alcuni dei modi di funzionamento di \func{open}. 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 + alcuni effetti validi anche in seguito per il comportamento delle operazioni + sul file (come la \func{read} o la \func{write}). Anch'essi fanno parte del + \textit{file status flag}. Il loro valore è settato alla chiamata di + \func{open}, ma possono essere riletti e modificati con una \func{fcntl}. \end{itemize} -In \ntab\ si sono riportate, come definite in \file{fcntl.h}, le costanti che -identificano i vari flag di stato (ed i relativi valori numerici), da usare -per specificare il valore di \var{flags}, alcuni di questi poi andranno a -costituire lo stato del file (il cosiddetto \textit{file status flag}), tenuto -nel campo \var{f\_flags} di \var{file}. +In \ntab\ si sono riportate, ordinate e divise fra loro secondo le tre +modalità appena elencate, le costanti che identificano i vari bit, queste +possono essere combinate con un OR aritmetico per costruire il valore del +parametro \var{flags} da passare alla \func{open} per specificarne il +comportamento. -\begin{table}[htb] +\begin{table}[!htbp] \centering - \begin{tabular}[c]{|l|p{10cm}|} + \footnotesize + \begin{tabular}[c]{|l|p{12cm}|} \hline \textbf{Flag} & \textbf{Descrizione} \\ \hline - \hline % modailtà di accesso + \hline % modailtà di accesso al file \macro{O\_RDONLY} & apre il file in sola lettura\\ \macro{O\_WRONLY} & apre il file in sola scrittura\\ \macro{O\_RDWR} & apre il file lettura/scrittura\\ - \hline % modalita di apertura - \macro{O\_CREAT} & Se il file non esiste verrà creato, con le regole di - titolarità del file viste in \secref{sec:file_ownership}. \\ + \hline % modalita di apertura del file + \hline + \macro{O\_CREAT} & se il file non esiste verrà creato, con le regole di + titolarità del file viste in \secref{sec:file_ownership}. Il parametro + \var{mode} deve essere specificato. \\ \macro{O\_EXCL} & usato in congiunzione con \macro{O\_CREAT} fa sì che l'esistenza del file diventi un errore\footnote{la man page di \func{open} segnala che questa opzione è difettosa su NFS, e che i programmi che la @@ -265,38 +278,86 @@ nel campo \var{f\_flags} di \var{file}. condition. Si consiglia come alternativa di usare un file con un nome univoco e la funzione \func{link} per verificarne l'esistenza.} che fa fallire \func{open} con \macro{EEXIST}.\\ - \macro{O\_NOCTTY} & Se \var{pathname} si riferisce ad un device di + \macro{O\_NONBLOCK} & apre il file in modalità non bloccante. Questo + valore specifica anche una modalità di operazione (vedi sotto), e + comporta che \func{open} ritorni immediatamente (torneremo su + questo in \secref{sec:file_noblocking}). \\ + \macro{O\_NOCTTY} & se \var{pathname} si riferisce ad un device di terminale, questo non diventerà il terminale di controllo, anche se il processo non ne ha ancora uno (si veda \secref{sec:sess_xxx}).\\ - \macro{O\_SHLOCK} & \\ - \macro{O\_EXLOCK} & \\ - \macro{O\_TRUNC} & \\ - \macro{O\_NOFOLLOW} & \\ - \macro{O\_DIRECTORY} & \\ - \macro{O\_LARGEFILE} & \\ - \hline % modalità di operazione - \macro{O\_APPEND} & \\ - \macro{O\_NONBLOCK} & Apre il file in modalità non bloccante, questo - comporta che \func{open} ritorna immediatamente anche nei casi in cui si - sarebbe bloccata. inoltre tutte le operazioni di I/O successive restano - in modalità non bloccante, il che significa il fallimento di una - \func{read} in assenza di dati da leggere e quello di una \func{write} in - caso di impossibilità di scrivere immediatamente. \\ - \macro{O\_NDELAY} & sinonimo di \macro{O\_NONBLOCK}\\ - \macro{O\_ASYNC} & \\ + \macro{O\_SHLOCK} & opzione di BSD, acquisisce uno shared lock (vedi + \secref{sec:file_locking}) sul file. Non è disponibile in Linux.\\ + \macro{O\_EXLOCK} & opzione di BSD, acquisisce uno lock esclusivo (vedi + \secref{sec:file_locking}) sul file. Non è disponibile in Linux.\\ + \macro{O\_TRUNC} & se il file esiste ed è un file di dati e la modalità di + apertura consente la scrittura, allora la sua lunghezza verrà troncata a + zero. Se il file è un terminale o una fifo il flag verrà ignorato, negli + altri casi il comportamento non è specificato.\\ + \macro{O\_NOFOLLOW} & se \var{pathname} è un link simbolico la chiamata + fallisce. Questa è una estensione BSD aggiunta in Linux dal kernel 2.1.126. + Nelle versioni precedenti i link simbolici sono sempre seguiti, e questa + opzione è ignorata.\\ + \macro{O\_DIRECTORY} & se \var{pathname} non è una directory la chiamata + fallisce. Questo flag è specifico di Linux ed è stato introdotto con il + kernel 2.1.126 per evitare dei DoS\footnote{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} quando \func{opendir} viene chiamata su una fifo o su un + device di unità a nastri, non deve essere utilizzato al di fuori + dell'implementazione di \func{opendir}. \\ + \macro{O\_LARGEFILE} & nel caso di sistemi a 32 bit che supportano file di + grandi dimensioni consente di aprire file le cui dimensioni non possono + essere rappresentate da numeri a 31 bit.\\ + \hline + \hline % modalità di operazione col file + \macro{O\_APPEND} & il file viene aperto in append mode. Prima di ciascuna + scrittura la posizione corrente viene sempre settata alla fine del + file. Può causare corruzione del file con NFS se più di un processo scrive + allo stesso tempo\footnote{il problema è che NFS non supporta la scrittura + in append, ed il kernel deve simularla, ma questo comporta la possibilità + di una race condition}.\\ + \macro{O\_NONBLOCK} & il file viene aperto in modalità non bloccante per + le operazioni di I/O: questo significa il fallimento di una \func{read} in + assenza di dati da leggere e quello di una \func{write} in caso di + impossibilità di scrivere immediatamente. L'opzione è effettiva solo per + le fifo e per alcuni file di dispositivo. \\ + \macro{O\_NDELAY} & in Linux\footnote{l'opzione origina da SVr4, dove però + causava il ritorno da una \func{read} con un valore nullo e non con un + errore, questo introduce una ambiguità, dato che come vedremo in + \secref{sec:file_read} il ritorno di zero da parte di \func{read} ha il + significato di una end-of-file} è sinonimo di \macro{O\_NONBLOCK}\\ + \macro{O\_ASYNC} & apre il file per l'input/output in modalità + asincrona. Non è supportato in Linux. \\ \macro{O\_FSYNC} & \\ - \macro{O\_SYNC} & \\ - \macro{O\_NOATIME} & \\ + \macro{O\_SYNC} & apre il file per l'input/output sincrono, ogni + \func{write} bloccherà fino al completamento della scrittura di tutti dati + sul sull'hardware sottostante\\ + \macro{O\_NOATIME} & blocca l'aggiornamento dei tempi dei 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.\\ \hline \end{tabular} - \caption{Costanti che identificano i vari flag di stato del file specificati - alla sua aprertura tramite il parametro \var{flags} di \func{open}.} + \caption{Costanti definite in \file{fcntl.h} per indicare i vari bit + usabili per il specificare parametro \var{flags} di \func{open}.} \label{tab:file_open_flags} \end{table} +Nelle prime versioni di unix i flag specificabili per \func{open} erano solo +quelli delle modalità di apertura. Per questo motivo per creare un file c'era +una system call apposita, \func{creat}, il cui prototipo è: + +\begin{prototype}{fcntl.h} + {int creat(const char *pathname, mode\_t mode)} + Crea un nuovo file vuoto, con i permessi specificati da \var{mode}. É del + tutto equivalente a \func{open(filedes, O\_CREAT|O\_WRONLY|O\_TRUNC, mode)}. +\end{prototype} + +adesso questa funzione resta solo per compatibilità con i vecchi programmi. + + + -\subsection{La funzione \func{creat}} -\label{sec:file_creat} \subsection{La funzione \func{close}} \label{sec:file_close} diff --git a/gapil.tex b/gapil.tex index dc5aac7..1007fbc 100644 --- a/gapil.tex +++ b/gapil.tex @@ -104,6 +104,7 @@ Guida alla Programmazione in Linux.} \include{system} \include{session} \include{signal} +\include{fileadv} \include{ipc} \include{network} \include{socket} diff --git a/macro.tex b/macro.tex index 6b79556..05509cc 100644 --- a/macro.tex +++ b/macro.tex @@ -98,10 +98,7 @@ tab.~\thechapter.\theusercount} \newenvironment{functions} {% defining what is done by \begin \footnotesize - \par - \vspace{4pt} \center - \ \begin{minipage}[c]{14cm} \begin{description*}{}{} } diff --git a/process.tex b/process.tex index e022c2e..d95f13e 100644 --- a/process.tex +++ b/process.tex @@ -752,9 +752,9 @@ Il parametro \var{flags} di \func{mlockall} permette di controllarne il comportamento; esso può essere specificato come l'OR aritmetico delle due costanti: \begin{description*} -\item[\macro{MCL\_CURRENT}] blocca tutte le pagine correntemente mappate nello +\item \macro{MCL\_CURRENT} blocca tutte le pagine correntemente mappate nello spazio di indirizzi del processo. -\item[\macro{MCL\_FUTURE}] blocca tutte le pagine che saranno mappate nello +\item \macro{MCL\_FUTURE} blocca tutte le pagine che saranno mappate nello spazio di indirizzi del processo. \end{description*} diff --git a/prochand.tex b/prochand.tex index f81dcc9..da3f662 100644 --- a/prochand.tex +++ b/prochand.tex @@ -1340,18 +1340,22 @@ possono essere letti dal processo attraverso delle opportune funzioni, i cui prototipi sono i seguenti: \begin{functions} -\headdecl{unistd.h} -\headdecl{sys/types.h} -\funcdecl{uid\_t getuid(void)} restituisce il \textit{real user ID} del -processo corrente. -\funcdecl{uid\_t geteuid(void)} restituisce l'\textit{effective user ID} del -processo corrente. -\funcdecl{gid\_t getgid(void)} restituisce il \textit{real group ID} del -processo corrente. -\funcdecl{gid\_t getegid(void)} restituisce l'\textit{effective group ID} del -processo corrente. - -Queste funzioni non riportano condizioni di errore. + \headdecl{unistd.h} + \headdecl{sys/types.h} + + \funcdecl{uid\_t getuid(void)} restituisce il \textit{real user ID} del + processo corrente. + + \funcdecl{uid\_t geteuid(void)} restituisce l'\textit{effective user ID} del + processo corrente. + + \funcdecl{gid\_t getgid(void)} restituisce il \textit{real group ID} del + processo corrente. + + \funcdecl{gid\_t getegid(void)} restituisce l'\textit{effective group ID} del + processo corrente. + + Queste funzioni non riportano condizioni di errore. \end{functions} In generale l'uso di privilegi superiori deve essere limitato il più