Что если значение _POSIX_VDISABLE равно -1?
В значении POSIX _POSIX_VDISABLE, если -1, нет символа отключения для специального символа для всех файлов оконечного устройства; в противном случае значение является отключающим символьным значением.
Может кто-нибудь, пожалуйста, помогите мне понять это. Я не могу понять точное значение этого.
пожалуйста
2 ответа
Если вы посмотрите на определение специальных символов, это должно означать (значение "-1"), что все эти специальные символы активны:
При каноническом вводе драйвер терминала распознает ряд специальных символов, которые выполняют различные функции управления.
К ним относятсяERASE
символ (обычно DEL) для редактирования ввода и других символов редактирования.
Символ INTR (обычно Ctrl-c) для отправкиSIGINT
сигнал и другие повышающие сигналы символы могут быть доступны как в каноническом, так и в неканоническом режиме ввода.
И у вас есть много таких персонажей:
- Символы для редактирования ввода
- BSD Расширения для редактирования символов
- Символы, которые вызывают сигналы
- Специальные символы для управления потоком
- Другие специальные персонажи
Был задан вопрос, было ли такое значение переносимым (всегда компилировалось) в 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-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