%% session.tex
%%
-%% Copyright (C) 2000-2023 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2000-2025 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 "Un preambolo",
non addirittura le telescriventi). Oggi questa interfaccia viene in genere
emulata o tramite programmi o con le cosiddette console virtuali associate a
monitor e tastiera, ma esiste sempre la possibilità di associarla direttamente
-ad alcuni dispositivi, come eventuali linee seriali, ed in certi casi, come
-buona parte dei dispositivi embedded su cui gira Linux (come router, access
-point, ecc.) questa resta anche l'unica opzione per una \textit{console} di
+a dispositivi specifici come le linee seriali, che in certi casi, come avviene
+per buona parte dei dispositivi embedded su cui gira Linux, come router,
+access point, ecc. sono l'unica opzione per una avere una \textit{console} di
sistema.
sistema è nato prima dell'esistenza di tutto ciò.
Il \textit{job control} è una caratteristica opzionale, introdotta in BSD
-negli anni '80, e successivamente standardizzata da POSIX.1. La sua
+negli anni '80, e successivamente standardizzata da POSIX.1; la sua
disponibilità nel sistema è verificabile attraverso il controllo della macro
\macro{\_POSIX\_JOB\_CONTROL}. In generale il \textit{job control} richiede il
supporto sia da parte della shell (quasi tutte ormai lo hanno), che da parte
\label{sec:sess_login}
L'organizzazione del sistema del job control è strettamente connessa alle
-modalità con cui un utente accede al sistema per dare comandi, collegandosi ad
+modalità con cui un utente accede al sistema per dare comandi collegandosi ad
esso con un terminale, che sia questo realmente tale, come un VT100 collegato
-ad una seriale o virtuale, come quelli associati a schermo e tastiera o ad una
-connessione di rete. Dato che i concetti base sono gli stessi, e dato che alla
-fine le differenze sono nel dispositivo cui il kernel associa i file standard
-(vedi tab.~\ref{tab:file_std_files}) per l'I/O, tratteremo solo il caso
-classico del terminale, in generale nel caso di login via rete o di terminali
-lanciati dall'interfaccia grafica cambia anche il processo da cui ha origine
-l'esecuzione della shell.
+ad una seriale, o virtuale, come quelli associati a schermo e tastiera o ad
+una connessione di rete. Dato che i concetti base sono gli stessi, e dato che
+alla fine le differenze sono nel dispositivo cui il kernel associa i file
+standard (vedi tab.~\ref{tab:file_std_files}) per l'I/O, tratteremo solo il
+caso classico del terminale, in generale nel caso di login via rete o di
+terminali lanciati dall'interfaccia grafica cambia anche il processo da cui ha
+origine l'esecuzione della shell.
Abbiamo già brevemente illustrato in sez.~\ref{sec:intro_kern_and_sys} le
modalità con cui il sistema si avvia, e di come, a partire da \cmd{init},
Tralasciando la descrizione del sistema dei \textit{run level}, (per il quale
si rimanda alla lettura delle pagine di manuale di \cmd{init} e di
-\file{inittab} o alla trattazione in sez.~5.3 di \cite{AGL}) quello che
+\file{inittab} o alla trattazione in sez.~5.4.5 di \cite{AGL}) quello che
comunque viene sempre fatto è di eseguire almeno una istanza di un programma
che permetta l'accesso ad un terminale. Uno schema di massima della procedura
è riportato in fig.~\ref{fig:sess_term_login}.
senza nessun intervento dell'utente, sono normalmente chiamati
\textsl{demoni}, (o \textit{daemons}), nome ispirato dagli omonimi spiritelli
della mitologia greca che svolgevano compiti che gli dei trovavano noiosi, di
-cui parla anche Socrate (che sosteneva di averne uno al suo servizio).
+cui parla anche Socrate, che sosteneva di averne uno al suo servizio.
%TODO ricontrollare, i miei ricordi di filosofia sono piuttosto datati.
Se però si lancia un programma demone dalla riga di comando in un sistema che
-supporta, come Linux, il \textit{job control} esso verrà comunque associato ad
+supporta il \textit{job control} come Linux, esso verrà comunque associato ad
un terminale di controllo e mantenuto all'interno di una sessione, e anche se
può essere mandato in background e non eseguire più nessun I/O su terminale,
si avranno comunque tutte le conseguenze che abbiamo trattato in
le modalità con cui queste azioni vengono realizzate dipendono ovviamente dal
demone che si usa, per la gestione del quale si rimanda ad un testo di
amministrazione di sistema.\footnote{l'argomento è ad esempio coperto dal
- capitolo 3.2.3 si \cite{AGL}.}
+ capitolo 3.2.3 di \cite{AGL}.}
La \acr{glibc} definisce una serie di funzioni standard con cui un processo
può accedere in maniera generica al servizio di \textit{syslog}, che però
\label{sec:sess_terminal_io}
Benché come ogni altro dispositivo i terminali siano accessibili come file,
-essi hanno assunto storicamente, essendo stati a lungo l'unico modo di
-accedere al sistema, una loro rilevanza specifica, che abbiamo già avuto modo
-di incontrare nella precedente sezione.
+essendo stati a lungo l'unico modo di accedere al sistema essi hanno assunto
+storicamente una loro rilevanza specifica, che abbiamo già avuto modo di
+incontrare nella precedente sezione.
Esamineremo qui le peculiarità dell'I/O eseguito sui terminali, che per la
loro particolare natura presenta delle differenze rispetto ai normali file su
Per capire le caratteristiche dell'I/O sui terminali occorre esaminare le
modalità con cui esso viene effettuato. L'accesso, come per tutti i
dispositivi, viene gestito dal kernel, ma per tutti i terminali viene
-utilizzata una architettura generica che si è schematizzata in
-fig.~\ref{fig:term_struct}.
+utilizzata una architettura generica che si è schematizzata in maniera
+semplificata in fig.~\ref{fig:term_struct}.
Ad ogni terminale sono sempre associate due code
per gestire l'input e l'output, che ne implementano una bufferizzazione
richiede che venga restituito un errore di \errcode{ENOTTY}.
Per evitare l'errore, ed anche semplicemente per verificare se un file
-descriptor corrisponde ad un terminale, è disponibile la funzione
-\funcd{isatty}, il cui prototipo è:
+descriptor corrisponde ad un terminale (cosa che viene fatta da alcuni
+programmi quando richiedono l'immissione di una password), è disponibile la
+funzione \funcd{isatty}, il cui prototipo è:
\begin{funcproto}{
\fhead{unistd.h}
altrimenti, nel qual caso \var{errno} assumerà uno dei valori:
\begin{errlist}
\item[\errcode{EBADF}] \param{fd} non è un file descriptor valido.
- \item[\errcode{EINVAL}] \param{fd} non è associato a un terminale (non
- ottempera a POSIX.1-2001 che richiederebbe \errcode{ENOTTY}).
+ \item[\errcode{ENOTTY}] \param{fd} non è associato a un terminale (alcune
+ vecchie versioni del kernel restituiscono \errcode{EINVAL} che non
+ ottempera a POSIX.1-2001).
\end{errlist}
}
\end{funcproto}
-Un'altra funzione per avere informazioni su un terminale è \funcd{ttyname},
+Una seconda funzione per avere informazioni su un terminale è \funcd{ttyname},
che permette di ottenere il nome del file di dispositivo del terminale
associato ad un file descriptor; il suo prototipo è:
I vari attributi associati ad un terminale vengono mantenuti per ciascuno di
essi in una struttura \struct{termios} che viene usata dalle varie funzioni
dell'interfaccia. In fig.~\ref{fig:term_termios} si sono riportati tutti i
-campi della definizione di questa struttura 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
+campi della definizione di questa struttura usata in Linux;\footnote{la
+ definizione della struttura si trova in \file{bits/termios-struct.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, \var{c\_line} per indicare la
- disciplina di linea.}
+ disciplina di linea.} di questi solo i primi quattro flag ed il successivo
+\texttt{c\_cc} sono previsti dallo standard POSIX.1, ma le varie
+implementazioni ne aggiungono degli altri per mantenere ulteriori informazioni.
\begin{figure}[!htb]
\footnotesize \centering
\end{table}
Il primo flag, mantenuto nel campo \var{c\_iflag}, è detto \textsl{flag di
- input} e controlla le modalità di funzionamento dell'input dei caratteri sul
-terminale, come il controllo di parità, il controllo di flusso, la gestione
-dei caratteri speciali; un elenco dei vari bit, del loro significato e delle
-costanti utilizzate per identificarli è riportato in
-tab.~\ref{tab:sess_termios_iflag}.
-
-Si noti come alcuni di questi flag (come quelli per la gestione del flusso)
-fanno riferimento a delle caratteristiche che ormai sono completamente
-obsolete; la maggior parte inoltre è tipica di terminali seriali, e non ha
-alcun effetto su dispositivi diversi come le console virtuali o gli
-pseudo-terminali usati nelle connessioni di rete.
+ input} e controlla le modalità con cui viene gestita l'immissione dei
+caratteri sul terminale, per funzionalità come il controllo di parità, il
+controllo di flusso, la gestione dei caratteri speciali; un elenco dei vari
+bit che compongono il flag, del loro significato e delle costanti utilizzate
+per identificarli è riportato in tab.~\ref{tab:sess_termios_iflag}.
+
+Si noti come alcuni di questi flag (come quelli relativi al controllo di
+gestione del flusso) fanno riferimento a delle caratteristiche dei terminali
+che ormai sono completamente obsolete; la maggior parte inoltre è tipica dei
+terminali seriali, e non ha alcun effetto su dispositivi diversi come le
+console virtuali sullo schermo o gli pseudo-terminali usati nelle connessioni
+di rete.
Il secondo flag, mantenuto nel campo \var{c\_oflag}, è detto \textsl{flag di
- output} e controlla le modalità di funzionamento dell'output dei caratteri,
-come l'impacchettamento dei caratteri sullo schermo, la traslazione degli a
-capo, la conversione dei caratteri speciali; un elenco dei vari bit, del loro
-significato e delle costanti utilizzate per identificarli è riportato in
-tab.~\ref{tab:sess_termios_oflag}, di questi solo \const{OPOST} era previsto
-da POSIX.1, buona parte degli altri sono stati aggiunti in POSIX.1-2001,
-quelli ancora assenti sono stati indicati esplicitamente.
+ output} e controlla le modalità con cui viene gestito il funzionamento dei
+caratteri scritti sul terminale, come l'impacchettamento dei caratteri sullo
+schermo, la traslazione degli a capo, la conversione dei caratteri speciali.
+Un elenco dei vari bit, del loro significato e delle costanti utilizzate per
+identificarli è stato riportato in tab.~\ref{tab:sess_termios_oflag}, di
+questi soltanto \const{OPOST} era previsto da POSIX.1, buona parte degli altri
+flag sono stati aggiunti in POSIX.1-2001, quelli ancora assenti sono stati
+indicati esplicitamente.
\begin{table}[!htb]
\footnotesize
\end{table}
Si noti come alcuni dei valori riportati in tab.~\ref{tab:sess_termios_oflag}
-fanno riferimento a delle maschere di bit; essi infatti vengono utilizzati per
-impostare alcuni valori numerici relativi ai ritardi nell'output di alcuni
-caratteri: una caratteristica originaria dei primi terminali su telescrivente,
-che avevano bisogno di tempistiche diverse per spostare il carrello in
-risposta ai caratteri speciali, e che oggi sono completamente in disuso.
-
-Si tenga presente inoltre che nel caso delle maschere il valore da inserire in
-\var{c\_oflag} deve essere fornito avendo cura di cancellare prima tutti i bit
-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:
+fanno riferimento non a bit singoli, ma a delle maschere di bit; essi infatti
+vengono utilizzati per impostare alcuni valori numerici relativi ai ritardi da
+applicare alla scrittura sul terminale di alcuni caratteri: si tratta di una
+caratteristica originaria dei primi terminali su telescrivente, che avevano
+bisogno di tempistiche diverse per spostare il carrello in risposta ai
+caratteri speciali, e che oggi sono completamente in disuso.
+
+Si tenga presente inoltre che nel caso si utilizzi una di queste maschere di
+bit il valore da inserire in \var{c\_oflag} deve essere fornito avendo cura di
+cancellare prima tutti i bit 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:
\includecodesnip{listati/oflag.c}
impostare i caratteri speciali associati alle varie funzioni di controllo. Il
numero di questi caratteri speciali è indicato dalla costante \constd{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.}
+altri; in Linux il valore della costante è 32, anche se i caratteri
+effettivamente definiti sono solo 17.
\begin{table}[!htb]
\footnotesize
\begin{verbatim}
B0 B50 B75 B110 B134 B150 B200
B300 B600 B1200 B1800 B2400 B4800 B9600
- B19200 B38400 B57600 B115200 B230400 B460800
+ B19200 B38400 B57600 B115200 B230400 B460800 B460800
+ B500000 B576000 B921600 B1000000 B1152000 B1500000 B2000000
\end{verbatim}
Un terminale può utilizzare solo alcune delle velocità possibili, le funzioni
Qui vanno spiegati i terminali virtuali, \file{/dev/pty} e compagnia.
% vedi man pts
-% vedi
\subsection{Allocazione dei terminali virtuali}
% vedi http://lwn.net/Articles/688809/,
% http://man7.org/linux/man-pages/man3/ptsname.3.html
+% vedi
+% https://stackoverflow.com/questions/77231881/how-to-turn-a-pty-shell-into-a-remote-shell
+% https://gist.github.com/zmwangx/2bac2af9195cad47069419ccd9ee98d8
+% https://www.uninformativ.de/blog/postings/2018-02-24/0/POSTING-en.html
+% https://cpp.hotexamples.com/it/examples/-/-/openpty/cpp-openpty-function-examples.html
% TODO materiale sulle seriali
% vedi http://www.easysw.com/~mike/serial/serial.html
% TODO materiale generico sul layer TTY
% vedi http://www.linusakesson.net/programming/tty/index.php
-% LocalWords: kernel multitasking job control BSD POSIX shell sez group
+% LocalWords: kernel multitasking job control BSD POSIX shell sez group SysV
% LocalWords: foreground process bg fg waitpid WUNTRACED pgrp session sched
% LocalWords: struct pgid sid pid ps getpgid getpgrp unistd void errno int
% LocalWords: ESRCH getsid glibc system call XOPEN SOURCE EPERM setpgrp EACCES
% LocalWords: closelog dmesg sysctl klogctl sys ERESTARTSYS ConsoleKit to CoPy
% LocalWords: loglevel message libc klog mydmesg CAP ADMIN LXC pipelining UID
% LocalWords: TIOCSPGRP GID IUTF UTF LOBLK NONBLOCK CMSPAR MARK VDSUSP VSTATUS
-% LocalWords: cfsetspeed raw cfmakeraw
+% LocalWords: cfsetspeed raw cfmakeraw dell'I SVr l'I
%%% Local Variables:
%%% mode: latex