Not a typewriter

not a typewriter（ノット・ア・タイプライター（タイプライターではない））またはENOTTYは、多くのUNIXシステムに見られるで、で定義されている。このエラーコードは現在、ioctl（入出力制御）システムコールで無効なioctl番号が指定されたことを示すために使用されている。

詳細 
このエラーコードは、初期のUNIXに由来する。バージョン6以前のUNIXにおける入出力制御は、gttyおよびsttyシステムコールを通じて、テレタイプ（TTYと略される）に代表されるシリアル接続された端末デバイスに限定されていた。端末でないデバイスでこれらのシステムコールを使おうしたときに、ENOTTYエラーが発生した。stty/ttyシステムコールが、より一般的なioctl（入出力制御）システムコールに置き換えられても、ENOTTYエラーコードは維持された。

初期のコンピュータでは、電気機械式のタイプライターが端末として使われていた。現代のUNIXシステムで広く使われている"TTY"という略語は、"teletypewriter"（テレタイプライター）の略である。例えば、シグナルの本来の意味は、それを使用するテレタイプライターの電話線を切る(hung up)ことである。「テレタイプ」はAT&Tの子会社であるテレタイプ社の登録商標であるため、それを回避するために「タイプライター」という一般名詞に置き換えたものと見られる。

POSIXでは、ENOTTYを"not a terminal"（端末ではない）という意味とすることで、この問題を回避している。

ioctlは現在、端末以外の機器にも対応しているため、システムによっては"inappropriate ioctl for device"（デバイスに対する不適切なioctl）のような別のメッセージを表示することもある。

発生 
プログラムがioctlを発行しなくても、このメッセージが発生する場合がある。それは、isatty()ライブラリルーチンによるものである。エラーコードerrnoは、システムコールが失敗したときにのみ設定される。C標準I/Oライブラリが最初に行うシステムコールの一つがisatty()コールであり、プログラムが人間によって対話的に実行されているのか（この場合isatty()は成功し、ライブラリは出力を一度に一行ずつ書くので、ユーザーはテキストの流れを見ることができる）、あるいはパイプラインの一部として実行されているのか（この場合、効率化のためにテキストをまとめて書く）を判断するために使用される。システムコールとは関係のない理由でライブラリルーチンが失敗した場合（例えば、passwdファイルにユーザ名が見つからなかった場合など）、（経験の浅いプログラマが）失敗のたびにいちいち通常のエラー報告ルーチンperror()を呼び出していると、残ったENOTTYによって全く不適切な"not a typewriter"エラーが表示されることになる。

かつて、UNIXのメールサーバプログラムsendmailには長期に渡りこのバグがあった。他のシステムからメールが配信されるとき、メールプログラムは非対話的に実行されていた。宛先アドレスがローカルで、ローカルのパスワードファイルにないユーザー名を参照していた場合、メールの送信者に対し、「送信先はタイプライターではない」という通知が送信されていた。

脚注

関連項目
 lp0 on fire

外部リンク

エラーメッセージ
入出力