(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
+uno dei due segnali \signal{SIGTTIN} o \signal{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
Un'altra caratteristica del terminale di controllo usata nel job control è che
utilizzando su di esso le combinazioni di tasti speciali (\texttt{C-z},
\texttt{C-c}, \texttt{C-y} e \texttt{C-|}) si farà sì che il kernel invii i
-corrispondenti segnali (rispettivamente \const{SIGTSTP}, \const{SIGINT},
-\const{SIGQUIT} e \const{SIGTERM}, trattati in sez.~\ref{sec:sig_job_control})
+corrispondenti segnali (rispettivamente \signal{SIGTSTP}, \signal{SIGINT},
+\signal{SIGQUIT} e \signal{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},
+il segnale \signal{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}).
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
terminale su cui si stava lavorando, il kernel provvederà ad inviare il
-segnale di \const{SIGHUP} al processo di controllo. L'azione preimpostata in
+segnale di \signal{SIGHUP} al processo di controllo. L'azione preimpostata in
questo caso è la terminazione del processo, il problema che si pone è cosa
accade agli altri processi nella sessione, che non han più un processo di
controllo che possa gestire l'accesso al terminale, che potrebbe essere
Lo standard POSIX.1 prevede che quando il processo di controllo termina, che
ciò avvenga o meno per un \textit{hungup} del terminale (ad esempio si
potrebbe terminare direttamente la shell con \cmd{kill}) venga inviato un
-segnale di \const{SIGHUP} ai processi del raggruppamento di foreground. In
+segnale di \signal{SIGHUP} ai processi del raggruppamento di foreground. In
questo modo essi potranno essere avvisati che non esiste più un processo in
grado di gestire il terminale (di norma tutto ciò comporta la terminazione
anche di questi ultimi).
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}.
+sequenza i segnali di \signal{SIGHUP} e \signal{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
group creati direttamente dal leader di sessione (a meno di non aver spostato
con \func{setpgid} un processo da un gruppo ad un altro, cosa che di norma non
viene fatta) i quali riceveranno, nel caso siano bloccati, i due segnali;
-\const{SIGCONT} ne farà proseguire l'esecuzione, ed essendo stato nel
-frattempo inviato anche \const{SIGHUP}, se non c'è un gestore per
+\signal{SIGCONT} ne farà proseguire l'esecuzione, ed essendo stato nel
+frattempo inviato anche \signal{SIGHUP}, se non c'è un gestore per
quest'ultimo, i processi bloccati verranno automaticamente terminati.
che permetta l'accesso ad un terminale. Uno schema di massima della procedura
è riportato in fig.~\ref{fig:sess_term_login}.
-\begin{figure}[htb]
- \centering
- \includegraphics[width=13cm]{img/tty_login}
+\begin{figure}[!htb]
+ \centering \includegraphics[width=13cm]{img/tty_login}
\caption{Schema della procedura di login su un terminale.}
\label{fig:sess_term_login}
\end{figure}
\texttt{HOME}, \texttt{SHELL}, ecc. 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 impostati a quelli
+invocato tali funzioni con i privilegi di amministratore, tutti gli \acr{uid}
+ed i \acr{gid} (reali, effettivi e salvati) saranno impostati a quelli
dell'utente.
A questo punto \cmd{login} provvederà (fatte salve eventuali altre azioni
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
+provvedere, ricevendo un \signal{SIGCHLD} all'uscita della shell quando la
sessione di lavoro è terminata, a rilanciare \cmd{getty} sul terminale per
ripetere da capo tutto il procedimento.
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{15cm}
+ \begin{minipage}[c]{\textwidth}
\includestruct{listati/printk_prio.c}
\end{minipage}
\normalsize
dalla eventuale ulteriore bufferizzazione fornita dall'interfaccia standard
dei file.}
-\begin{figure}[htb]
+\begin{figure}[!htb]
\centering \includegraphics[width=14.5cm]{img/term_struct}
\caption{Struttura interna generica di un driver per un terminale.}
\label{fig:term_struct}
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{15cm}
+ \begin{minipage}[c]{\textwidth}
\includestruct{listati/termios.h}
\end{minipage}
\normalsize
\const{IGNBRK} non è impostato. Se \const{BRKINT} è
impostato il BREAK causa lo scarico delle code,
e se il terminale è il terminale di controllo per un
- gruppo in foreground anche l'invio di \const{SIGINT} ai
+ gruppo in foreground anche l'invio di \signal{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 impostato \const{PARMRK}
\const{O\_NOBLOCK} si bloccherà il processo finché
non si è stabilita una connessione con il modem; inoltre
se viene rilevata una disconnessione viene inviato un
- segnale di \const{SIGHUP} al processo di controllo del
+ segnale di \signal{SIGHUP} al processo di controllo del
terminale. La lettura su un terminale sconnesso comporta
una condizione di \textit{end of file} e la scrittura un
errore di \errcode{EIO}.\\
attivato dal carattere DISCARD. Non è presente in POSIX e
non è supportato da Linux.\\
\const{NOFLSH} & Se impostato disabilita lo scarico delle code di ingresso
- e uscita quando vengono emessi i segnali \const{SIGINT},
- \const{SIGQUIT} e \const{SIGSUSP}.\\
+ e uscita quando vengono emessi i segnali \signal{SIGINT},
+ \signal{SIGQUIT} e \signal{SIGSUSP}.\\
\const{TOSTOP} & Se abilitato, con il supporto per il job control presente,
- genera il segnale \const{SIGTTOU} per un processo in
+ genera il segnale \signal{SIGTTOU} per un processo in
background che cerca di scrivere sul terminale.\\
\const{PENDIN} & Indica che la linea deve essere ristampata, viene
attivato dal carattere REPRINT e resta attivo fino alla
\hline
\const{VINTR} &\texttt{0x03}&(\texttt{C-c})& Carattere di interrupt,
provoca l'emissione di
- \const{SIGINT}.\\
+ \signal{SIGINT}.\\
\const{VQUIT} &\texttt{0x1C}&(\texttt{C-\bslash})& Carattere di uscita,
provoca l'emissione di
- \const{SIGQUIT}.\\
+ \signal{SIGQUIT}.\\
\const{VERASE}&\texttt{0x7f}&DEL,\texttt{C-?}& Carattere di ERASE, cancella
l'ultimo carattere
precedente nella linea.\\
START.\\
\const{VSUSP} &\texttt{0x1A}&(\texttt{C-z})& Carattere di
sospensione. Invia il segnale
- \const{SIGTSTP}.\\
+ \signal{SIGTSTP}.\\
\const{VDSUSP}&\texttt{0x19}&(\texttt{C-y})& Carattere di sospensione
ritardata. Invia il segnale
- \const{SIGTSTP} quando il
+ \signal{SIGTSTP} quando il
carattere viene letto dal
programma, (non presente in
POSIX e non riconosciuto in
\func{tcsetattr} invece effettua la scrittura delle impostazioni e quando
viene invocata sul proprio terminale di controllo può essere eseguita con
successo solo da un processo in foreground. Se invocata da un processo in
-background infatti tutto il gruppo riceverà un segnale di \const{SIGTTOU} come
+background infatti tutto il gruppo riceverà un segnale di \signal{SIGTTOU} come
se si fosse tentata una scrittura, a meno che il processo chiamante non abbia
-\const{SIGTTOU} ignorato o bloccato, nel qual caso l'operazione sarà eseguita.
+\signal{SIGTTOU} ignorato o bloccato, nel qual caso l'operazione sarà eseguita.
La funzione \func{tcsetattr} prevede tre diverse modalità di funzionamento,
specificabili attraverso l'argomento \param{optional\_actions}, che permette
effettuano più cambiamenti è buona norma controllare con una ulteriore
chiamata a \func{tcgetattr} che essi siano stati eseguiti tutti quanti.
-\begin{figure}[!htb]
+\begin{figure}[!htbp]
\footnotesize \centering
- \begin{minipage}[c]{15cm}
+ \begin{minipage}[c]{\codesamplewidth}
\includecodesample{listati/SetTermAttr.c}
\end{minipage}
\normalsize
(\texttt{\small 13}), notificando un eventuale errore (\texttt{\small 14-15})
o uscendo normalmente.
-\begin{figure}[!htb]
+\begin{figure}[!htbp]
\footnotesize \centering
- \begin{minipage}[c]{15cm}
+ \begin{minipage}[c]{\codesamplewidth}
\includecodesample{listati/UnSetTermAttr.c}
\end{minipage}
\normalsize
l'effetto sarà quello di rendere la sua velocità identica a quella della linea
di output.
+Dato che in genere si imposta sempre la stessa velocità sulle linee di uscita
+e di ingresso è supportata anche la funzione \funcd{cfsetspeed}, una
+estensione di BSD,\footnote{la funzione origina da 4.4BSD e richiede sua
+ definita la macro \macro{\_BSD\_SOURCE}.} il cui prototipo è:
+\begin{functions}
+ \headdecl{unistd.h}
+ \headdecl{termios.h}
+ \funcdecl{int cfsetspeed(struct termios *termios\_p, speed\_t speed)}
+ Imposta la velocità delle linee seriali.
+
+ \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
+ errore, che avviene solo quando il valore specificato non è valido.}
+\end{functions}
+\noindent la funzione è identica alle due precedenti ma imposta la stessa
+velocità sia per la linea di ingresso che per quella di uscita.
+
Analogamente a quanto avviene per l'impostazione, le velocità possono essere
lette da una struttura \struct{termios} utilizzando altre due funzioni,
\funcd{cfgetispeed} e \funcd{cfgetospeed}, i cui prototipi sono:
\param{termios\_p} che deve essere stata letta in precedenza con
\func{tcgetattr}.
+Infine sempre da BSD è stata ripresa una funzione che consente di impostare il
+teminale in una modalità analoga all cosiddetta modalità ``\textit{raw}'' di
+System V, in cui i dati in input vengono resi disponibili un carattere alla
+volta, e l'echo e tutte le interpretazioni dei caratteri in entrata e uscita
+sono disabilitate. La funzione è \funcd{cfmakeraw} ed il suo prototipo è:
+\begin{functions}
+ \headdecl{unistd.h}
+ \headdecl{termios.h}
+ \funcdecl{void cfmakeraw(struct termios *termios\_p)}
+ Importa il terminale in modalità ``\textit{raw}'' alla System V.
+
+ \bodydesc{La funzione imposta solo i valori in \param{termios\_p}, e non
+ sono previste condizioni di errore.}
+\end{functions}
+
+Anche in questo caso la funzione si limita a preparare i valori che poi
+saranno impostato con una successiva chiamata a \func{tcsetattr}, in sostanza
+la funzione è equivalente a:
+\includecodesnip{listati/cfmakeraw.c}
\subsection{La gestione della disciplina di linea.}
ingresso ed uscita e le relative code. In generale tutte queste funzioni
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
+terminale di controllo provocano l'emissione di \signal{SIGTTOU} come
illustrato in sez.~\ref{sec:sess_ctrl_term}.\footnote{con la stessa eccezione,
già vista per \func{tcsetattr}, che quest'ultimo sia bloccato o ignorato dal
processo chiamante.}