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.
 
 
 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
 \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
   \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
   \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{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.
   \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} 
   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{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{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{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{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}
 
   \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;
 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
 {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}
 
   \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}
 
 \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}
 
 \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
 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
 
 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}
 
 \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. 
 
 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
 
 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}
 
 
 \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
 \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
 
 %   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
  *
  *
  * 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)); 
     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);
        }
            perror("Sever read error:");
            exit(-1);
        }