Correzioni varie piu una nuova figura e il nuovo capitolo che credevo di
authorSimone Piccardi <piccardi@gnulinux.it>
Tue, 6 Nov 2001 23:14:38 +0000 (23:14 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Tue, 6 Nov 2001 23:14:38 +0000 (23:14 +0000)
aver messi ieri ...

elemtcp.tex
fileadv.tex [new file with mode: 0644]
filedir.tex
fileintro.tex
fileunix.tex
gapil.tex
img/proc_beginend.dia [new file with mode: 0644]
process.tex
prochand.tex
socket.tex

index cce7fc6..9dce854 100644 (file)
@@ -718,7 +718,6 @@ assegnazione del tipo:
 
 La funzione \func{connect} è usata da un client TCP per stabilire la
 connessione con un server TCP, il prototipo della funzione è il seguente:
-
 \begin{prototype}{sys/socket.h}
 {int connect(int sockfd, const struct sockaddr *servaddr, socklen\_t addrlen)}
   
@@ -824,7 +823,6 @@ sostanza l'effetto della funzione 
 un server dopo le chiamate a \func{socket} e \func{bind} e prima della
 chiamata ad \func{accept}. Il prototipo della funzione come definito dalla
 man page è:
-
 \begin{prototype}{sys/socket.h}{int listen(int sockfd, int backlog)}
   La funzione pone il socket specificato da \var{sockfd} in modalità
   passiva e predispone una coda per le connessioni in arrivo di lunghezza pari
@@ -936,7 +934,6 @@ connessione una volta che sia stato completato il three way handshake, la
 funzione restituisce un nuovo socket descriptor su cui si potrà operare per
 effettuare la comunicazione. Se non ci sono connessioni completate il processo
 viene messo in attesa. Il prototipo della funzione è il seguente:
-
 \begin{prototype}{sys/socket.h}
 {int listen(int sockfd, struct sockaddr *addr, socklen\_t *addrlen)} 
   La funzione estrae la prima connessione relativa al socket \var{sockfd}
@@ -1053,6 +1050,7 @@ Per attivare immediatamente l'emissione del FIN e la sequenza di chiusura si
 può usare la funzione \func{shutdown} su cui torneremo in seguito. 
 
 
+
 \section{I server concorrenti su TCP}
 \label{sec:TCPel_cunc_serv}
 
@@ -1218,7 +1216,6 @@ chiamata dopo il completamento di una connessione sul socket restituito da
 \func{accept}, restituisce l'indirizzo locale che il kernel ha assegnato a
 quella connessione.
 
-
 \begin{prototype}{sys/socket.h}
 {int getpeername(int sockfd, struct sockaddr * name, socklen\_t * namelen)}
 
diff --git a/fileadv.tex b/fileadv.tex
new file mode 100644 (file)
index 0000000..043228f
--- /dev/null
@@ -0,0 +1,31 @@
+\chapter{I/O avanzato}
+\label{sec:file_advanced}
+
+
+\section{I/O non bloccante}
+\label{sec:file_noblocking}
+
+
+\section{File locking}
+\label{sec:file_locking}
+
+
+
+\section{I/O multiplexato}
+\label{sec:file_multiplexing}
+
+
+%\section{I/O asincrono}
+%\label{sec:file_asynchronous}
+
+%Non supportato in Linux, in BSD e SRv4 c'è, ma usando il segnale \macro{SIGIO}
+%per indicare che i dati sono disponibili, può essere usato in maniera semplice
+%con un solo file per processo (altrimenti non sarebbe più possibile
+%distinguere da quale file proviene l'attività che ha causato l'emissione del
+%segnale).
+
+
+\section{File mappati in memoria}
+\label{sec:file_memory_map}
+
+
index b985da1..7627aaf 100644 (file)
@@ -1440,7 +1440,6 @@ accedere ad un certo file.
 Per cambiare i permessi di un file il sistema mette ad disposizione due
 funzioni, che operano rispettivamente su un filename e su un file descriptor,
 i loro prototipi sono:
-
 \begin{functions}
   \headdecl{sys/types.h} 
   \headdecl{sys/stat.h} 
@@ -1539,7 +1538,6 @@ privilegio.
 Oltre che dai valori indicati in sede di creazione, i permessi assegnati ai
 nuovi file sono controllati anche da una maschera di bit settata con la
 funzione \func{umask}, il cui prototipo è:
-
 \begin{prototype}{stat.h}
 {mode\_t umask(mode\_t mask)}
 
@@ -1576,7 +1574,6 @@ allora occorrer
 Come per i permessi, il sistema fornisce anche delle funzioni che permettano
 di cambiare utente e gruppo cui il file appartiene; le funzioni in questione
 sono tre e i loro prototipi sono i seguenti:
-
 \begin{functions}
   \headdecl{sys/types.h} 
   \headdecl{sys/stat.h} 
index 3125a73..78c63b5 100644 (file)
@@ -19,6 +19,8 @@ nelle particolarit
 contempo tratteremo l'organizzazione dei file in un sistema unix-like, e le
 varie caratteristiche distintive.
 
+
+
 \section{L'organizzazione di file e directory}
 \label{sec:file_organization}
 
@@ -316,6 +318,7 @@ l'\acr{ext2}, come esempio di un filesystem unix-like.
 % abbiamo brevemente accennato le caratteristiche (dal lato dell'implementazione
 % nel kernel) in \secref{sec:file_vfs}.
 
+
 \subsection{Il \textit{virtual filesystem} di Linux}
 \label{sec:file_vfs}
 
@@ -584,6 +587,7 @@ che non contenga a sua volta altre directory. Al contempo la directory da
 cui si era partiti avrà un numero di riferiementi di almeno tre, in quanto
 adesso sarà referenziata anche dalla voce \file{..} di \file{img}.
 
+
 \subsection{Il filesystem \textsl{ext2}}
 \label{sec:file_ext2}
 
index 5734c43..e1ca3ab 100644 (file)
@@ -166,7 +166,6 @@ system call del kernel.
 La funzione \func{open} è la funzione fondamentale per accedere ai file, ed è
 quella che crea l'associazione fra un pathname ed un file descriptor; il suo
 prototipo è:
-
 \begin{functions}
   \headdecl{sys/types.h}
   \headdecl{sys/stat.h}
@@ -265,9 +264,9 @@ comportamento.
     \textbf{Flag} & \textbf{Descrizione} \\
     \hline
     \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\\
+    \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 del file
     \hline
     \macro{O\_CREAT} & se il file non esiste verrà creato, con le regole di
@@ -279,26 +278,26 @@ comportamento.
     usano per stabilire un file di lock possono incorrere in una race
     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}.\\
+    fallire \func{open} con \macro{EEXIST}. \\
     \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}).  \\
