Введение
Код ошибки UNIX, код ошибки Unix. В информатике "Not a typewriter" или ENOTTY — это код ошибки, определённый в файле errno.h, встречающемся во многих Unix-системах. В настоящее время этот код используется для обозначения того, что в системном вызове ioctl был указан недопустимый номер ioctl (управления вводом/выводом).
Unix error code
In computing, "Not a typewriter" or ENOTTY is an error code defined in the errno. h found on many Unix systems. This code is now used to indicate that an invalid ioctl (input/output control) number was specified in an ioctl system call.
Подробности
Эта ошибка возникла в ранних версиях UNIX. В UNIX версии 6 и более ранних, управление вводом/выводом было ограничено последовательно подключенными терминальными устройствами, обычно телетипом (сокращенно TTY), посредством системных вызовов gtty и stty. Если предпринималась попытка использовать эти вызовы на нетерминальном устройстве, генерировалась ошибка ENOTTY. Когда системные вызовы stty/gtty были заменены более общим вызовом ioctl (управление вводом/выводом), код ошибки ENOTTY был сохранен. Ранние компьютеры и системы Unix использовали электромеханические пишущие машинки в качестве терминалов. Сокращение TTY, широко используемое в современных системах UNIX, расшифровывается как "Teletypewriter" (телеписец). Например, первоначальное значение сигнала SIGHUP заключается в том, что он разрывает соединение телефонной линии с телеписецем, который его использует. Общий термин "пишущая машинка", вероятно, использовался потому, что "Teletype" был зарегистрированным товарным знаком компании Teletype Corporation, дочерней компании AT&T, и был слишком конкретным. Название "Teletype" произошло от более общего термина "телеписец"; использование "писец" было другим сокращением того же исходного термина. POSIX обходит эту проблему, определяя ENOTTY как "не терминал". Поскольку ioctl теперь поддерживается и на других устройствах, кроме терминалов, некоторые системы отображают другое сообщение, например, "Недопустимый ioctl для данного устройства".
Возникновение
В некоторых случаях это сообщение может появиться, даже если программа не выполняла никаких вызовов ioctl. Это связано с тем, как работает библиотечная функция isatty. Код ошибки errno устанавливается только при неудаче системного вызова. Один из первых системных вызовов, выполняемых библиотекой стандартного ввода-вывода C, – это вызов isatty, который используется для определения, запущена ли программа в интерактивном режиме пользователем (в этом случае isatty выполняется успешно, и библиотека выводит данные построчно, чтобы пользователь видел непрерывный поток текста) или как часть конвейера (в этом случае она выводит данные блоками для повышения эффективности). Если библиотечная функция завершается неудачно по причине, не связанной с системным вызовом (например, если имя пользователя не найдено в файле паролей), и неопытный программист бездумно вызывает стандартную функцию отчёта об ошибках perror при каждой неудаче, оставшееся значение ENOTTY приведёт к совершенно неуместному сообщению "Не терминал" (или "Не телетайп", или "Неподходящий ioctl для устройства"), отображаемому пользователю. В течение многих лет в UNIX-программе для отправки почты sendmail содержалась эта ошибка: когда почта доставлялась с другой системы, почтовая программа запускалась в неинтерактивном режиме. Если адрес назначения был локальным, но указывал на имя пользователя, отсутствующее в локальном файле паролей, сообщение, отправленное обратно отправителю письма, сообщало, что человек, с которым он пытался связаться, не является терминалом.