From: Simone Piccardi Date: Tue, 6 Nov 2001 23:14:38 +0000 (+0000) Subject: Correzioni varie piu una nuova figura e il nuovo capitolo che credevo di X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=88fefd4ca97449596a2b8689e89de5e66d9d6758;ds=sidebyside Correzioni varie piu una nuova figura e il nuovo capitolo che credevo di aver messi ieri ... --- diff --git a/elemtcp.tex b/elemtcp.tex index cce7fc6..9dce854 100644 --- a/elemtcp.tex +++ b/elemtcp.tex @@ -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 index 0000000..043228f --- /dev/null +++ b/fileadv.tex @@ -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} + + diff --git a/filedir.tex b/filedir.tex index b985da1..7627aaf 100644 --- a/filedir.tex +++ b/filedir.tex @@ -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} diff --git a/fileintro.tex b/fileintro.tex index 3125a73..78c63b5 100644 --- a/fileintro.tex +++ b/fileintro.tex @@ -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} diff --git a/fileunix.tex b/fileunix.tex index 5734c43..e1ca3ab 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -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} - - - - diff --git a/gapil.tex b/gapil.tex index b7e32c3..9292659 100644 --- 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 index 0000000..75a5da1 Binary files /dev/null and b/img/proc_beginend.dia differ diff --git a/process.tex b/process.tex index d95f13e..d83d5fb 100644 --- a/process.tex +++ b/process.tex @@ -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}. diff --git a/prochand.tex b/prochand.tex index da3f662..699b040 100644 --- a/prochand.tex +++ b/prochand.tex @@ -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} diff --git a/socket.tex b/socket.tex index cd90c28..3606904 100644 --- a/socket.tex +++ b/socket.tex @@ -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}