+    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}).\\
+    processo non ne ha ancora uno (si veda \secref{sec:sess_xxx}). \\
     \macro{O\_SHLOCK} & opzione di BSD, acquisisce uno shared lock (vedi
-    \secref{sec:file_locking}) sul file. Non è disponibile in Linux.\\
+    \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.\\
+    \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.\\
+    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.\\
+    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
@@ -309,7 +308,7 @@ comportamento.
     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.\\
+    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
@@ -327,13 +326,13 @@ comportamento.
     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}\\
+    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} & apre il file per l'input/output sincrono, ogni
     \func{write} bloccherà fino al completamento della scrittura di tutti dati
-    sul sull'hardware sottostante\\
+    sul sull'hardware sottostante.\\
+    \macro{O\_FSYNC} & sinonimo di \macro{O\_SYNC}. \\
     \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
@@ -349,7 +348,6 @@ Nelle prime versioni di unix i flag specificabili per \func{open} erano solo
 quelli relativi alle modalità di accesso del file.  Per questo motivo per
 creare un nuovo 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
@@ -378,10 +376,10 @@ adesso questa funzione resta solo per compatibilit
 \section{Funzioni avanzate}
 \label{sec:file_adv_func}
 
+
 \subsection{La condivisione dei files}
 \label{sec:file_sharing}
 
