X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=session.tex;h=c8f25effcd2bea0f29b3a41fc3c895322efa968b;hp=4118000e6f7018f49922d5c28cf0f297511eebbe;hb=6f8e0ca42d3d0b97b5e5747798a1eaffb44e8521;hpb=c474f4307db945bc45287edd0ea4c2c29374d0ee diff --git a/session.tex b/session.tex index 4118000..c8f25ef 100644 --- a/session.tex +++ b/session.tex @@ -1,9 +1,9 @@ %% session.tex %% -%% Copyright (C) 2000-2004 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2005 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", +%% Free Software Foundation; with the Invariant Sections being "Un preambolo", %% with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the %% license is included in the section entitled "GNU Free Documentation %% License". @@ -60,11 +60,11 @@ sez.~\ref{sec:sess_login}). Siccome la shell è collegata ad un solo terminale, che viene usualmente chiamato \textsl{terminale di controllo}, (vedi sez.~\ref{sec:sess_ctrl_term}) -un solo comando alla volta (quello che viene detto in \textit{foreground}), -potrà scrivere e leggere dal terminale. La shell però può eseguire anche più -comandi in contemporanea, mandandoli in \textit{background} (aggiungendo una -\cmd{\&} alla fine del comando), nel qual caso essi saranno eseguiti senza -essere collegati al terminale. +un solo comando alla volta (quello che viene detto in \textit{foreground} o in +\textsl{primo piano}), potrà scrivere e leggere dal terminale. La shell però +può eseguire, aggiungendo una \cmd{\&} alla fine del comando, più programmi in +contemporanea, mandandoli in \textit{background} (o \textsl{sullo sfondo}), +nel qual caso essi saranno eseguiti senza essere collegati al terminale. Si noti come si sia parlato di comandi e non di programmi o processi; fra le funzionalità della shell infatti c'è anche quella di consentire di concatenare @@ -75,19 +75,21 @@ questo potr Per questo l'esecuzione di un comando può originare più di un processo; quindi nella gestione del job control non si può far riferimento ai singoli processi. Per questo il kernel prevede la possibilità di raggruppare più processi in un -\textit{process group} (detto anche \textsl{raggruppamento di processi}, vedi -sez.~\ref{sec:sess_proc_group}) e la shell farà sì che tutti i processi che -originano da una riga di comando appartengano allo stesso raggruppamento, in -modo che le varie funzioni di controllo, ed i segnali inviati dal terminale, -possano fare riferimento ad esso. +\itindex{process~group} \textit{process group} (detto anche +\textsl{raggruppamento di processi}, vedi sez.~\ref{sec:sess_proc_group}) e la +shell farà sì che tutti i processi che originano da una riga di comando +appartengano allo stesso raggruppamento, in modo che le varie funzioni di +controllo, ed i segnali inviati dal terminale, possano fare riferimento ad +esso. In generale allora all'interno di una sessione avremo un eventuale (può non -esserci) \textit{process group} in \textit{foreground}, che riunisce i -processi che possono accedere al terminale, e più \textit{process group} in -\textit{background}, che non possono accedervi. Il job control prevede che -quando un processo appartenente ad un raggruppamento in \textit{background} -cerca di accedere al terminale, venga inviato un segnale a tutti i processi -del raggruppamento, in modo da bloccarli (vedi sez.~\ref{sec:sess_ctrl_term}). +esserci) \itindex{process~group} \textit{process group} in +\textit{foreground}, che riunisce i processi che possono accedere al +terminale, e più \textit{process group} in \textit{background}, che non +possono accedervi. Il job control prevede che quando un processo appartenente +ad un raggruppamento in \textit{background} cerca di accedere al terminale, +venga inviato un segnale a tutti i processi del raggruppamento, in modo da +bloccarli (vedi sez.~\ref{sec:sess_ctrl_term}). Un comportamento analogo si ha anche per i segnali generati dai comandi di tastiera inviati dal terminale che vengono inviati a tutti i processi del @@ -110,8 +112,10 @@ sez.~\ref{sec:proc_wait}). \subsection{I \textit{process group} e le \textsl{sessioni}} \label{sec:sess_proc_group} +\itindbeg{process~group} + Come accennato in sez.~\ref{sec:sess_job_control_overview} nel job control i -processi vengono raggruppati in \textit{process group} e \textit{sessioni}; +processi vengono raggruppati in \textit{process group} e \textsl{sessioni}; per far questo vengono utilizzati due ulteriori identificatori (oltre quelli visti in sez.~\ref{sec:proc_pid}) che il kernel associa a ciascun processo:\footnote{in Linux questi identificatori sono mantenuti nei campi @@ -178,15 +182,15 @@ stessa sessione del padre. Vedremo poi come sia possibile creare pi processi dall'uno all'altro, ma sempre all'interno di una stessa sessione. 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 \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 - compatibilità all'indietro con BSD, definendo la macro - \macro{\_BSD\_SOURCE}.} il cui prototipo è: +cosiddetto \itindex{process~group~leader}\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 +\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 compatibilità all'indietro con BSD, definendo + la macro \macro{\_BSD\_SOURCE}.} il cui prototipo è: \begin{prototype}{unistd.h}{int setpgrp(void)} Modifica il \acr{pgid} al valore del \acr{pid} del processo corrente. @@ -195,11 +199,11 @@ raggruppamento si crea con la funzione \funcd{setpgrp},\footnote{questa \end{prototype} 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 \funcd{setpgid}, il -cui prototipo è: +corrente, rende questo \itindex{process~group~leader} \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 \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}. @@ -228,14 +232,14 @@ processo selezionato; pertanto \func{setpgrp} 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 -ogni linea di comando; essa viene chiamata dopo una \func{fork} sia dal -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\index{race condition}. +pipeline, per mettere nello stesso \textit{process group} tutti i programmi +lanciati su ogni linea di comando; essa viene chiamata dopo una \func{fork} +sia dal 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 \textit{race + condition}\itindex{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 @@ -260,21 +264,22 @@ unico componente. Inoltre la funzione distacca il processo da ogni terminale di controllo (torneremo sull'argomento in sez.~\ref{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} -e si esce, per poi chiamare \func{setsid} nel processo figlio, in modo che, -avendo questo lo stesso \acr{pgid} del padre ma un \acr{pid} diverso, non ci -siano possibilità di errore.\footnote{potrebbe sorgere il dubbio che, per il - riutilizzo dei valori dei \acr{pid} fatto nella creazione dei nuovi processi - (vedi sez.~\ref{sec:proc_pid}), il figlio venga ad assumere un valore - corrispondente ad un process group esistente; questo viene evitato dal - kernel che considera come disponibili per un nuovo \acr{pid} solo valori che - non corrispondono ad altri \acr{pid}, \acr{pgid} o \acr{sid} in uso nel +La funzione ha successo soltanto se il processo non è già +\itindex{process~group~leader} leader di un \textit{process group}, per cui +per usarla di norma si esegue una \func{fork} e si esce, per poi chiamare +\func{setsid} nel processo figlio, in modo che, avendo questo lo stesso +\acr{pgid} del padre ma un \acr{pid} diverso, non ci siano possibilità di +errore.\footnote{potrebbe sorgere il dubbio che, per il riutilizzo dei valori + dei \acr{pid} fatto nella creazione dei nuovi processi (vedi + sez.~\ref{sec:proc_pid}), il figlio venga ad assumere un valore + corrispondente ad un \textit{process group} esistente; questo viene evitato + dal kernel che considera come disponibili per un nuovo \acr{pid} solo valori + che non corrispondono ad altri \acr{pid}, \acr{pgid} o \acr{sid} in uso nel sistema.} Questa funzione viene usata di solito nel processo di login (per i dettagli vedi sez.~\ref{sec:sess_login}) per raggruppare in una sessione tutti i comandi eseguiti da un utente dalla sua shell. - +\itindend{process~group} \subsection{Il terminale di controllo e il controllo di sessione} \label{sec:sess_ctrl_term} @@ -292,7 +297,7 @@ dal quale ricevono gli eventuali segnali da tastiera. A tale scopo lo standard POSIX.1 prevede che ad ogni sessione possa essere 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 +di controllo.\footnote{Lo standard POSIX.1 non specifica nulla riguardo l'implementazione; in Linux anch'esso viene mantenuto nella solita struttura \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 @@ -344,21 +349,22 @@ funzione \funcd{tcsetpgrp}, il cui prototipo \noindent la funzione può essere eseguita con successo solo da un processo nella stessa sessione e con lo stesso terminale di controllo. -Come accennato in sez.~\ref{sec:sess_job_control_overview}, tutti i processi (e -relativi raggruppamenti) che non fanno parte del gruppo di \textit{foreground} -sono detti in \textit{background}; se uno si essi cerca di accedere al -terminale di controllo provocherà l'invio da parte del kernel di uno dei due -segnali \const{SIGTTIN} o \const{SIGTTOU} (a seconda che l'accesso sia stato -in lettura o scrittura) a tutto il suo \textit{process group}; dato che il -comportamento di default di questi segnali (si riveda quanto esposto in -sez.~\ref{sec:sig_job_control}) è di fermare il processo, di norma questo -comporta che tutti i membri del gruppo verranno fermati, ma non si avranno -condizioni di errore.\footnote{la shell in genere notifica comunque un - avvertimento, avvertendo la presenza di processi bloccati grazie all'uso di - \func{waitpid}.} Se però si bloccano o ignorano i due segnali citati, le -funzioni di lettura e scrittura falliranno con un errore di \errcode{EIO}. - -Un processo può controllare qual'è il gruppo di \textit{foreground} associato +Come accennato in sez.~\ref{sec:sess_job_control_overview}, tutti i processi +(e relativi raggruppamenti) che non fanno parte del gruppo di +\textit{foreground} sono detti in \textit{background}; se uno si essi cerca di +accedere al terminale di controllo provocherà l'invio da parte del kernel di +uno dei due segnali \const{SIGTTIN} o \const{SIGTTOU} (a seconda che l'accesso +sia stato in lettura o scrittura) a tutto il suo \itindex{process~group} +\textit{process group}; dato che il comportamento di default di questi segnali +(si riveda quanto esposto in sez.~\ref{sec:sig_job_control}) è di fermare il +processo, di norma questo comporta che tutti i membri del gruppo verranno +fermati, ma non si avranno condizioni di errore.\footnote{la shell in genere + notifica comunque un avvertimento, avvertendo la presenza di processi + bloccati grazie all'uso di \func{waitpid}.} Se però si bloccano o ignorano i +due segnali citati, le 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 \funcd{tcgetpgrp}, il cui prototipo è: \begin{functions} \headdecl{unistd.h} \headdecl{termios.h} @@ -394,13 +400,14 @@ corrispondenti segnali (rispettivamente \const{SIGTSTP}, \const{SIGINT}, \const{SIGQUIT} e \const{SIGTERM}, trattati in sez.~\ref{sec:sig_job_control}) a tutti i processi del raggruppamento di \textit{foreground}; in questo modo la shell può gestire il blocco e l'interruzione dei vari comandi. - + + Per completare la trattazione delle caratteristiche del job control legate al terminale di controllo, occorre prendere in considerazione i vari casi legati alla terminazione anomala dei processi, che sono di norma gestite attraverso il segnale \const{SIGHUP}. Il nome del segnale deriva da \textit{hungup}, termine che viene usato per indicare la condizione in cui il terminale diventa -inutilizzabile, (letteralmente sarebbe \textsl{impiccagione}). +inutilizzabile, (letteralmente sarebbe \textsl{impiccagione}). Quando si verifica questa condizione, ad esempio se si interrompe la linea, o va giù la rete o più semplicemente si chiude forzatamente la finestra di @@ -427,26 +434,28 @@ terminale, in assenza di un processo che sia in grado di effettuare il controllo dello stesso. Questa è la situazione in cui si ha quello che viene chiamato un -\textit{orphaned process group}. Lo standard POSIX.1 lo definisce come un -\textit{process group} i cui processi hanno come padri esclusivamente o altri -processi nel raggruppamento, o processi fuori della sessione. Lo standard -prevede inoltre che se la terminazione di un processo fa sì che un -raggruppamento di processi diventi orfano e se i suoi membri sono bloccati, ad -essi vengano inviati in sequenza i segnali di \const{SIGHUP} e -\const{SIGCONT}. +\itindex{process~group~orphaned} \textit{orphaned process group}. Lo standard +POSIX.1 lo definisce come un \itindex{process~group} \textit{process group} i +cui processi hanno come padri esclusivamente o altri processi nel +raggruppamento, o processi fuori della sessione. Lo standard prevede inoltre +che se la terminazione di un processo fa sì che un raggruppamento di processi +diventi orfano e se i suoi membri sono bloccati, ad essi vengano inviati in +sequenza i segnali di \const{SIGHUP} e \const{SIGCONT}. La definizione può sembrare complicata, e a prima vista non è chiaro cosa tutto ciò abbia a che fare con il problema della terminazione del processo di controllo. Consideriamo allora cosa avviene di norma nel \textit{job control}: una sessione viene creata con \func{setsid} che crea anche un -nuovo process group: per definizione quest'ultimo è sempre \textsl{orfano}, -dato che il padre del leader di sessione è fuori dalla stessa e il nuovo -process group contiene solo il leader di sessione. Questo è un caso limite, e -non viene emesso nessun segnale perché quanto previsto dallo standard riguarda -solo i raggruppamenti che diventano orfani in seguito alla terminazione di un -processo.\footnote{l'emissione dei segnali infatti avviene solo nella fase di - uscita del processo, come una delle operazioni legate all'esecuzione di - \func{\_exit}, secondo quanto illustrato in sez.~\ref{sec:proc_termination}.} +nuovo \itindex{process~group} \textit{process group}: per definizione +quest'ultimo è sempre \textsl{orfano}, dato che il padre del leader di +sessione è fuori dalla stessa e il nuovo \textit{process group} +\itindex{process~group} contiene solo il leader di sessione. Questo è un caso +limite, e non viene emesso nessun segnale perché quanto previsto dallo +standard riguarda solo i raggruppamenti che diventano orfani in seguito alla +terminazione di un processo.\footnote{l'emissione dei segnali infatti avviene + solo nella fase di uscita del processo, come una delle operazioni legate + all'esecuzione di \func{\_exit}, secondo quanto illustrato in + sez.~\ref{sec:proc_termination}.} Il leader di sessione provvederà a creare nuovi raggruppamenti che a questo punto non sono orfani in quanto esso resta padre per almeno uno dei processi @@ -521,16 +530,17 @@ indicato dall'amministratore nel file di configurazione del programma, Quando viene lanciato da \cmd{init} il programma parte con i privilegi di amministratore e con un ambiente vuoto; \cmd{getty} si cura di chiamare -\func{setsid} per creare una nuova sessione ed un nuovo process group, e di -aprire il terminale (che così diventa il terminale di controllo della -sessione) in lettura sullo standard input ed in scrittura sullo standard -output e sullo standard error; inoltre effettuerà, qualora servano, ulteriori -settaggi.\footnote{ad esempio, come qualcuno si sarà accorto scrivendo un nome - di login in maiuscolo, può effettuare la conversione automatica dell'input - in minuscolo, ponendosi in una modalità speciale che non distingue fra i due - tipi di caratteri (a beneficio di alcuni vecchi terminali che non - supportavano le minuscole).} Alla fine il programma stamperà un messaggio di -benvenuto per poi porsi in attesa dell'immissione del nome di un utente. +\func{setsid} per creare una nuova sessione ed un nuovo +\itindex{process~group} \textit{process group}, e di aprire il terminale (che +così diventa il terminale di controllo della sessione) in lettura sullo +standard input ed in scrittura sullo standard output e sullo standard error; +inoltre effettuerà, qualora servano, ulteriori settaggi.\footnote{ad esempio, + come qualcuno si sarà accorto scrivendo un nome di login in maiuscolo, può + effettuare la conversione automatica dell'input in minuscolo, ponendosi in + una modalità speciale che non distingue fra i due tipi di caratteri (a + beneficio di alcuni vecchi terminali che non supportavano le minuscole).} +Alla fine il programma stamperà un messaggio di benvenuto per poi porsi in +attesa dell'immissione del nome di un utente. Una volta che si sia immesso il nome di login \cmd{getty} esegue direttamente il programma \cmd{login} con una \func{exevle}, passando come argomento la @@ -549,7 +559,7 @@ o se la password non corrisponde\footnote{il confronto non viene effettuato volta criptato, ed è il risultato che viene confrontato con il valore che viene mantenuto nel database degli utenti.} la richiesta viene ripetuta un certo numero di volte dopo di che \cmd{login} esce ed \cmd{init} provvede a -rilanciare un'altra istanza di \func{getty}. +rilanciare un'altra istanza di \cmd{getty}. Se invece la password corrisponde \cmd{login} esegue \func{chdir} per settare la \textit{home directory} dell'utente, cambia i diritti di accesso al @@ -557,11 +567,11 @@ terminale (con \func{chown} e \func{chmod}) per assegnarne la titolarit all'utente ed al suo gruppo principale, assegnandogli al contempo i diritti di lettura e scrittura. Inoltre il programma provvede a costruire gli opportuni valori per le variabili di ambiente, come \texttt{HOME}, \texttt{SHELL}, ecc. -Infine attraverso l'uso di \func{setuid}, \func{setpid} e \func{initgroups} +Infine attraverso l'uso di \func{setuid}, \func{setgid} e \func{initgroups} verrà cambiata l'identità del proprietario del processo, infatti, come spiegato in sez.~\ref{sec:proc_setuid}, avendo invocato tali funzioni con i privilegi di amministratore, tutti gli user-ID ed i group-ID (reali, effettivi -e salvati) saranno settati a quelli dell'utente. +e salvati) saranno impostati 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) @@ -574,7 +584,7 @@ in sez.~\ref{sec:sess_job_control_overview}. Dato che il processo padre resta sempre \cmd{init} quest'ultimo potrà provvedere, ricevendo un \const{SIGCHLD} all'uscita della shell quando la sessione di lavoro è terminata, a rilanciare \cmd{getty} sul terminale per -ripetere da capo tutto il procedimento. +ripetere da capo tutto il procedimento. @@ -615,10 +625,10 @@ occorrer \begin{enumerate} \item Eseguire una \func{fork} e terminare immediatamente il processo padre proseguendo l'esecuzione nel figlio. In questo modo si ha la certezza che - il figlio non è un \textit{process group leader}, (avrà il \acr{pgid} del - padre, ma un \acr{pid} diverso) e si può chiamare \func{setsid} con - successo. Inoltre la shell considererà terminato il comando all'uscita del - padre. + il figlio non è un \itindex{process~group~leader} \textit{process group + leader}, (avrà il \acr{pgid} del padre, ma un \acr{pid} diverso) e si può + chiamare \func{setsid} con successo. Inoltre la shell considererà terminato + il comando all'uscita del padre. \item Eseguire \func{setsid} per creare una nuova sessione ed un nuovo raggruppamento di cui il processo diventa automaticamente il leader, che però non ha associato nessun terminale di controllo. @@ -830,7 +840,7 @@ devono essere forniti secondo quanto richiesto da \param{format}. L'argomento \param{priority} permette di impostare sia la \textit{facility} che la \textit{priority} del messaggio. In realtà viene prevalentemente usato -per specificare solo quest'ultima in quanto la prima viene di norma +per specificare solo quest'ultima in quanto la prima viene di norma preimpostata con \func{openlog}. La priorità è indicata con un valore numerico\footnote{le \acr{glibc}, seguendo POSIX.1-2001, prevedono otto diverse priorità ordinate da 0 a 7, in ordine di importanza decrescente; @@ -878,7 +888,7 @@ Imposta la maschera dei log al valore specificato. Le routine di gestione mantengono per ogni processo una maschera che determina quale delle chiamate effettuate a \func{syslog} verrà effettivamente registrata. La registrazione viene disabilitata per tutte quelle priorità che -non rientrano nella maschera; questa viene settata usando la macro +non rientrano nella maschera; questa viene impostata usando la macro \macro{LOG\_MASK(p)} dove \code{p} è una delle costanti di tab.~\ref{tab:sess_syslog_priority}. É inoltre disponibile anche la macro \macro{LOG\_UPTO(p)} che permette di specificare automaticamente tutte le @@ -964,7 +974,7 @@ bufferizzazione\footnote{completamente indipendente dalla eventuale ulteriore kernel. \begin{figure}[htb] - \centering \includegraphics[width=13cm]{img/term_struct} + \centering \includegraphics[width=14.5cm]{img/term_struct} \caption{Struttura interna generica di un driver per un terminale.} \label{fig:term_struct} \end{figure} @@ -980,7 +990,7 @@ 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, \const{MAX\_CANON}, +viene ricevuto un a capo; un'altro parametro del sistema, \const{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 @@ -1035,13 +1045,13 @@ prototipo Restituisce il nome del terminale di controllo del processo. \bodydesc{La funzione restituisce il puntatore alla stringa contenente il - pathname del terminale.} + \textit{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 +La funzione scrive il \itindex{pathname}\textit{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 \const{L\_ctermid}\footnote{\const{L\_ctermid} è una delle varie costanti del sistema, non trattata esplicitamente in sez.~\ref{sec:sys_characteristics} che indica la dimensione che deve avere una stringa per poter contenere il @@ -1070,11 +1080,12 @@ ovviamente essere stata allocata in precedenza), e la relativa dimensione, \param{len}; se la stringa che deve essere restituita eccede questa dimensione si avrà una condizione di errore. -Se si passa come argomento \val{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. +Se si passa come argomento \val{NULL} la funzione restituisce il puntatore ad +una stringa statica che può essere sovrascritta da chiamate successive. Si +tenga presente che il \itindex{pathname}\textit{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 \struct{termios}, (la cui definizione è riportata in @@ -1126,7 +1137,7 @@ modificare i bit su cui non si interviene. parità, se non impostato un carattere con errori di parità viene letto come uno \texttt{0x00}. Se un carattere ha il valore \texttt{0xFF} e \const{ISTRIP} - non è settato, per evitare ambiguità esso viene sempre + non è impostato, per evitare ambiguità esso viene sempre riportato come \texttt{0xFF 0xFF}.\\ \const{ISTRIP} & Se impostato i caratteri in input sono tagliati a sette bit mettendo a zero il bit più significativo, altrimenti @@ -1142,7 +1153,7 @@ modificare i bit su cui non si interviene. gruppo in foreground anche l'invio di \const{SIGINT} ai processi di quest'ultimo. Se invece \const{BRKINT} non è impostato un BREAK viene letto come un carattere - NUL, a meno che non sia settato \const{PARMRK} + NUL, a meno che non sia impostato \const{PARMRK} nel qual caso viene letto come la sequenza di caratteri \texttt{0xFF 0x00 0x00}.\\ \const{IGNCR} & Se impostato il carattere di ritorno carrello @@ -1176,7 +1187,7 @@ modificare i bit su cui non si interviene. carattere START. \\ \const{IMAXBEL}& Se impostato fa suonare il cicalino se si riempie la cosa di ingresso; in Linux non è implementato e il kernel si - comporta cose se fosse sempre settato (è una estensione + comporta cose se fosse sempre impostato (è una estensione BSD). \\ \hline \end{tabular} @@ -1416,12 +1427,12 @@ fig.~\ref{fig:term_termios}). \const{TOSTOP} & Se abilitato, con il supporto per il job control presente, genera il segnale \const{SIGTTOU} per un processo in background che cerca di scrivere sul terminale.\\ - \const{XCASE} & Se settato il terminale funziona solo con le + \const{XCASE} & Se impostato il terminale funziona solo con le maiuscole. L'input è convertito in minuscole tranne per i caratteri preceduti da una \verb|\|. In output le maiuscole sono precedute da una \verb|\| e le minuscole convertite in maiuscole.\\ - \const{DEFECHO}& Se impostate effettua l'eco solo se c'è un processo in + \const{DEFECHO}& Se impostato effettua l'eco solo se c'è un processo in lettura.\\ \const{FLUSHO} & Effettua la cancellazione della coda di uscita. Viene attivato dal carattere DISCARD. Non è supportato in @@ -1546,10 +1557,10 @@ codice del tipo: La maggior parte di questi caratteri (tutti tranne \const{VTIME} e \const{VMIN}) hanno effetto solo quando il terminale viene utilizzato in modo canonico; per alcuni devono essere soddisfatte ulteriori richieste, ad esempio -\const{VINTR}, \const{VSUSP}, e \const{VQUIT} richiedono sia settato -\const{ISIG}; \const{VSTART} e \const{VSTOP} richiedono sia settato +\const{VINTR}, \const{VSUSP}, e \const{VQUIT} richiedono sia impostato +\const{ISIG}; \const{VSTART} e \const{VSTOP} richiedono sia impostato \const{IXON}; \const{VLNEXT}, \const{VWERASE}, \const{VREPRINT} richiedono sia -settato \const{IEXTEN}. In ogni caso quando vengono attivati i caratteri +impostato \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 varie impostazioni dei terminali viste finora @@ -1765,7 +1776,7 @@ lette da una struttura \struct{termios} utilizzando altre due funzioni, Anche in questo caso le due funzioni estraggono i valori della velocità della linea da una struttura, il cui indirizzo è specificato dall'argomento \param{termios\_p} che deve essere stata letta in precedenza con -\func{tcgetaddr}. +\func{tcgetattr}. @@ -1785,7 +1796,7 @@ vengono considerate, dal punto di vista dell'accesso al terminale, come delle funzioni di scrittura, pertanto se usate da processi in background sul loro terminale di controllo provocano l'emissione di \const{SIGTTOU} come illustrato in sez.~\ref{sec:sess_ctrl_term}.\footnote{con la stessa eccezione, - già vista per \func{tcsetaddr}, che quest'ultimo sia bloccato o ignorato dal + già vista per \func{tcsetattr}, che quest'ultimo sia bloccato o ignorato dal processo chiamante.} Una prima funzione, che è efficace solo in caso di terminali seriali asincroni @@ -1967,14 +1978,16 @@ 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} +% +% TODO terminali virtuali +% Qui c'è da mettere tutta la parte sui terminali virtuali, e la gestione +% degli stessi +% + Da fare. \subsection{I terminali virtuali}