Aggiunte varie a giro.
authorSimone Piccardi <piccardi@gnulinux.it>
Wed, 13 Jun 2001 17:17:15 +0000 (17:17 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Wed, 13 Jun 2001 17:17:15 +0000 (17:17 +0000)
filedir.tex
signal.tex
sources/SimpleEchoTCPClient.c

index e39d4c955a34d84bbabbd42533bfecb30751676b..cf928fc21cc347155c99d76b14f332075def4910 100644 (file)
@@ -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}
 
index 4b5ff406b275d30a37c3826d17bf5b8e1b09fd2d..f7bae08adb1e6ff6dff15e03bcdf1a872670aa8a 100644 (file)
@@ -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
index feac7865e6476ff2fe51590d7c402583d358bdd3..73654529b7f825e3da66d66d4ce994c46d54db91 100644 (file)
@@ -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);
        }