-
 Si noti che i flag di stato del file, quelli settati dal parametro \var{flag}
 di \func{open}, essendo tenuti nella vode sulla file table, vengono condivisi,
 ai file sono però associati anche altri flag, (tenuti invece nella struttura
@@ -403,7 +401,3 @@ usato al momento 
 \subsection{La funzione \func{ioctl}}
 \label{sec:file_ioctl}
 
-
-
-
-
index b7e32c3..9292659 100644 (file)
--- a/gapil.tex
+++ b/gapil.tex
@@ -93,7 +93,7 @@
   stringstyle=\color{green}\ttfamily,
 %  texcsststyle=\ttfamily,
   directivestyle=\color{magenta}\ttfamily
-}
+} 
 \include{intro}
 \include{process}
 \include{prochand}
diff --git a/img/proc_beginend.dia b/img/proc_beginend.dia
new file mode 100644 (file)
index 0000000..75a5da1
Binary files /dev/null and b/img/proc_beginend.dia differ
index d95f13e..d83d5fb 100644 (file)
@@ -233,11 +233,12 @@ Lo schema delle modalit
 
 \begin{figure}[htb]
   \centering
-  
+  \includegraphics[width=12cm]{img/proc_beginend.eps}
   \caption{Schema dell'avvio e della conclusione di un programma.}
   \label{fig:proc_prog_start_stop}
 \end{figure}
 
+
 Si ricordi infine che un programma può anche essere interrotto dall'esterno
 attraverso l'uso di un segnale (modalità di conclusione non mostrata in
 \curfig); torneremo su questo aspetto in \secref{cha:signals}.
index da3f662..699b040 100644 (file)
@@ -187,7 +187,6 @@ Tutti i processi inoltre memorizzano anche il \acr{pid} del genitore da cui
 sono stati creati, questo viene chiamato in genere \acr{ppid} (da
 \textit{parent process id}).  Questi due identificativi possono essere
 ottenuti da programma usando le funzioni:
-
 \begin{functions}
 \headdecl{sys/types.h}
 \headdecl{unistd.h}
@@ -231,7 +230,6 @@ processi: come si 
 attraverso l'uso di questa funzione, essa quindi riveste un ruolo centrale
 tutte le volte che si devono scrivere programmi che usano il multitasking.  Il
 prototipo della funzione è:
-
 \begin{functions}
   \headdecl{sys/types.h} 
   \headdecl{unistd.h} 
@@ -770,7 +768,6 @@ conclusione dei vari processi figli onde evitare di riempire di
 \textit{zombie} la tabella dei processi; le funzioni deputate a questo compito
 sono sostanzialmente due, \func{wait} e \func{waitpid}. La prima, il cui
 prototipo è:
-
 \begin{functions}
 \headdecl{sys/types.h}
 \headdecl{sys/wait.h}
@@ -806,7 +803,6 @@ che effettua lo stesso servizio, ma dispone di una serie di funzionalit
 ampie, legate anche al controllo di sessione.  Dato che è possibile ottenere
 lo stesso comportamento di \func{wait} si consiglia di utilizzare sempre
 questa funzione; il suo prototipo è:
-
 \begin{functions}
 \headdecl{sys/types.h}
 \headdecl{sys/wait.h}
@@ -916,7 +912,6 @@ certezza che la chiamata a \func{wait} non si bloccher
   \label{tab:proc_status_macro}
 \end{table}
 
-
 Entrambe le funzioni restituiscono lo stato di terminazione del processo
 tramite il puntatore \var{status} (se non interessa memorizzare lo stato si
 può passare un puntatore nullo). Il valore restituito da entrambe le funzioni
@@ -947,7 +942,6 @@ lettura dello stato di terminazione di un processo, analoghe a \func{wait} e
 kernel può restituire al processo padre ulteriori informazioni sulle risorse
 usate dal processo terminato e dai vari figli.  Queste funzioni, che diventano
 accessibili definendo la costante \macro{\_USE\_BSD}, sono:
-
 \begin{functions}
   \headdecl{sys/times.h} 
   \headdecl{sys/types.h} 
@@ -1020,7 +1014,6 @@ Ci sono sei diverse versioni di \func{exec} (per questo la si 
 famiglia di funzioni) che possono essere usate per questo compito, che in
 realtà (come mostrato in \figref{fig:proc_exec_relat}), costituiscono un
 front-end a \func{execve}. Il prototipo  di quest'ultima è:
