aver messi ieri ...
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)}
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
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}
può usare la funzione \func{shutdown} su cui torneremo in seguito.
+
\section{I server concorrenti su TCP}
\label{sec:TCPel_cunc_serv}
\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)}
--- /dev/null
+\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}
+
+
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}
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)}
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}
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}
% 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}
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}
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}
\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
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
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
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
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
\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
\subsection{La funzione \func{ioctl}}
\label{sec:file_ioctl}
-
-
-
-
stringstyle=\color{green}\ttfamily,
% texcsststyle=\ttfamily,
directivestyle=\color{magenta}\ttfamily
-}
+}
\include{intro}
\include{process}
\include{prochand}
\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}.
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}
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}
\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}
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}
\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
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}
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[])}
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, ...)}
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
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}
\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}
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}
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}
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}
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}
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
\secref{sec:IP_ipv6_notation} per IPv6.
+
\section{Un esempio di applicazione}
\label{sec:sock_appplication}