5 Stimmen

was, wenn _POSIX_VDISABLE den Wert -1 hat?

In POSIX _POSIX_VDISABLE Wert, wenn -1, gibt es keine Sperrung Zeichen für spezielle Zeichen für alle Terminal-Gerät Dateien; andernfalls ist der Wert der Sperrung Zeichen Wert.

Kann mir bitte jemand helfen, dies zu verstehen? Ich bin nicht in der Lage, die genaue Bedeutung davon zu verstehen.

Bitte

4voto

George Koehler Punkte 1410

Mein Terminal verfügt über Sondertasten, wie ^C zur Unterbrechung, ^\ zum Dump des Kerns, ^W zum Löschen eines Wortes und ^U zum Löschen einer Zeile. Sondertasten gibt es in xterm und anderen Terminalemulatoren, aber sie sind nicht in jedem Terminal gleich. POSIX-Anwendungen können tcgetattr() oder tcsetattr() in <termios.h> aufrufen, um diese Sondertasten zu erhalten oder zu setzen. Sie können auch einige Tasten deaktivieren, zum Beispiel:

tcgetattr(fd, tp);
tp->c_lflag &= ~ISIG;                /* disable all the signal keys */
tp->c_cc[WERASE] = _POSIX_VDISABLE;  /* disable the word-erase key */
tcsetattr(fd, tp);

Vor POSIX.1-2001 war die Unterstützung für _POSIX_VDISABLE optional. Es gab 3 Möglichkeiten:

  • _POSIX_VDISABLE wurde definiert und nicht -1. Dann kann jedes Terminal _POSIX_VDISABLE verwenden, um eine spezielle Taste zu deaktivieren.
  • _POSIX_VDISABLE definiert wurde und -1. Dann kann kein Terminal _POSIX_VDISABLE verwenden.
  • _POSIX_VDISABLE war nicht definiert. Dann könnte der Wert zum Deaktivieren einer speziellen Taste für jedes Terminal unterschiedlich sein. Ein Aufruf wie pathconf("/dev/tty", _PC_VDISABLE) würde den Wert für dieses Terminal zurückgeben, oder -1, wenn dieses Terminal keinen Wert zum Deaktivieren einer speziellen Taste hat.

Als Systeme <termios.h> hinzufügten, haben alle oder fast alle Systeme _POSIX_VDISABLE definiert und nicht -1. Ich habe mir einige alte Systeme in der Unix-Baum . Alle Minix 1.5 (1989), Linux 0.96c (1992) und 4.4BSD (1993) haben _POSIX_VDISABLE definiert und nicht -1. (Vor POSIX gab es <termios.h> nicht, und die Systeme benutzten einen anderen Header wie <sgtty.h>, um das Terminal zu konfigurieren).

POSIX-1.2001 verlangt lediglich, dass _POSIX_VDISABLE definiert ist und nicht -1. POSIX.1-2001 sagte für <unistd.h> ,

_POSIX_VDISABLE

Dieses Symbol ist als Wert eines Zeichens zu definieren, das die Behandlung von Sonderzeichen am Terminal gemäß der Beschreibung in <termios.h> . Dieses Symbol muss immer auf einen anderen Wert als -1 gesetzt werden.

In der Begründung heißt es ,

Als Teil der Überarbeitung wurden die Optionen an das FIPS 151-2 Profil des POSIX.1-1990 Standards angepasst. Die folgenden Optionen des POSIX.1-1990-Standards sind nun obligatorisch:

  • _POSIX_JOB_CONTROL
  • _POSIX_SAVED_IDS
  • _POSIX_VDISABLE

3voto

VonC Punkte 1117238

Wenn Sie sich die Definition von Sonderzeichen sollte das bedeuten (mit dem Wert '-1'), dass alle diese Sonderzeichen aktiv sind:

Bei der kanonischen Eingabe erkennt der Terminaltreiber eine Reihe von Sonderzeichen, die verschiedene Steuerfunktionen erfüllen.
Dazu gehören die ERASE Zeichen (normalerweise DEL ) für die Bearbeitung von Eingaben und andere Bearbeitungszeichen.
Das INTR-Zeichen (normalerweise Ctrl - c ) zum Senden einer SIGINT Signal und andere signalgebende Zeichen können sowohl im kanonischen als auch im nicht-kanonischen Eingabemodus verfügbar sein.

Und Sie haben eine Menge dieser speziellen Charaktere:


Es wurde die Frage aufgeworfen, ob ein solcher Wert war übertragbar (hat immer kompiliert) im Jahr 1997:

Die Formulierung in Abschnitt 2.9.4:

Wenn eine der Konstanten in Tabelle 2-11 mit dem Wert -1 in der Kopfzeile .... definiert ist.

kann beim flüchtigen Lesen folgenden Code vorschlagen, um die Größe zu minimieren und die Effizienz für jede Implementierung zu optimieren:

#ifdef _POSIX_VDISABLE
#if    _POSIX_VDISABLE == -1
    /* code that assumes no vdisable capability */
#else
    /* code that assumes vdisable capability */
#endif
#else
    /* code that uses pathconf() to determine vdisable capability */
#endif

En Dolmetschen #34 legt nahe, dass dies der Fall sein wird.

Durch die Verwendung dieser Werte zum COMPILE-TIME kann eine portable POSIX.1-Anwendung das Laden des gesamten pathconf()-bezogenen Codes vermeiden, der mit einem Symbol in Tabelle 2-11 verbunden ist, wenn das Symbol definiert wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X