From: Simone Piccardi Date: Sat, 12 Oct 2002 21:37:27 +0000 (+0000) Subject: Revisione delle costanti di sistema, aggiunta funzione ctermid X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=57c1291f77a1a179e67c4506b3e05e74ad89d21e Revisione delle costanti di sistema, aggiunta funzione ctermid --- diff --git a/ipc.tex b/ipc.tex index 916a27c..aa6893c 100644 --- a/ipc.tex +++ b/ipc.tex @@ -56,7 +56,7 @@ accennato concetto di funzionamento di una pipe scrive nel file descriptor aperto in scrittura viene ripresentato tale e quale nel file descriptor aperto in lettura. I file descriptor infatti non sono connessi a nessun file reale, ma ad un buffer nel kernel, la cui dimensione è -specificata dalla costante \macro{PIPE\_BUF}, (vedi +specificata dal parametro di sistema \macro{PIPE\_BUF}, (vedi \secref{sec:sys_file_limits}). Lo schema di funzionamento di una pipe è illustrato in \figref{fig:ipc_pipe_singular}, in cui sono illustrati i due capi della pipe, associati a ciascun file descriptor, con le frecce che diff --git a/session.tex b/session.tex index ef1c26a..ebae61e 100644 --- a/session.tex +++ b/session.tex @@ -959,17 +959,17 @@ kernel. La coda di ingresso mantiene i caratteri che sono stati letti dal terminale ma non ancora letti da un processo, la sua dimensione è definita dal parametro di -sistema \macro{MAX\_INPUT}, che ne specifica il limite minimo, in realtà la -coda può essere più grande e cambiare dimensione dinamicamente. Se è stato -abilitato il controllo di flusso in ingresso il driver emette i caratteri di -STOP e START per bloccare e sbloccare l'ingresso dei dati; altrimenti i -caratteri immessi oltre le dimensioni massime vengono persi; in alcuni casi il -driver provvede ad inviare automaticamente un avviso (un carattere di BELL, -che provoca un beep) sull'output quando si eccedono le dimensioni della coda. -Se è abilitato il modo canonico i caratteri in ingresso restano nella coda -fintanto che non viene ricevuto un a capo; un'altra costante, -\macro{MAX\_CANON}, specifica la dimensione massima di una riga in modo -canonico. +sistema \macro{MAX\_INPUT} (si veda \secref{sec:sys_file_limits}), che ne +specifica il limite minimo, in realtà la coda può essere più grande e cambiare +dimensione dinamicamente. Se è stato abilitato il controllo di flusso in +ingresso il driver emette i caratteri di STOP e START per bloccare e sbloccare +l'ingresso dei dati; altrimenti i caratteri immessi oltre le dimensioni +massime vengono persi; in alcuni casi il driver provvede ad inviare +automaticamente un avviso (un carattere di BELL, che provoca un beep) +sull'output quando si eccedono le dimensioni della coda. Se è abilitato il +modo canonico i caratteri in ingresso restano nella coda fintanto che non +viene ricevuto un a capo; un'altra parametro del sistema, \macro{MAX\_CANON}, +specifica la dimensione massima di una riga in modo canonico. La coda di uscita è analoga a quella di ingresso e contiene i caratteri scritti dai processi ma non ancora inviati al terminale. Se è abilitato il @@ -992,8 +992,8 @@ System V in una unica interfaccia, che Alcune di queste funzioni prendono come argomento un file descriptor (in origine molte operazioni venivano effettuate con \func{ioctl}), ma ovviamente possono essere usate solo con file che corrispondano effettivamente ad un -terminale; questo che può essere verificato utilizzando la funzione -\func{isatty}, il cui prototipo è: +terminale (altrimenti si otterrà un errore di \macro{ENOTTY}); questo può +essere evitato utilizzando la funzione \func{isatty}, il cui prototipo è: \begin{prototype}{unistd.h}{int isatty(int desc)} Controlla se il file descriptor \param{desc} è un terminale. @@ -1003,7 +1003,7 @@ terminale; questo che pu \end{prototype} Un'altra funzione che fornisce informazioni su un terminale è \func{ttyname}, -che permette anche di ottenere il nome del terminale associato ad un file +che permette di ottenere il nome del terminale associato ad un file descriptor; il suo prototipo è: \begin{prototype}{unistd.h}{char *ttyname(int desc)} @@ -1015,8 +1015,31 @@ descriptor; il suo prototipo \end{prototype} Si tenga presente che la funzione restituisce un indirizzo di dati statici, -che pertanto possono essere sovrascritti da successive chiamate. La funzione è -prevista da POSIX.1, che non definisce \func{isatty}. +che pertanto possono essere sovrascritti da successive chiamate. Una funzione +funzione analoga, anch'essa prevista da POSIX.1, è \func{ctermid}, il cui +prototipo è: +\begin{prototype}{stdio.h}{char *ctermid(char *s)} + + Restituisce il nome del terminale di controllo del processo. + + \bodydesc{La funzione restituisce il puntatore alla stringa contenente il + pathname del terminale.} +\end{prototype} + +La funzione scrive il pathname del terminale di controllo del processo +chiamante nella stringa posta all'indirizzo specificato dall'argomento +\param{s}. La memoria per contenere la stringa deve essere stata allocata in +precedenza ed essere lunga almeno +\macro{L\_ctermid}\footnote{\macro{L\_ctermid} è una delle varie costanti del + sistema, non trattata esplicitamente in \secref{sec:sys_characteristics} che + indica la dimensione che deve avere una stringa per poter contenere il nome + di un terminale.} caratteri. + +Se si passa come argomento \macro{NULL} la funzione restituisce il puntatore +ad una stringa statica che può essere sovrascritta da chiamate successive. Si +tenga presente che il pathname restituito potrebbe non identificare +univocamente il terminale (ad esempio potrebbe essere \file{/dev/tty}), +inoltre non è detto che il processo possa effettivamente aprire il terminale. I vari attributi vengono mantenuti per ciascun terminale in una struttura \var{termios}, (la cui definizione è in \figref{fig:term_termios}), usata @@ -1053,7 +1076,7 @@ modificare i bit su cui non si interviene. \begin{table}[b!ht] \footnotesize \centering - \begin{tabular}[c]{|l|p{13cm}|} + \begin{tabular}[c]{|l|p{11cm}|} \hline \textbf{Valore}& \textbf{Significato}\\ \hline @@ -1146,7 +1169,7 @@ pseudo-terminali usati nelle connessioni di rete. \begin{table}[htb] \footnotesize \centering - \begin{tabular}[c]{|l|p{13cm}|} + \begin{tabular}[c]{|l|p{11cm}|} \hline \textbf{Valore}& \textbf{Significato}\\ \hline @@ -1229,7 +1252,7 @@ valore. \begin{table}[htb] \footnotesize \centering - \begin{tabular}[c]{|l|p{13cm}|} + \begin{tabular}[c]{|l|p{11cm}|} \hline \textbf{Valore}& \textbf{Significato}\\ \hline @@ -1306,12 +1329,12 @@ funzioni di lettura e scrittura) che mantengono le velocit seriali all'interno dei flag; come accennato in Linux questo viene fatto (seguendo l'esempio di BSD) attraverso due campi aggiuntivi, \var{c\_ispeed} e \var{c\_ospeed}, nella struttura \var{termios} (non mostrati in -\secref{fig:term_termios}). +\figref{fig:term_termios}). \begin{table}[b!ht] \footnotesize \centering - \begin{tabular}[c]{|l|p{13cm}|} + \begin{tabular}[c]{|l|p{11cm}|} \hline \textbf{Valore}& \textbf{Significato}\\ \hline @@ -1412,7 +1435,7 @@ altri.\footnote{in Linux il valore della costante \begin{table}[htb] \footnotesize \centering - \begin{tabular}[c]{|l|c|c|p{9cm}|} + \begin{tabular}[c]{|l|c|c|p{8cm}|} \hline \textbf{Indice} & \textbf{Valore}&\textbf{Codice} & \textbf{Funzione}\\ \hline @@ -1691,7 +1714,7 @@ sono: caso di errore, che avviene solo quando il valore specificato non è valido.} \end{functions} - + Si noti che le funzioni si limitano a scrivere opportunamente il valore della velocità prescelta \var{speed} all'interno della struttura puntata da \var{termios\_p}; per effettuare l'impostazione effettiva occorrerà poi @@ -1713,7 +1736,7 @@ velocit Un terminale può utilizzare solo alcune delle velocità possibili, le funzioni però non controllano se il valore specificato è valido, dato che non possono sapere a quale terminale le velocità saranno applicate; sarà l'esecuzione di -\finc{tcsetattr} a fallire quando si cercherà di eseguire l'impostazione. +\func{tcsetattr} a fallire quando si cercherà di eseguire l'impostazione. Di norma il valore ha senso solo per i terminali seriali dove indica appunto la velocità della linea di trasmissione; se questa non corrisponde a quella @@ -1787,7 +1810,9 @@ La funzione invia un flusso di bit nulli (che genera una condizione di break) sul terminale associato a \param{fd}; un valore nullo di \param{duration} implica una durata del flusso fra 0.25 e 0.5 secondi, un valore diverso da zero implica una durata pari a \code{duration*T} dove \code{T} è un valore -compreso fra 0.25 e 0.5. +compreso fra 0.25 e 0.5.\footnote{POSIX specifica il comportamento solo nel + caso si sia impostato un valore nullo per \param{duration}; il comportamento + negli altri casi può dipendere dalla implementazione.} Le altre funzioni previste da POSIX servono a controllare il comportamento dell'interazione fra le code associate al terminale e l'utente; la prima è @@ -1811,7 +1836,7 @@ di uscita non % gestori di cancellazione. Una seconda funzione, \func{tcflush}, permette svuotare immediatamente le code -di cancellando tutti i dati presenti; il suo prototipo è: +di cancellando tutti i dati presenti al loro interno; il suo prototipo è: \begin{functions} \headdecl{unistd.h} \headdecl{termios.h} @@ -1823,10 +1848,12 @@ di cancellando tutti i dati presenti; il suo prototipo \macro{ENOTTY}.} \end{functions} -La funzione agisce sul terminale associato a \param{fd}, cancellando tutti i -dati presenti sulla coda specificata dall'argomento \param{queue}, -quest'ultimo può prendere i valori riportati in -\tabref{tab:sess_tcflush_queue}. +La funzione agisce sul terminale associato a \param{fd}, l'argomento +\param{queue} permette di specificare su quale coda (ingresso, uscita o +entrambe), operare. Esso può prendere i valori riportati in +\tabref{tab:sess_tcflush_queue}, nel caso si specifichi la coda di ingresso +cancellerà i dati ricevuti ma non ancora letti, nel caso si specifichi la coda +di uscita cancellerài dati scritti ma non ancora trasmessi. \begin{table}[htb] \footnotesize @@ -1836,9 +1863,9 @@ quest'ultimo pu \textbf{Valore}& \textbf{Significato}\\ \hline \hline - \macro{TCIFLUSH} & Cancella i dati ricevuti ma non ancora letti. \\ - \macro{TCOFLUSH} & Cancella i dati scritti ma non ancora trasmessi. \\ - \macro{TCIOFLUSH}& Cancella tutte e due le code.\\ + \macro{TCIFLUSH} & Cancella i dati sulla coda di ingresso. \\ + \macro{TCOFLUSH} & Cancella i dati sulla coda di uscita. \\ + \macro{TCIOFLUSH}& Cancella i dati su entrambe le code.\\ \hline \end{tabular} \caption{Possibili valori per l'argomento \param{queue} della @@ -1847,53 +1874,56 @@ quest'ultimo pu \end{table} -Infine è possibile è possibile sospendere la trasmissione e la ricezione dei -dati sul terminale usando \func{tcflow}; il suo prototipo è: +L'ultima funzione dell'interfaccia che interviene sulla disciplina di linea è +\func{tcflow}, che viene usata per sospendere la trasmissione e la ricezione +dei dati sul terminale; il suo prototipo è: \begin{functions} \headdecl{unistd.h} \headdecl{termios.h} - \funcdecl{int tcflow(int fd, int action)} . + \funcdecl{int tcflow(int fd, int action)} + Sospende e rivvia il flusso dei dati sul terminale. + \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di errore, nel qual caso \var{errno} assumerà i valori \macro{EBADF} o \macro{ENOTTY}.} \end{functions} +La funzione permette di controllare (interrompendo e facendo riprendere) il +flusso dei dati fra il terminale ed il sistema sia in ingresso che in uscita. +Il comportamento della funzione è regolato dall'argomento \param{action}, i +cui possibili valori, e relativa azione eseguita dalla funzione, sono +riportati in \secref{tab:sess_tcflow_action}. \begin{table}[htb] \footnotesize \centering \begin{tabular}[c]{|l|p{8cm}|} \hline - \textbf{Valore}& \textbf{Significato}\\ + \textbf{Valore}& \textbf{Azione}\\ \hline \hline - \macro{TCOOFF} & Cancella i dati ricevuti ma non ancora letti. \\ - \macro{TCOON} & Cancella i dati scritti ma non ancora trasmessi. \\ - \macro{TCIOFF}& Cancella tutte e due le code.\\ - \macro{TCION}& Cancella tutte e due le code.\\ + \macro{TCOOFF}& Sospende l'output.\\ + \macro{TCOON} & Riprende un output precedentemente sospeso.\\ + \macro{TCIOFF}& Il sistema trasmette un carattere di STOP, che + fa interrompere la trasmissione dei dati dal terminale. \\ + \macro{TCION} & Il sistema trasmette un carattere di START, che + fa riprendere la trasmissione dei dati dal terminale.\\ \hline \end{tabular} - \caption{Possibili valori per l'argomento \param{queue} della - funzione \func{tcflush}.} - \label{tab:sess_tcflush_queue} + \caption{Possibili valori per l'argomento \param{action} della + funzione \func{tcflow}.} + \label{tab:sess_tcflow_action} \end{table} -\subsection{Il \textsl{modo canonico}} -\label{sec:term_canonic_mode} - -Il modo canonico - - -\subsection{Il \textsl{modo non canonico}} -\label{sec:term_noncanonic_mode} +\subsection{Il \textsl{modo canonico} ed il \textsl{modo non canonico}} +\label{sec:term_terminal_modes} Il modo non canonico - - + %%% Local Variables: %%% mode: latex diff --git a/system.tex b/system.tex index 64ac8c9..310cd85 100644 --- a/system.tex +++ b/system.tex @@ -10,7 +10,7 @@ e degli errori. -\section{La lettura delle caratteristiche del sistema} +\section{Capacità e caratteristiche del sistema} \label{sec:sys_characteristics} In questa sezione tratteremo le varie modalità con cui un programma può @@ -21,11 +21,11 @@ l'architettura hardware, l'implementazione del kernel e delle librerie, le opzioni di configurazione. La definizione di queste caratteristiche ed il tentativo di provvedere dei -meccanismi generali che i programmi potessero usare per ricavarle è uno degli +meccanismi generali che i programmi possono usare per ricavarle è uno degli aspetti più complessi e controversi con cui le diverse standardizzazioni si sono dovute confrontare, spesso con risultati spesso tutt'altro che chiari. -Proveremo comunque a dare una descrizione dei principali metodi previsti dai -vari standard per ricavare sia le caratteristiche specifiche del sistema, che +Daremo comunque una descrizione dei principali metodi previsti dai vari +standard per ricavare sia le caratteristiche specifiche del sistema, che quelle della gestione dei file. @@ -388,19 +388,20 @@ riportate in \tabref{tab:sys_file_macro}. \begin{table}[htb] \centering \footnotesize - \begin{tabular}[c]{|l|r|p{8cm}|} + \begin{tabular}[c]{|l|r|l|} \hline \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\ \hline \hline - \macro{NAME\_MAX}& 14 & lunghezza in byte di un nome di file. \\ - \macro{PATH\_MAX}& 256 & lunghezza in byte di pathname.\\ - \macro{PIPE\_BUF}&4096 & byte scrivibili atomicamente in una pipe\\ \macro{LINK\_MAX} &8 & numero massimo di link a un file\\ - \macro{MAX\_CANON}&255 & spazio disponibile nella coda di input - canonica del terminale\\ + \macro{NAME\_MAX}& 14 & lunghezza in byte di un nome di file. \\ + \macro{PATH\_MAX}& 256 & lunghezza in byte di un pathname.\\ + \macro{PIPE\_BUF}&4096 & byte scrivibili atomicamente in una pipe + (vedi \secref{sec:ipc_pipes}).\\ + \macro{MAX\_CANON}&255 & dimensione di una riga di terminale in modo + canonico (vedi \secref{sec:term_design}).\\ \macro{MAX\_INPUT}&255 & spazio disponibile nella coda di input - del terminale\\ + del terminale (vedi \secref{sec:term_design}).\\ \hline \end{tabular} \caption{Macro per i limiti sulle caratteristiche dei file.} @@ -416,21 +417,20 @@ analoghe di \tabref{tab:sys_posix1_general}. \begin{table}[htb] \centering \footnotesize - \begin{tabular}[c]{|l|r|p{8cm}|} + \begin{tabular}[c]{|l|r|l|} \hline \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\ \hline \hline - \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\ - \macro{\_POSIX\_LINK\_MAX} &8 & numero massimo di link a un file\\ - \macro{\_POSIX\_MAX\_CANON}&255 & spazio disponibile nella coda di input - canonica del terminale\\ - \macro{\_POSIX\_MAX\_INPUT}&255 & spazio disponibile nella coda di input - del terminale\\ + \macro{\_POSIX\_LINK\_MAX} &8 & numero massimo di link a un file.\\ \macro{\_POSIX\_NAME\_MAX}& 14 & lunghezza in byte di un nome di file. \\ - \macro{\_POSIX\_PATH\_MAX}& 256 & lunghezza in byte di pathname.\\ + \macro{\_POSIX\_PATH\_MAX}& 256 & lunghezza in byte di un pathname.\\ \macro{\_POSIX\_PIPE\_BUF}& 512 & byte scrivibili atomicamente in una - pipe\\ + pipe.\\ + \macro{\_POSIX\_MAX\_CANON}&255 & dimensione di una riga di + terminale in modo canonico.\\ + \macro{\_POSIX\_MAX\_INPUT}&255 & spazio disponibile nella coda di input + del terminale.\\ % \macro{\_POSIX\_MQ\_OPEN\_MAX}& 8& \\ % \macro{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\ % \macro{\_POSIX\_FD\_SETSIZE}& 16 & \\ @@ -569,8 +569,6 @@ sistema l'implementazione è specifica di Linux; il suo prototipo è: \begin{functions} \headdecl{unistd.h} -\headdecl{linux/unistd.h} -\headdecl{linux/sysctl.h} \funcdecl{int sysctl(int *name, int nlen, void *oldval, size\_t *oldlenp, void *newval, size\_t newlen)} @@ -579,13 +577,13 @@ Legge o scrive uno dei parametri di sistema. \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\macro{EPERM}] il processo non ha il permesso di accedere ad uno dei - componenti nel cammino specificato per il parametro, o non ha il permesso - di accesso al parametro nella modalità scelta. + \item[\macro{EPERM}] non si ha il permesso di accedere ad uno dei componenti + nel cammino specificato per il parametro, o di accedere al parametro nella + modalità scelta. \item[\macro{ENOTDIR}] non esiste un parametro corrispondente al nome \param{name}. - \item[\macro{EFAULT}] si è specificato \param{oldlenp} zero quando - \param{oldval} è non nullo. +% \item[\macro{EFAULT}] si è specificato \param{oldlenp} zero quando +% \param{oldval} è non nullo. \item[\macro{EINVAL}] o si è specificato un valore non valido per il parametro che si vuole impostare o lo spazio provvisto per il ritorno di un valore non è delle giuste dimensioni. @@ -593,14 +591,19 @@ Legge o scrive uno dei parametri di sistema. quando non si è specificato sufficiente spazio per ricevere il valore di un parametro. \end{errlist} + ed inoltre \macro{EFAULT}. } \end{functions} I parametri a cui la funzione permettere di accedere sono organizzati in -maniera gerarchica all'interno un albero; per accedere ad uno di essi occorre -specificare un cammino attraverso i vari nodi dell'albero, in maniera analoga -a come avviene per la risoluzione di un pathname (da cui l'uso alternativo del -filesystem \file{/proc}, che vedremo dopo). +maniera gerarchica all'interno un albero;\footnote{si tenga presente che + includendo solo \file{unistd.h}, saranno definiti solo i parametri generici; + dato che ce ne sono molti specifici dell'implementazione, nel caso di Linux + occorrerà includere anche i file \file{linux/unistd.h} e + \file{linux/sysctl.h}.} per accedere ad uno di essi occorre specificare un +cammino attraverso i vari nodi dell'albero, in maniera analoga a come avviene +per la risoluzione di un pathname (da cui l'uso alternativo del filesystem +\file{/proc}, che vedremo dopo). Ciascun nodo dell'albero è identificato da un valore intero, ed il cammino che arriva ad identificare un parametro specifico è passato alla funzione