-
 \begin{prototype}{unistd.h}
 {int execve(const char * filename, char * const argv [], char * const envp[])}
   
@@ -1057,7 +1050,6 @@ front-end a \func{execve}. Il prototipo  di quest'ultima 
 Le altre funzioni della famiglia servono per fornire all'utente una serie
 possibile di diverse interfacce per la creazione di un nuovo processo. I loro
 prototipi sono:
-
 \begin{functions}
 \headdecl{unistd.h}
 \funcdecl{int execl(const char *path, const char *arg, ...)} 
@@ -1277,7 +1269,6 @@ utente per un limitato insieme di operazioni. Per questo motivo in generale
 tutti gli unix prevedono che i processi abbiano almeno due gruppi di
 identificatori, chiamati rispettivamente \textit{real} ed \textit{effective}.
 
-
 \begin{table}[htb]
   \footnotesize
   \centering
@@ -1338,7 +1329,6 @@ un'altro (o dell'amministratore).
 Come nel caso del \acr{pid} e del \acr{ppid} tutti questi identificatori
 possono essere letti dal processo attraverso delle opportune funzioni, i cui
 prototipi sono i seguenti:
-
 \begin{functions}
   \headdecl{unistd.h}
   \headdecl{sys/types.h}
@@ -1406,7 +1396,6 @@ di appartenenza) ad un processo sono rispettivamente \func{setuid} e
 \func{setgid}; come accennato in \secref{sec:proc_user_group} in Linux esse
 seguono la semantica POSIX che prevede l'esistenza di \textit{saved user id} e
 \textit{saved group id}; i loro prototipi sono:
-
 \begin{functions}
 \headdecl{unistd.h}
 \headdecl{sys/types.h}
@@ -1506,7 +1495,6 @@ Queste due funzioni derivano da BSD che non supportando\footnote{almeno fino
   alla versione 4.3+BSD TODO, verificare e aggiornare la nota} i \textit{saved
   id} le usava per poter scambiare fra di loro effective e real id. I
 prototipi sono:
-
 \begin{functions}
 \headdecl{unistd.h}
 \headdecl{sys/types.h}
@@ -1561,7 +1549,6 @@ sempre settato al valore dell'\textit{effective id}.
 Queste due funzioni sono una estensione introdotta in Linux dal kernel 2.1.44,
 e permettono un completo controllo su tutti gli identificatori (\textit{real},
 \textit{effective} e \textit{saved}), i prototipi sono:
-
 \begin{functions}
 \headdecl{unistd.h}
 \headdecl{sys/types.h}
@@ -1594,7 +1581,6 @@ l'identificatore corrispondente.
 Queste funzioni sono un'estensione allo standard POSIX.1 (ma sono comunque
 supportate dalla maggior parte degli unix) e usate per cambiare gli
 \textit{effective id}; i loro prototipi sono:
-
 \begin{functions}
 \headdecl{unistd.h}
 \headdecl{sys/types.h}
@@ -1640,7 +1626,6 @@ quelli originari per quanto riguarda tutti gli altri controlli di accesso.
 Le due funzioni usate per cambiare questi identificatori sono \func{setfsuid}
 e \func{setfsgid}, ovviamente sono specifiche di Linux e non devono essere
 usate se si intendono scrivere programmi portabili; i loro prototipi sono:
-
 \begin{functions}
 \headdecl{sys/fsuid.h}
 
index cd90c28..3606904 100644 (file)
@@ -682,7 +682,6 @@ seguenti:
   indirizzo valido, e negativo se \var{af} specifica una famiglia di indirizzi
   non valida.
 \end{prototype}
-
 \begin{prototype}{sys/socket.h}
   {char *inet\_ntop(int af, const void *addr\_ptr, char *dest, size\_t len)}
   Converte la struttura dell'indirizzo puntata da \var{addr\_ptr} in una
@@ -711,6 +710,7 @@ Il formato usato per gli indirizzi in formato di presentazione 
 \secref{sec:IP_ipv6_notation} per IPv6.
 
 
+
 \section{Un esempio di applicazione}
 \label{sec:sock_appplication}