X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=session.tex;h=32fccd85bbbd2ff862d4211aeb25d2c2612f97d8;hp=8929b418854739ab772b6e32bc435bba72a5fdf9;hb=9f5fac5abf66c3a2fe782ecc17d63b62af2485ef;hpb=718a0a24b34dce09e40eafc33c02ae494d100181 diff --git a/session.tex b/session.tex index 8929b41..32fccd8 100644 --- a/session.tex +++ b/session.tex @@ -1,6 +1,6 @@ %% session.tex %% -%% Copyright (C) 2000-2002 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2004 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Prefazione", @@ -115,7 +115,7 @@ processi vengono raggruppati in \textit{process group} e \textit{sessioni}; per far questo vengono utilizzati due ulteriori identificatori (oltre quelli visti in \secref{sec:proc_pid}) che il kernel associa a ciascun processo:\footnote{in Linux questi identificatori sono mantenuti nei campi - \var{pgrp} e \var{session} della struttura \var{task\_struct} definita in + \var{pgrp} e \var{session} della struttura \struct{task\_struct} definita in \file{sched.h}.} l'identificatore del \textit{process group} e l'identificatore della \textsl{sessione}, che vengono indicati rispettivamente con le sigle \acr{pgid} e \acr{sid}, e sono mantenuti in variabili di tipo @@ -124,7 +124,7 @@ dal comando \cmd{ps} usando l'opzione \cmd{-j}. Un \textit{process group} è pertanto definito da tutti i processi che hanno lo stesso \acr{pgid}; è possibile leggere il valore di questo identificatore con -le funzioni \func{getpgid} e \func{getpgrp},\footnote{\func{getpgrp} è +le funzioni \funcd{getpgid} e \funcd{getpgrp},\footnote{\func{getpgrp} è definita nello standard POSIX.1, mentre \func{getpgid} è richiesta da SVr4.} i cui prototipi sono: \begin{functions} @@ -148,7 +148,7 @@ restituisce il \acr{pgid} del processo corrente; \func{getpgrp} equivalente a \code{getpgid(0)}. In maniera analoga l'identificatore della sessione può essere letto dalla -funzione \func{getsid}, che però nelle \acr{glibc}\footnote{la system call è +funzione \funcd{getsid}, che però nelle \acr{glibc}\footnote{la system call è stata introdotta in Linux a partire dalla versione 1.3.44, il supporto nelle librerie del C è iniziato dalla versione 5.2.19. La funzione non è prevista da POSIX.1, che parla solo di processi leader di sessione, e non di @@ -181,7 +181,7 @@ Ciascun raggruppamento di processi ha sempre un processo principale, il cosiddetto \textit{process group leader}, che è identificato dall'avere un \acr{pgid} uguale al suo \acr{pid}, in genere questo è il primo processo del raggruppamento, che si incarica di lanciare tutti gli altri. Un nuovo -raggruppamento si crea con la funzione \func{setpgrp},\footnote{questa è la +raggruppamento si crea con la funzione \funcd{setpgrp},\footnote{questa è la definizione di POSIX.1, BSD definisce una funzione con lo stesso nome, che però è identica a \func{setpgid}; nelle \acr{glibc} viene sempre usata sempre questa definizione, a meno di non richiedere esplicitamente la @@ -198,7 +198,7 @@ La funzione, assegnando al \acr{pgid} il valore del \acr{pid} processo corrente, rende questo \textit{group leader} di un nuovo raggruppamento, tutti i successivi processi da esso creati apparterranno (a meno di non cambiare di nuovo il \acr{pgid}) al nuovo raggruppamento. È possibile invece spostare un -processo da un raggruppamento ad un altro con la funzione \func{setpgid}, il +processo da un raggruppamento ad un altro con la funzione \funcd{setpgid}, il cui prototipo è: \begin{prototype}{unistd.h}{int setpgid(pid\_t pid, pid\_t pgid)} Assegna al \acr{pgid} del processo \param{pid} il valore \param{pgid}. @@ -221,10 +221,11 @@ Inoltre la funzione pu dei suoi figli, ed in quest'ultimo caso ha successo soltanto se questo non ha ancora eseguito una \func{exec}.\footnote{questa caratteristica è implementata dal kernel che mantiene allo scopo un altro campo, \var{did\_exec}, in - \var{task\_struct}.} Specificando un valore nullo per \param{pid} si indica -il processo corrente, mentre specificando un valore nullo per \param{pgid} si -imposta il \textit{process group} al valore del \acr{pid} del processo -selezionato; pertanto \func{setpgrp} è equivalente a \code{setpgid(0, 0)}. + \struct{task\_struct}.} Specificando un valore nullo per \param{pid} si +indica il processo corrente, mentre specificando un valore nullo per +\param{pgid} si imposta il \textit{process group} al valore del \acr{pid} del +processo selezionato; pertanto \func{setpgrp} è equivalente a \code{setpgid(0, + 0)}. Di norma questa funzione viene usata dalla shell quando si usano delle pipeline, per mettere nello stesso process group tutti i programmi lanciati su @@ -233,12 +234,13 @@ processo padre, per impostare il valore nel figlio, che da quest'ultimo, per sé stesso, in modo che il cambiamento di \textit{process group} sia immediato per entrambi; una delle due chiamate sarà ridondante, ma non potendo determinare quale dei due processi viene eseguito per primo, occorre eseguirle -comunque entrambe per evitare di esporsi ad una race condition. +comunque entrambe per evitare di esporsi ad una race +condition\index{race condition}. Si noti come nessuna delle funzioni esaminate finora permetta di spostare un processo da una sessione ad un altra; infatti l'unico modo di far cambiare sessione ad un processo è quello di crearne una nuova con l'uso di -\func{setsid}; il suo prototipo è: +\funcd{setsid}; il suo prototipo è: \begin{prototype}{unistd.h}{pid\_t setsid(void)} Crea una nuova sessione sul processo corrente impostandone \acr{sid} e \acr{pgid}. @@ -253,10 +255,10 @@ valore del suo \acr{pid}, creando cos \textit{process group} di cui esso diventa leader (come per i \textit{process group} un processo si dice leader di sessione\footnote{in Linux la proprietà è mantenuta in maniera indipendente con un apposito campo \var{leader} in - \var{task\_struct}.} se il suo \acr{sid} è uguale al suo \acr{pid}) ed unico -componente. Inoltre la funzione distacca il processo da ogni terminale di -controllo (torneremo sull'argomento in \secref{sec:sess_ctrl_term}) cui fosse -in precedenza associato. + \struct{task\_struct}.} se il suo \acr{sid} è uguale al suo \acr{pid}) ed +unico componente. Inoltre la funzione distacca il processo da ogni terminale +di controllo (torneremo sull'argomento in \secref{sec:sess_ctrl_term}) cui +fosse in precedenza associato. La funzione ha successo soltanto se il processo non è già leader di un \textit{process group}, per cui per usarla di norma si esegue una \func{fork} @@ -292,8 +294,8 @@ associato un terminale di controllo; in Linux questo viene realizzato mantenendo fra gli attributi di ciascun processo anche qual'è il suo terminale di controllo. \footnote{Lo standard POSIX.1 non specifica nulla riguardo l'implementazione; in Linux anch'esso viene mantenuto nella solita struttura - \var{task\_struct}, nel campo \var{tty}.} In generale ogni processo eredita -dal padre, insieme al \acr{pgid} e al \acr{sid} anche il terminale di + \struct{task\_struct}, nel campo \var{tty}.} In generale ogni processo +eredita dal padre, insieme al \acr{pgid} e al \acr{sid} anche il terminale di controllo (vedi \secref{sec:proc_fork}). In questo modo tutti processi originati dallo stesso leader di sessione mantengono lo stesso terminale di controllo. @@ -318,7 +320,7 @@ associato ai file standard (di input, output ed error) dei processi nella sessione, ma solo quelli che fanno parte del cosiddetto raggruppamento di \textit{foreground}, possono leggere e scrivere in certo istante. Per impostare il raggruppamento di \textit{foreground} di un terminale si usa la -funzione \func{tcsetpgrp}, il cui prototipo è: +funzione \funcd{tcsetpgrp}, il cui prototipo è: \begin{functions} \headdecl{unistd.h} \headdecl{termios.h} @@ -357,7 +359,7 @@ condizioni di errore.\footnote{la shell in genere notifica comunque un funzioni di lettura e scrittura falliranno con un errore di \errcode{EIO}. Un processo può controllare qual'è il gruppo di \textit{foreground} associato -ad un terminale con la funzione \func{tcgetpgrp}, il cui prototipo è: +ad un terminale con la funzione \funcd{tcgetpgrp}, il cui prototipo è: \begin{functions} \headdecl{unistd.h} \headdecl{termios.h} @@ -559,8 +561,8 @@ valori per le variabili di ambiente, come \texttt{HOME}, \texttt{SHELL}, ecc. Infine attraverso l'uso di \func{setuid}, \func{setpid} e \func{initgroups} verrà cambiata l'identità del proprietario del processo, infatti, come spiegato in \secref{sec:proc_setuid}, avendo invocato tali funzioni con i -privilegi di amministratore, tutti gli userid ed i groupid (reali, effettivi e -salvati) saranno settati a quelli dell'utente. +privilegi di amministratore, tutti gli user-ID ed i group-ID (reali, effettivi +e salvati) saranno settati a quelli dell'utente. A questo punto \cmd{login} provvederà (fatte salve eventuali altre azioni iniziali, come la stampa di messaggi di benvenuto o il controllo della posta) @@ -643,7 +645,7 @@ occorrer In Linux buona parte di queste azioni possono venire eseguite invocando la -funzione \func{daemon}, introdotta per la prima volta in BSD4.4; il suo +funzione \funcd{daemon}, introdotta per la prima volta in BSD4.4; il suo prototipo è: \begin{prototype}{unistd.h}{int daemon(int nochdir, int noclose)} Esegue le operazioni che distaccano il processo dal terminale di controllo e @@ -681,13 +683,14 @@ standardizzata. Il servizio prevede vari meccanismi di notifica, e, come ogni altro servizio in un sistema unix-like, viene gestito attraverso un apposito programma, \cmd{syslogd}, che è anch'esso un \textsl{demone}. In generale i messaggi di -errore vengono raccolti dal file speciale \file{/dev/log}, un \textit{socket} -locale (vedi \secref{sec:sock_sa_local}) dedicato a questo scopo, o via rete, -con un \textit{socket} UDP, o da un apposito demone, \cmd{klogd}, che estrae i -messaggi del kernel.\footnote{i messaggi del kernel sono tenuti in un buffer - circolare e scritti tramite la funzione \func{printk}, analoga alla - \func{printf} usata in user space; una trattazione eccellente dell'argomento - si trova in \cite{LinDevDri}, nel quarto capitolo.} +errore vengono raccolti dal file speciale \file{/dev/log}, un +\textit{socket}\index{socket} locale (vedi \secref{sec:sock_sa_local}) +dedicato a questo scopo, o via rete, con un \textit{socket} UDP, o da un +apposito demone, \cmd{klogd}, che estrae i messaggi del kernel.\footnote{i + messaggi del kernel sono tenuti in un buffer circolare e scritti tramite la + funzione \func{printk}, analoga alla \func{printf} usata in user space; una + trattazione eccellente dell'argomento si trova in \cite{LinDevDri}, nel + quarto capitolo.} Il servizio permette poi di trattare i vari messaggi classificandoli attraverso due indici; il primo, chiamato \textit{facility}, suddivide in @@ -715,10 +718,10 @@ dettagli si possono trovare sulle pagine di manuale per questo file e per Le \acr{glibc} definiscono una serie di funzioni standard con cui un processo può accedere in maniera generica al servizio di \textit{syslog}, che però funzionano solo localmente; se si vogliono inviare i messaggi ad un'altro -sistema occorre farlo esplicitamente con un socket UDP, o utilizzare le -capacità di reinvio del servizio. +sistema occorre farlo esplicitamente con un socket\index{socket} UDP, o +utilizzare le capacità di reinvio del servizio. -La prima funzione definita dall'interfaccia è \func{openlog}, che apre una +La prima funzione definita dall'interfaccia è \funcd{openlog}, che apre una connessione al servizio di \textit{syslog}; essa in generale non è necessaria per l'uso del servizio, ma permette di impostare alcuni valori che controllano gli effetti delle chiamate successive; il suo prototipo è: @@ -806,7 +809,7 @@ con un OR aritmetico di una qualunque delle costanti riportate in \label{tab:sess_openlog_option} \end{table} -La funzione che si usa per generare un messaggio è \func{syslog}, dato che +La funzione che si usa per generare un messaggio è \funcd{syslog}, dato che l'uso di \func{openlog} è opzionale, sarà quest'ultima a provvede a chiamare la prima qualora ciò non sia stato fatto (nel qual caso il valore di \param{ident} è nullo). Il suo prototipo è: @@ -864,7 +867,7 @@ con la maschera binaria delle costanti di \tabref{tab:sess_syslog_facility}. \label{tab:sess_syslog_priority} \end{table} -Una ulteriore funzione, \func{setlogmask}, permette di filtrare +Una ulteriore funzione, \funcd{setlogmask}, permette di filtrare preliminarmente i messaggi in base alla loro priorità; il suo prototipo è: \begin{prototype}{syslog.h}{int setlogmask(int mask)} @@ -1003,7 +1006,7 @@ 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 (altrimenti si otterrà un errore di \errcode{ENOTTY}); questo può -essere evitato utilizzando la funzione \func{isatty}, il cui prototipo è: +essere evitato utilizzando la funzione \funcd{isatty}, il cui prototipo è: \begin{prototype}{unistd.h}{int isatty(int desc)} Controlla se il file descriptor \param{desc} è un terminale. @@ -1012,7 +1015,7 @@ essere evitato utilizzando la funzione \func{isatty}, il cui prototipo terminale, 0 altrimenti.} \end{prototype} -Un'altra funzione che fornisce informazioni su un terminale è \func{ttyname}, +Un'altra funzione che fornisce informazioni su un terminale è \funcd{ttyname}, che permette di ottenere il nome del terminale associato ad un file descriptor; il suo prototipo è: \begin{prototype}{unistd.h}{char *ttyname(int desc)} @@ -1026,7 +1029,7 @@ descriptor; il suo prototipo Si tenga presente che la funzione restituisce un indirizzo di dati statici, che pertanto possono essere sovrascritti da successive chiamate. Una funzione -funzione analoga, anch'essa prevista da POSIX.1, è \func{ctermid}, il cui +funzione analoga, anch'essa prevista da POSIX.1, è \funcd{ctermid}, il cui prototipo è: \begin{prototype}{stdio.h}{char *ctermid(char *s)} @@ -1045,7 +1048,7 @@ precedenza ed essere lunga almeno indica la dimensione che deve avere una stringa per poter contenere il nome di un terminale.} caratteri. -Esiste infine una versione rientrante \func{ttyname\_r} della funzione +Esiste infine una versione rientrante \funcd{ttyname\_r} della funzione \func{ttyname}, che non presenta il problema dell'uso di una zona di memoria statica; il suo prototipo è: \begin{prototype}{unistd.h}{int ttyname\_r(int desc, char *buff, size\_t len)} @@ -1075,12 +1078,12 @@ 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 è riportata in \figref{fig:term_termios}), -usata dalle varie funzioni dell'interfaccia. In \figref{fig:term_termios} si -sono riportati tutti i campi della definizione usata in Linux; di questi solo -i primi cinque sono previsti dallo standard POSIX.1, ma le varie -implementazioni ne aggiungono degli altri per mantenere ulteriori -informazioni.\footnote{la definizione della struttura si trova in +\struct{termios}, (la cui definizione è riportata in +\figref{fig:term_termios}), usata dalle varie funzioni dell'interfaccia. In +\figref{fig:term_termios} si sono riportati tutti i campi della definizione +usata in Linux; di questi solo i primi cinque sono previsti dallo standard +POSIX.1, ma le varie implementazioni ne aggiungono degli altri per mantenere +ulteriori informazioni.\footnote{la definizione della struttura si trova in \file{bits/termios.h}, da non includere mai direttamente, Linux, seguendo l'esempio di BSD, aggiunge i due campi \var{c\_ispeed} e \var{c\_ospeed} per mantenere le velocità delle linee seriali, ed un campo ulteriore, @@ -1089,21 +1092,10 @@ informazioni.\footnote{la definizione della struttura si trova in \begin{figure}[!htb] \footnotesize \centering \begin{minipage}[c]{15cm} - \begin{lstlisting}[labelstep=0]{} -struct termios { - tcflag_t c_iflag; /* input modes */ - tcflag_t c_oflag; /* output modes */ - tcflag_t c_cflag; /* control modes */ - tcflag_t c_lflag; /* local modes */ - cc_t c_cc[NCCS]; /* control characters */ - cc_t c_line; /* line discipline */ - speed_t c_ispeed; /* input speed */ - speed_t c_ospeed; /* output speed */ -; - \end{lstlisting} + \includestruct{listati/termios.h} \end{minipage} \normalsize - \caption{La struttura \var{termios}, che identifica le proprietà di un + \caption{La struttura \structd{termios}, che identifica le proprietà di un terminale.} \label{fig:term_termios} \end{figure} @@ -1281,10 +1273,7 @@ della maschera, i valori da immettere infatti (quelli riportati nella spiegazione corrispondente) sono numerici e non per bit, per cui possono sovrapporsi fra di loro. Occorrerà perciò utilizzare un codice del tipo: -\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}% - c_oflag &= (~CRDLY); - c_oflag |= CR1; -\end{lstlisting} +\includecodesnip{listati/oflag.c} \noindent che prima cancella i bit della maschera in questione e poi setta il valore. @@ -1335,13 +1324,13 @@ valore. \const{CBAUD} & Maschera dei bit (4+1) usati per impostare della velocità della linea (il \textit{baud rate}) in ingresso. In Linux non è implementato in quanto viene - usato un apposito campo di \var{termios}.\\ + usato un apposito campo di \struct{termios}.\\ \const{CBAUDEX}& Bit aggiuntivo per l'impostazione della velocità della linea, per le stesse motivazioni del precedente non è implementato in Linux.\\ \const{CIBAUD} & Maschera dei bit della velocità della linea in ingresso. Analogo a \const{CBAUD}, anch'esso in Linux è - mantenuto in un apposito campo di \var{termios}. \\ + mantenuto in un apposito campo di \struct{termios}. \\ \const{CRTSCTS}& Abilita il controllo di flusso hardware sulla seriale, attraverso l'utilizzo delle dei due fili di RTS e CTS.\\ \hline @@ -1369,7 +1358,7 @@ standard POSIX non specifica nulla riguardo l'implementazione, ma solo delle funzioni di lettura e scrittura) che mantengono le velocità delle linee 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} (mostrati in +\var{c\_ospeed}, nella struttura \struct{termios} (mostrati in \figref{fig:term_termios}). \begin{table}[b!ht] @@ -1466,10 +1455,10 @@ avviene solo in modo canonico, pertanto questi flag non hanno significato se non è impostato \const{ICANON}. Oltre ai vari flag per gestire le varie caratteristiche dei terminali, -\var{termios} contiene pure il campo \var{c\_cc} che viene usato per impostare -i caratteri speciali associati alle varie funzioni di controllo. Il numero di -questi caratteri speciali è indicato dalla costante \const{NCCS}, POSIX ne -specifica almeno 11, ma molte implementazioni ne definiscono molti +\struct{termios} contiene pure il campo \var{c\_cc} che viene usato per +impostare i caratteri speciali associati alle varie funzioni di controllo. Il +numero di questi caratteri speciali è indicato dalla costante \const{NCCS}, +POSIX ne specifica almeno 11, ma molte implementazioni ne definiscono molti altri.\footnote{in Linux il valore della costante è 32, anche se i caratteri effettivamente definiti sono solo 17.} @@ -1539,7 +1528,7 @@ altri.\footnote{in Linux il valore della costante \hline \end{tabular} \caption{Valori dei caratteri di controllo mantenuti nel campo \var{c\_cc} - della struttura \var{termios}.} + della struttura \struct{termios}.} \label{tab:sess_termios_cc} \end{table} @@ -1553,9 +1542,7 @@ completo dei caratteri di controllo, con le costanti e delle funzionalit associate è riportato in \tabref{tab:sess_termios_cc}, usando quelle definizioni diventa possibile assegnare un nuovo carattere di controllo con un codice del tipo: -\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}% - value.c_cc[VEOL2] = '\n'; -\end{lstlisting} +\includecodesnip{listati/value_c_cc.c} La maggior parte di questi caratteri (tutti tranne \const{VTIME} e \const{VMIN}) hanno effetto solo quando il terminale viene utilizzato in modo @@ -1566,10 +1553,11 @@ esempio \const{VINTR}, \const{VSUSP}, e \const{VQUIT} richiedono sia settato settato \const{IEXTEN}. In ogni caso quando vengono attivati i caratteri vengono interpretati e non sono passati sulla coda di ingresso. -Per leggere ed scrivere tutte le impostazioni dei terminali lo standard POSIX -prevede due funzioni, \func{tcgetattr} e \func{tcsetattr}; entrambe utilizzano -come argomento un puntatore ad struttura \var{termios} che sarà quella in cui -andranno immagazzinate le impostazioni, il loro prototipo è: +Per leggere ed scrivere tutte le varie impostazioni dei terminali viste finora +lo standard POSIX prevede due funzioni che utilizzano come argomento un +puntatore ad una struttura \struct{termios} che sarà quella in cui andranno +immagazzinate le impostazioni. Le funzioni sono \funcd{tcgetattr} e +\funcd{tcsetattr} ed il loro prototipo è: \begin{functions} \headdecl{unistd.h} \headdecl{termios.h} @@ -1647,30 +1635,11 @@ effettuano pi chiamata a \func{tcgetattr} che essi siano stati eseguiti tutti quanti. \begin{figure}[!htb] - \footnotesize - \begin{lstlisting}{}% -#include -#include -#include - -int SetTermAttr(int fd, tcflag_t flag) -{ - struct termios values; - int res; - res = tcgetattr (desc, &values); - if (res) { - perror("Cannot get attributes"); - return res; - } - values.c_lflag |= flag; - res = tcsetattr (desc, TCSANOW, &values); - if (res) { - perror("Cannot set attributes"); - return res; - } - return 0; -} - \end{lstlisting} + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includecodesample{listati/SetTermAttr.c} + \end{minipage} + \normalsize \caption{Codice della funzione \func{SetTermAttr} che permette di impostare uno dei flag di controllo locale del terminale.} \label{fig:term_set_attr} @@ -1699,48 +1668,33 @@ infine si scrive il nuovo valore modificato con \func{tcsetattr} o uscendo normalmente. \begin{figure}[!htb] - \footnotesize - \begin{lstlisting}{}% -int UnSetTermAttr(int fd, tcflag_t flag) -{ - struct termios values; - int res; - res = tcgetattr (desc, &values); - if (res) { - perror("Cannot get attributes"); - return res; - } - values.c_lflag &= (~flag); - res = tcsetattr (desc, TCSANOW, &values); - if (res) { - perror("Cannot set attributes"); - return res; - } - return 0; -} - \end{lstlisting} + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includecodesample{listati/UnSetTermAttr.c} + \end{minipage} + \normalsize \caption{Codice della funzione \func{UnSetTermAttr} che permette di rimuovere uno dei flag di controllo locale del terminale.} \label{fig:term_unset_attr} \end{figure} La seconda funzione, \func{UnSetTermAttr}, è assolutamente identica alla -prima, solo che in questo caso (in \texttt{\small 15}) si rimuovono i bit +prima, solo che in questo caso, in (\texttt{\small 15}), si rimuovono i bit specificati dall'argomento \param{flag} usando un AND binario del valore negato. Al contrario di tutte le altre caratteristiche dei terminali, che possono essere impostate esplicitamente utilizzando gli opportuni campi di -\var{termios}, per le velocità della linea (il cosiddetto \textit{baud rate}) -non è prevista una implementazione standardizzata, per cui anche se in Linux -sono mantenute in due campi dedicati nella struttura, questi non devono essere -acceduti direttamente ma solo attraverso le apposite funzioni di interfaccia -provviste da POSIX.1. +\struct{termios}, per le velocità della linea (il cosiddetto \textit{baud + rate}) non è prevista una implementazione standardizzata, per cui anche se +in Linux sono mantenute in due campi dedicati nella struttura, questi non +devono essere acceduti direttamente ma solo attraverso le apposite funzioni di +interfaccia provviste da POSIX.1. Lo standard prevede due funzioni per scrivere la velocità delle linee seriali, -\func{cfsetispeed} per la velocità della linea di ingresso e -\func{cfsetospeed} per la velocità della linea di uscita; i loro prototipi +\funcd{cfsetispeed} per la velocità della linea di ingresso e +\funcd{cfsetospeed} per la velocità della linea di uscita; i loro prototipi sono: \begin{functions} \headdecl{unistd.h} @@ -1757,9 +1711,9 @@ sono: \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 -chiamare \func{tcsetattr}. +velocità prescelta \param{speed} all'interno della struttura puntata da +\param{termios\_p}; per effettuare l'impostazione effettiva occorrerà poi +chiamare \func{tcsetattr}. Si tenga presente che per le linee seriali solo alcuni valori di velocità sono validi; questi possono essere specificati direttamente (le \acr{glibc} @@ -1768,9 +1722,12 @@ altre versioni di librerie possono utilizzare dei valori diversi; per questo POSIX.1 prevede una serie di costanti che però servono solo per specificare le velocità tipiche delle linee seriali: \begin{verbatim} - B0 B50 B75 B110 B134 B150 - B200 B300 B600 B1200 B1800 B2400 - B4800 B9600 B19200 B38400 B57600 B115200 + B0 B50 B75 + B110 B134 B150 + B200 B300 B600 + B1200 B1800 B2400 + B4800 B9600 B19200 + B38400 B57600 B115200 B230400 B460800 \end{verbatim} @@ -1791,8 +1748,8 @@ l'effetto sar di output. Analogamente a quanto avviene per l'impostazione, le velocità possono essere -lette da una struttura \var{termios} utilizzando altre due funzioni, -\func{cfgetispeed} e \func{cfgetospeed}, i cui prototipi sono: +lette da una struttura \struct{termios} utilizzando altre due funzioni, +\funcd{cfgetispeed} e \funcd{cfgetospeed}, i cui prototipi sono: \begin{functions} \headdecl{unistd.h} \headdecl{termios.h} @@ -1833,7 +1790,7 @@ illustrato in \secref{sec:sess_ctrl_term}.\footnote{con la stessa eccezione, processo chiamante.} Una prima funzione, che è efficace solo in caso di terminali seriali asincroni -(non fa niente per tutti gli altri terminali), è \func{tcsendbreak}; il suo +(non fa niente per tutti gli altri terminali), è \funcd{tcsendbreak}; il suo prototipo è: \begin{functions} \headdecl{unistd.h} @@ -1857,7 +1814,7 @@ compreso fra 0.25 e 0.5.\footnote{POSIX specifica il comportamento solo nel Le altre funzioni previste da POSIX servono a controllare il comportamento dell'interazione fra le code associate al terminale e l'utente; la prima è -\func{tcdrain}, il cui prototipo è: +\funcd{tcdrain}, il cui prototipo è: \begin{functions} \headdecl{unistd.h} \headdecl{termios.h} @@ -1876,7 +1833,7 @@ di uscita non % chiamate devono essere protette con dei % gestori di cancellazione. -Una seconda funzione, \func{tcflush}, permette svuotare immediatamente le code +Una seconda funzione, \funcd{tcflush}, permette svuotare immediatamente le code di cancellando tutti i dati presenti al loro interno; il suo prototipo è: \begin{functions} \headdecl{unistd.h} \headdecl{termios.h} @@ -1894,7 +1851,7 @@ La funzione agisce sul terminale associato a \param{fd}, l'argomento 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. +di uscita cancellerà i dati scritti ma non ancora trasmessi. \begin{table}[htb] \footnotesize @@ -1916,7 +1873,7 @@ di uscita canceller L'ultima funzione dell'interfaccia che interviene sulla disciplina di linea è -\func{tcflow}, che viene usata per sospendere la trasmissione e la ricezione +\funcd{tcflow}, che viene usata per sospendere la trasmissione e la ricezione dei dati sul terminale; il suo prototipo è: \begin{functions} \headdecl{unistd.h} @@ -1924,7 +1881,7 @@ dei dati sul terminale; il suo prototipo \funcdecl{int tcflow(int fd, int action)} - Sospende e rivvia il flusso dei dati sul terminale. + Sospende e riavvia 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 \errval{EBADF} o @@ -2011,6 +1968,25 @@ distinti: \end{description} +% +% Qui c'è da mettere tutta la parte sui terminali virtuali, e la gestione +% degli stessi +% + +\section{La gestione dei terminali virtuali} +\label{sec:sess_virtual_terminal} + +Da fare. + +\subsection{I terminali virtuali} +\label{sec:sess_pty} + +Qui vanno spiegati i terminali virtuali, \file{/dev/pty} e compagnia. + +\subsection{La funzione \func{openpty}} +\label{sec:sess_openpty} + +Qui vanno le cose su \func{openpty} e compagnia. %%% Local Variables: %%% mode: latex