2014-12-28 2 views
3

Страница человек находится здесь: http://man.cat-v.org/unix-6th/3/ttynЧто возвращает функция ttyn (3)?

Этот пример:

if (ttyn(0) = 'x'){ 
... 
} 

Страница человек говорит «х возвращается, если указанный файл не соответствует машинке

Указанным файлом будет аргумент 0, так что стандартный вход, правильно?

А что такое пишущая машинка? Моя клавиатура?

Что вы проверяете этой линией?

if (ttyn(0) = 'x') 

ответ

7

В этот момент времени, пишущая машинка (или телетайпы, или терминал) была терминалом RS-232 подключен к компьютеру через последовательный порт. Записи устройства в /dev, соответствующие этим портам, были названы /dev/tty0, /dev/tty1, /dev/ttya и т. Д. Каждый из этих файлов был специальным символом специального файла, в отличие от обычного файла.

Когда терминал был обнаружен системой, как правило, путем включения или подключения через модем, процесс init открыл устройство в дескрипторах файлов 0, 1 и 2 в новом процессе, и эти файловые дескрипторы сохранялись через процесс входа в систему, оболочку пользователя и любые процессы, выложенные из оболочки.

Как вы сказали в своем вопросе, файловый дескриптор 0 также называется стандартным входом.

ttyn функция вызывает fstat на его аргумент, который возвращает некоторую информацию о файле, например его номер индексного дескриптора, разрешения и т.д. ttyn затем читает через /dev, глядя на каждый файл, который начинается с "tty", чтобы увидеть, какой из них имеет тот же номер inode, что и аргумент ttyn. Когда он находит совпадение, он возвращает 4-й символ имени файла, который будет '0', '1', 'a' и т. Д. Если совпадений не найдено, он возвращает 'x'.

На PDP-11 обычно были консоль и несколько 8-портовых последовательных интерфейсов. поэтому не было ttyx. И вы могли бы назвать устройства в /dev чем угодно. Поэтому было легко избежать /dev/ttyx, являющегося фактическим устройством.

Такие как goto могут использовать ttyn(0) != 'x', чтобы определить, действительно ли пользователь набрал команду на терминале.


Here файл по умолчанию конфигурации, /etc/ttys, используемый init в V6. Консоль была tty8.

В версии V7 Unix функциональность ttyn была заменена на ttyname, которая может содержать более длинные имена устройств и isatty, которые вернулись, если дескриптор флешки был терминальным устройством. Команда goto отсутствовала в V7.

+0

вы сказали: «... чтобы определить, действительно ли пользователь набрал команду на терминале». Но почему вы хотите это определить? Есть ли проблемы, если пользователь набрал его на что-нибудь еще? – Joey

+1

@Kevin Не все файловые операции работают одинаково на обычных файлах и терминальных устройствах. В частности, терминальное устройство не имеет указателя чтения/записи, который можно перемещать назад. Команда 'goto' работает, возвращаясь к началу своего стандартного ввода и чтения, пока не найдет определенную строку. Это нормально работает, если стандартный ввод является сценарием оболочки, но не будет работать очень хорошо, если стандартный ввод является терминалом. Он просто дождался, когда пользователь наберет строку типа ': target'. Поэтому 'goto' проверяет, является ли стандартный ввод терминалом, и отказывается продолжать, если это так. –

+0

Теперь все понятно :) Большое спасибо! Хорошего дня :) – Joey

0

Я никогда раньше не видел этот библиотечный вызов; Я привык к более знакомым ttyname. Веб-страница не дает возвращаемого значения, но в зависимости от того, что текст говорит, это дало бы последнее значение char в строке, возвращаемой ttynam(3). Поэтому, если stdin (fd0) подключен к «/ dev/tty2», то возвращаемым значением будет char 2. И в C вы можете проверить это с помощью:

if (ttyn(0) == '2') { ... } 

Предоставлена ​​документация нечеткая. И он использует плохую терминологию; вместо «пишущей машинки» он должен использовать «телетайп» или «терминал», которые являются принятыми условиями. Помните, что stdin может отличаться от stdout; вполне возможно сделать запуск cat </dev/tty1 > /dev/tty2, если у вас есть разрешения на него.

+0

Существует прецедент для «пишущей машинки»; исторически 'strerror (ENOTTY)' будет возвращать '' Не пишущую машинку''. См. Http://en.wikipedia.org/wiki/Not_a_typewriter –

Смежные вопросы