Neuer Abschnitt: Auf Tastendruck warten

This commit is contained in:
rschaten 2005-10-04 10:58:56 +00:00
parent 50ed10a887
commit 84abd69c4a

View File

@ -388,10 +388,10 @@ kill $watchdogpid > /dev/null 2>&1
exit 0
\end{lstlisting}
Dann wird durch ein \texttt{wait}\index{wait} darauf gewartet, daß sich der
überwachte Prozeß beendet. Dabei würde \texttt{wait} bis in alle Ewigkeit
warten, wäre da nicht der Watchdog in der Subshell. Wenn dem die Ausführung zu
lange dauert, sorgt er dafür daß der Prozeß beendet wird.
Dann wird durch ein \texttt{wait}\index{wait=\texttt{wait}} darauf gewartet,
daß sich der überwachte Prozeß beendet. Dabei würde \texttt{wait} bis in alle
Ewigkeit warten, wäre da nicht der Watchdog in der Subshell. Wenn dem die
Ausführung zu lange dauert, sorgt er dafür daß der Prozeß beendet wird.
Kommt der überwachte Prozeß aber rechtzeitig zurück, sorgt \texttt{kill} in
Zeile 8 dafür daß der Wachhund `eingeschläfert' wird.
@ -399,3 +399,36 @@ Zeile 8 daf
Auf diese Weise ist sichergestellt, daß der \texttt{ping} auf keinen Fall
länger als fünf Sekunden läuft.
\section{Unter Druck: Auf Tasten warten}\label{tastendruck}\index{Tastendruck}
Oft baut man in längere Ausgaben eine Art Warte-Prompt im Stile von `Bitte
Enter drücken um fortzufahren' ein. Gewartet wird dann mit Hilfe des
\texttt{read}-Kommandos\index{read=\texttt{read}}.
Will man nicht nur auf den Druck der Enter-Taste reagieren, sondern auf einen
beliebigen Tastendruck, eignet sich das folgende Konstrukt:
\begin{lstlisting}
stty raw -echo
inputchar=`dd if=/dev/tty bs=1 count=1 2> /dev/null`
stty sane
\end{lstlisting}
Zur Erklärung: Mit dem Kommando \texttt{stty}\index{stty=\texttt{stty}} kann
ein Terminal konfiguriert werden. Dabei kann es sich sowohl um eine Leitung wie
die serielle Schnittstelle des Rechners handeln, als auch um das Terminal an
dem der Benutzer sitzt. Jedes Terminal hat eine Reihe von Eigenschaften.
Mittels \lstinline|stty raw -echo| wird das Terminal in einen passenden Modus
geschaltet. Das \texttt{-echo} sorgt dafür, daß eingegebene Zeichen nicht in
der Konsole wiedergegeben werden.
Danach wird mit \texttt{dd}\index{dd=\texttt{dd}} genau ein Zeichen eingelesen.
Die Fehlerausgabe von \texttt{dd} wird dabei nach /dev/null umgeleitet, da
ansonsten auf der Konsole die Erfolgsmeldungen \textit{1+0 Datensätze ein, 1+0
Datensätze aus} erscheinen würden. Das gelesene Zeichen wird in der Variablen
\texttt{\$inputchar} gesichert und steht somit zur Verfügung.
Nach dem Einlesevorgang wird die Konsole schließlich mittels
\lstinline|stty sane| wieder in einen benutzbaren Zustand zurückversetzt.