Что если значение _POSIX_VDISABLE равно -1?

В значении POSIX _POSIX_VDISABLE, если -1, нет символа отключения для специального символа для всех файлов оконечного устройства; в противном случае значение является отключающим символьным значением.

Может кто-нибудь, пожалуйста, помогите мне понять это. Я не могу понять точное значение этого.

пожалуйста

2 ответа

Решение

Если вы посмотрите на определение специальных символов, это должно означать (значение "-1"), что все эти специальные символы активны:

При каноническом вводе драйвер терминала распознает ряд специальных символов, которые выполняют различные функции управления.
К ним относятся ERASE символ (обычно DEL) для редактирования ввода и других символов редактирования.
Символ INTR (обычно Ctrl-c) для отправки SIGINT сигнал и другие повышающие сигналы символы могут быть доступны как в каноническом, так и в неканоническом режиме ввода.

И у вас есть много таких персонажей:


Был задан вопрос, было ли такое значение переносимым (всегда компилировалось) в 1997 году:

Формулировка в разделе 2.9.4:

Если любая из констант в Таблице 2-11 определена, чтобы иметь значение -1 в заголовке....

При случайном чтении может предложить код, подобный следующему, чтобы минимизировать размер и оптимизировать эффективность для каждой реализации:

#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

Интерпретация #34 предполагает, что так и будет.

Используя эти значения в COMPILE-TIME, переносимое приложение POSIX.1 может избежать загрузки всего кода, связанного с pathconf(), связанного с символом в таблице 2-11, когда символ определен.

В моем терминале есть специальные ключи, такие как ^C для прерывания, ^\ для сброса ядра, ^W для удаления слова и ^U для удаления строки. Специальные ключи существуют в xterm и других эмуляторах терминала, но они не одинаковы в каждом терминале. Приложения POSIX могут вызывать tcgetattr() или tcsetattr() в , чтобы получить или установить эти специальные ключи. Они также могут отключить некоторые ключи, например:

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);

До POSIX.1-2001 поддержка _POSIX_VDISABLE была необязательной. Было 3 варианта:

  • _POSIX_VDISABLE был определен, а не -1. Тогда любой терминал может использовать _POSIX_VDISABLE, чтобы отключить специальный ключ.
  • _POSIX_VDISABLE был определен и равен -1. Тогда ни один терминал не может использовать _POSIX_VDISABLE.
  • _POSIX_VDISABLE не был определен. Тогда значение для отключения специального ключа может быть разным для каждого терминала. Звонок как pathconf("/dev/tty", _PC_VDISABLE) вернет значение для этого терминала, или -1, если этот терминал не имеет значения для отключения специального ключа.

Когда системы добавили , для всех или почти всех систем было определено _POSIX_VDISABLE, а не -1. Я посмотрел на некоторые старые системы в дереве Unix. Во всех Minix 1.5 (1989), Linux 0.96c (1992) и 4.4BSD (1993) определено _POSIX_VDISABLE, а не -1. (До POSIX не существовало, и системы использовали другой заголовок, такой как , для настройки терминала.)

POSIX-1.2001 просто требовал, чтобы _POSIX_VDISABLE был определен, а не -1. POSIX.1-2001 сказал для ;,

_POSIX_VDISABLE

Этот символ должен быть определен как значение символа, который должен отключить обработку специальных символов терминала, как описано в ;. Этот символ всегда должен иметь значение, отличное от -1.

Обоснование гласит:

В рамках пересмотра произошло некоторое согласование опций с профилем FIPS 151-2 по стандарту POSIX.1-1990. Следующие опции из стандарта POSIX.1-1990 теперь являются обязательными:

  • _POSIX_JOB_CONTROL
  • _POSIX_SAVED_IDS
  • _POSIX_VDISABLE
Другие вопросы по тегам