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
\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 \structd{termios}, che identifica le proprietà di un
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.
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
chiamata a \func{tcgetattr} che essi siano stati eseguiti tutti quanti.
\begin{figure}[!htb]
- \footnotesize
- \begin{lstlisting}{}%
-#include <unistd.h>
-#include <termios.h>
-#include <errno.h>
-
-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}
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.
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
\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