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
\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{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.
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}
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
\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}
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
\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.
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}
\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