From 9571a19b1524491a8e43f2c0176243d2483cf986 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Wed, 13 Jun 2001 17:17:15 +0000 Subject: [PATCH] Aggiunte varie a giro. --- filedir.tex | 103 ++++++++++++++++++++++++++-------- signal.tex | 88 +++++++++++++++++++++++------ sources/SimpleEchoTCPClient.c | 4 +- 3 files changed, 153 insertions(+), 42 deletions(-) diff --git a/filedir.tex b/filedir.tex index e39d4c9..cf928fc 100644 --- a/filedir.tex +++ b/filedir.tex @@ -63,7 +63,7 @@ la directory che contiene il riferimento alla directory corrente; nel caso questa sia la directory radice allora il riferimento è a se stessa. -\section{L'architettura di gestione dei file} +\section{L'architettura della gestione dei file} \label{sec:filedir_file_handling} Per capire fino in fondo le proprietà di files e directories in un sistema @@ -198,8 +198,7 @@ principali, come risultano dalla man page, sono le seguenti: \item \texttt{EXDEV} \texttt{oldpath} e \texttt{newpath} non sono sullo stesso filesystem. \item \texttt{EPERM} il filesystem che contiene \texttt{oldpath} e - \texttt{newpath} non supporta i link diretti, oppure \texttt{oldpath} è - una directory. + \texttt{newpath} non supporta i link diretti o è una directory. \item \texttt{EFAULT} una delle stringhe passate come parametri è fuori dello spazio di indirizzi del processo. \item \texttt{EACCESS} errore di accesso (mancano i permessi per scrivere o @@ -264,10 +263,13 @@ effettua con la funzione \texttt{unlink}; il suo prototipo \item \texttt{EACCESS} errore di accesso (mancano i permessi per scrivere o per attraversare le directories), vedi \secref{sec:filedir_access_control} per i dettagli. - \item \texttt{EPERM} il filesystem che contiene \texttt{pathname} non - consente l'operazione. - \item \texttt{EFAULT} la stringa passata come parametro è fuori dello spazio - di indirizzi del processo. + \item \texttt{EISDIR} \texttt{pathname} si riferisce ad una directory + (valore specifico ritornato da linux che non consente l'uso di + \texttt{unlink} con le directory, e non conforme allo standard POSIX, che + prescrive invece l'uso di \texttt{EPERM} in caso l'operazione non sia + consnetita o il processo non abbia privilegi sufficienti). + \item \texttt{EFAULT} la stringa + passata come parametro è fuori dello spazio di indirizzi del processo. \item \texttt{ENAMETOOLONG} il pathname troppo lungo. \item \texttt{ENOENT} uno dei componenti del pathname non esiste o è un link simbolico spezzato. @@ -340,30 +342,43 @@ nuovo nome dopo che il vecchio qual caso il file non viene toccato. La variabile \texttt{errno} viene settata secondo i seguenti codici di errore: \begin{errlist} - \item \texttt{EFAULT} la stringa \texttt{filename} è fuori dello spazio di - indirizzi del processo. + \item \texttt{EISDIR} \texttt{newpath} è una directory già esistente mentre + \texttt{oldpath} non è una directory. + \item \texttt{EXDEV} \texttt{oldpath} e \texttt{newpath} non sono sullo + stesso filesystem. + \item \texttt{ENOTEMPTY} \texttt{newpath} è una directory già esistente e + non vuota. + \item \texttt{EBUSY} o \texttt{oldpath} o \texttt{newpath} sono in uso da + parte di qualche processo (come directory di lavoro o come root) o del + sistema (come mount point). + \item \texttt{EINVAL} \texttt{newpath} contiene un prefisso di + \texttt{oldpath} o più in generale si è cercato di creare una directory + come sottodirectory di se stessa. + \item \texttt{EMLINK} \texttt{oldpath} ha già il massimo numero di link + consentiti o è una directory e la directory che contiene \texttt{newpath} + ha già il massimo numero di link. + \item \texttt{ENOTDIR} Uno dei componenti dei pathname non è una directory + o\texttt{oldpath} è una directory e \texttt{newpath} esiste e non è una + directory. + \item \texttt{EFAULT} o \texttt{oldpath} o \texttt{newpath} è fuori dello + spazio di indirizzi del processo. \item \texttt{EACCESS} Non c'è il permesso di scrittura per la directory in cui si vuole creare il nuovo link o una delle directory del pathname non consente la ricerca (permesso di esecuzione). - \item \texttt{EPERM} il pathname indica una directory o il filesystem che - contiene \texttt{filename} non consente l'operazione. - \item \texttt{EROFS} I file sono su un filesystem montato in sola lettura. - \item \texttt{ENAMETOOLONG} il pathname è troppo lungo. + \item \texttt{EPERM} le directory contenenti \texttt{oldpath} o + \texttt{newpath} hanno lo sticky bit attivo e i permessi del processo non + consentono rispettivamente la cancellazione e la creazione del file, o il + filesystem non supporta i link. + \item \texttt{ENAMETOOLONG} uno dei pathname è troppo lungo. \item \texttt{ENOENT} Uno dei componenti del pathname non esiste o è un link simbolico spezzato. - \item \texttt{ENOTDIR} Uno dei componenti del pathname non è una directory. \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a completare l'operazione. + \item \texttt{EROFS} I file sono su un filesystem montato in sola lettura. \item \texttt{ELOOP} Ci sono troppi link simbolici nella risoluzione del pathname. - \item \texttt{EISDIR} - \item \texttt{EXDEV} - \item \texttt{ENOTEMPTY} - \item \texttt{EBUSY} - \item \texttt{EINVAL} - \item \texttt{EMLINK} - \item \texttt{ENOSPC} - + \item \texttt{ENOSPC} Il device di destinazione non ha più spazio per la + nuova voce. \end{errlist} \end{prototype} @@ -463,7 +478,7 @@ La lettura delle informazioni relative ai file delle funzioni \texttt{stat}, questa è la funzione che il comando \texttt{ls} usa per poter stampare tutti i dati dei files; il prototipo della funzione è il seguente; -\begin{prototype}{sys/stat.h} +\begin{prototype}{unistd.h} {int stat(const char *file\_name, struct stat *buf)} La funzione restituisce zero in caso di successo e -1 per un errore, in caso @@ -480,9 +495,51 @@ il seguente; \end{errlist} \end{prototype} +La struttura \texttt{stat} è definita nell'header \texttt{sys/stat.h} e in +generale dipende dall'implementazione, la versione usata da Linux è mostrata +in \nfig, così come riportata dalla man page (in realtà la definizione +effettivamente usata nel kernel dipende dall'archietettura e ha altri campi +riservati per estensioni come tempo più precisi, o per il padding dei campi). + +\begin{figure}[!htbp] + \footnotesize + \begin{lstlisting}{} +struct stat { + dev_t st_dev; /* device */ + ino_t st_ino; /* inode */ + mode_t st_mode; /* protection */ + nlink_t st_nlink; /* number of hard links */ + uid_t st_uid; /* user ID of owner */ + gid_t st_gid; /* group ID of owner */ + dev_t st_rdev; /* device type (if inode device) */ + off_t st_size; /* total size, in bytes */ + unsigned long st_blksize; /* blocksize for filesystem I/O */ + unsigned long st_blocks; /* number of blocks allocated */ + time_t st_atime; /* time of last access */ + time_t st_mtime; /* time of last modification */ + time_t st_ctime; /* time of last change */ +}; + \end{lstlisting} + \caption{La struttura \texttt{stat} per la lettura delle informazioni dei + file} + \label{fig:sock_sa_gen_struct} +\end{figure} + +Si noti come i vari membri della struttura siano specificati come tipi nativi +del sistema (di quelli definiti in \tabref{tab:xxx_sys_types}, e dichiarati in +\texttt{sys/types.h}) + + + \subsection{I tipi di file} \label{sec:filedir_file_types} +Come riportato in \tabref{tab:fileintr_file_types} in linux oltre ai file e +alle directory esistono vari altri oggetti che possono stare su un filesystem; +il tipo di file è ritornato dalla \texttt{stat} nel campo \texttt{st\_mode}, +dato che il valore numerico può variare a seconda delle implementazioni + + \subsection{La dimensione dei file} \label{sec:filedir_file_size} diff --git a/signal.tex b/signal.tex index 4b5ff40..f7bae08 100644 --- a/signal.tex +++ b/signal.tex @@ -52,20 +52,22 @@ dei segnali (dette semantiche) che vengono chiamate rispettivamente Nella semantica \textit{unreliable} la routine di gestione del segnale specificata dall'utente non resta installata una volta chiamata; è perciò a carico dell'utente stesso ripetere l'installazione all'interno della routine -stessa in tutti i casi in cui si vuole che il signal handler esterno resti -attivo. - -Per questo motivo è possibile una race-condition in cui il segnale arriva -prima che il suo manipolatore sia installato, nel qual caso il segnale può -essere perso o causare il comportamento originale (in genere la terminazione -del processo). Questa è la ragione per cui detti segnali sono chiamati -\textit{inaffidabili}, in quanto la ricezione del segnale e la reinstallazione -del suo manipolatore non sono operazioni atomiche. - -In caso di implementazione inaffidabile le chiamate di sistema non sono fatte -ripartire automaticamente quando sono interrotte da un segnale, per questo il -programma deve controllare lo stato di uscita della chiamata al sistema e -riperterla nel caso l'errore riportato da \texttt{errno} sia \texttt{EINTR}. +di gestione stessa in tutti i casi in cui si vuole che il signal handler +esterno resti attivo. + +Per questo motivo è possibile una race-condition in cui un secondo segnale +arriva prima che il manipolatore abbia eseguito la re-installazione di se +stesso, nel qual caso il segnale può essere perso o causare il comportamento +originale assegnato al segnale (in genere la terminazione del processo). +Questa è la ragione per cui detti segnali sono chiamati \textit{inaffidabili}, +in quanto la ricezione del segnale e la reinstallazione del suo manipolatore +non sono operazioni atomiche. + +Nel caso di implementazione inaffidabile le chiamate di sistema non +sono fatte ripartire automaticamente quando sono interrotte da un segnale, per +questo il programma deve controllare lo stato di uscita della chiamata al +sistema e riperterla nel caso l'errore riportato da \texttt{errno} sia +\texttt{EINTR}. Inoltre in questo caso non esiste una modalità semplice per ottenere una operazione di pausa atomica (cioè mandare in sleep un processo fino all'arrivo @@ -82,7 +84,6 @@ ottenere un'operazione di pausa atomica (usando la funzione POSIX \subsubsection{Tipi di segnali} \label{sec:sig_types} - In generale gli eventi che generano i segnali si possono dividere in tre categorie principali: errori, eventi e richieste esplicite. @@ -194,7 +195,60 @@ segnali sono definiti nell'header di sistema \texttt{signal.h}. Il numero totale di segnali presenti è dato dalla macro \texttt{NSIG}, e dato che i numeri dei segnali sono allocati progressivamente, essa corrisponde -anche al successivo del valore numerico assegnato all'ultimo segnale definito. +anche al successivo del valore numerico assegnato all'ultimo segnale definito, +in \ntab\ si è riportato l'elenco completo dei segnali definiti in Linux, +comparati con quelli definiti in vari standard. + +\begin{table}[htb] + \centering + \begin{tabular}[c]{|l|c|c|c||c|l|} + \hline + Segnale & POSIX.1 & SUSv2 & Linux &Azione & Descrizione \\ + \hline + \hline + SIGHUP &$\bullet$&&$\bullet$& A & Hangup \\ + SIGINT &$\bullet$&&$\bullet$& A & Interrupt from keyboard \\ + SIGQUIT &$\bullet$&&$\bullet$& C & Quit from keyboard \\ + SIGILL &$\bullet$&&$\bullet$& C & Illegal Instruction \\ + SIGABRT &$\bullet$&&$\bullet$& C & Abort signal from abort(3) \\ + SIGFPE &$\bullet$&&$\bullet$& C & Floating point exception \\ + SIGKILL &$\bullet$&&$\bullet$& AEF & Kill signal \\ + SIGSEGV &$\bullet$&&$\bullet$& C & Invalid memory reference \\ + SIGPIPE &$\bullet$&&$\bullet$& A & Broken pipe \\ + SIGALRM &$\bullet$&&$\bullet$& A & Timer signal from alarm(2) \\ + SIGTERM &$\bullet$&&$\bullet$& A & Termination signal \\ + SIGUSR1 &$\bullet$&&$\bullet$& A & User-defined signal 1 \\ + SIGUSR2 &$\bullet$&&$\bullet$& A & User-defined signal 2 \\ + SIGCHLD &$\bullet$&&$\bullet$& B & Child stopped or terminated \\ + SIGCONT &$\bullet$&&$\bullet$& & Continue if stopped \\ + SIGSTOP &$\bullet$&&$\bullet$& DEF & Stop process \\ + SIGTSTP &$\bullet$&&$\bullet$& D & Stop typed at tty \\ + SIGTTIN &$\bullet$&&$\bullet$& D & tty input for background process \\ + SIGTTOU &$\bullet$&&$\bullet$& D & tty output for background process \\ + SIGBUS &&$\bullet$&$\bullet$& C & Bus error (bad memory access) \\ + SIGPOLL &&$\bullet$&$\bullet$& A & Pollable event (Sys V). Synonym of SIGIO\\ + SIGPROF &&$\bullet$&$\bullet$& A & Profiling timer expired \\ + SIGSYS &&$\bullet$&$\bullet$& C & Bad argument to routine (SVID) \\ + SIGTRAP &&$\bullet$&$\bullet$& C & Trace/breakpoint trap \\ + SIGURG &&$\bullet$&$\bullet$& B & Urgent condition on socket (4.2 BSD) \\ + SIGVTALRM &&$\bullet$&$\bullet$& A & Virtual alarm clock (4.2 BSD) \\ + SIGXCPU &&$\bullet$&$\bullet$& C & CPU time limit exceeded (4.2 BSD) \\ + SIGXFSZ &&$\bullet$&$\bullet$& C & File size limit exceeded (4.2 BSD) \\ + SIGIOT &&&$\bullet$& C & IOT trap. A synonym for SIGABRT \\ + SIGEMT &&&$\bullet$& & \\ + SIGSTKFLT &&&$\bullet$& A & Stack fault on coprocessor \\ + SIGIO &&&$\bullet$& A & I/O now possible (4.2 BSD) \\ + SIGCLD &&&$\bullet$& & A synonym for SIGCHLD \\ + SIGPWR &&&$\bullet$& A & Power failure (System V) \\ + SIGINFO &&&$\bullet$& & A synonym for SIGPWR \\ + SIGLOST &&&$\bullet$& A & File lock lost \\ + SIGWINCH &&&$\bullet$& B & Window resize signal (4.3 BSD, Sun) \\ + SIGUNUSED &&&$\bullet$& A & Unused signal (will be SIGSYS) \\ + \hline + \end{tabular} + \caption{Lista dei segnali in Linux} + \label{tab:sign_signal_list} +\end{table} \subsubsection{Segnali di errore di programma} @@ -225,7 +279,7 @@ Questi segnali sono: \begin{itemize} \item \texttt{SIGFPE} Riporta un errore aritmetico fatale. Benché il nome derivi da \textit{floating point exception} si applica a tutti gli errori - aritmetici compresa la divisione per zero e l'overflow. + aritmetici compresa la divisione per zero e l'overflow. % Per questo segnale le cose sono complicate dal fatto che possono esserci % molte diverse eccezioni che \texttt{SIGFPE} non distingue, mentre lo diff --git a/sources/SimpleEchoTCPClient.c b/sources/SimpleEchoTCPClient.c index feac786..7365452 100644 --- a/sources/SimpleEchoTCPClient.c +++ b/sources/SimpleEchoTCPClient.c @@ -8,7 +8,7 @@ * * Usage: echo -h give all info's * - * $Id: SimpleEchoTCPClient.c,v 1.1 2001/06/12 22:17:22 piccardi Exp $ + * $Id: SimpleEchoTCPClient.c,v 1.2 2001/06/13 17:17:15 piccardi Exp $ * ****************************************************************/ /* @@ -105,7 +105,7 @@ void EchoClient(FILE * filein, int socket) int nread; while (fgets(sendbuff, MAXLINE, filein) != NULL) { SockWrite(socket, sendbuff, strlen(sendbuff)); - if ( (nread = SockRead(socket, recvbuff, MAXLINE)) == 0) { + if ( (nread = read(socket, recvbuff, MAXLINE)) == 0) { perror("Sever read error:"); exit(-1); } -- 2.30.2