タイプライターではない

Linux の「タイプライターではありません」エラー コード。

コンピュータ科学において、「タイプライターではない」またはENOTTY [ 1 ]は、多くのUnixシステムのerrno.hで定義されているエラーコードです。このコードは現在、ioctlシステムコールで無効なioctl(入出力制御)番号が指定されたことを示すために使用されます。

詳細

このエラーは初期のUNIXで発生しました。バージョン6以前のUNIXでは、I/O制御はgttyおよびsttyシステムコールを介したシリアル接続の端末デバイス(典型的にはテレタイプ(略称TTY))に限定されていました。 [ 2 ]これらのシステムコールを非端末デバイスで使用しようとすると、ENOTTYエラーが生成されました。stty/gttyシステムコールがより汎用的なioctl (I/O制御)コールに置き換えられた後も、ENOTTYエラーコードは保持されました。

初期のコンピュータやUNIXシステムは、電気機械式タイプライターを端末として使用していました。[ 3 ] [ 4 ]現代のUNIXシステムで広く使用されている略語TTYは、「テレタイプライター」の略です。例えば、SIGHUP信号の本来の意味は、それを使用しているテレタイプライターの電話回線を切ることです。「タイプライター」という一般的な用語が使用されたのは、「テレタイプ」がAT&Tの子会社であるテレタイプ社の登録商標であり、あまりにも具体的すぎたためと考えられます。「テレタイプ」という名称は、より一般的な用語である「テレタイプライター」から派生したものであり、「タイプライター」という用語の使用は、同じ元の用語の別の短縮形でした。

POSIXでは、 ENOTTYを「端末ではない」という意味として記述することでこの問題を回避しています。 [ 5 ]

ioctlは現在端末以外のデバイスでもサポートされているため、一部のシステムでは代わりに「デバイスに不適切なioctl 」などの異なるメッセージが表示されます。[ 6 ] [ 7 ]

発生

場合によっては、プログラムがioctlを発行していない場合でもこのメッセージが表示されることがあります。これは、isatty()ライブラリルーチンの動作に起因します。エラーコードerrnoは、システムコールが失敗した場合にのみ設定されます。C標準I/Oライブラリが最初に行うシステムコールの1つは、isatty()呼び出しです。これは、プログラムが人間によって対話的に実行されているか(この場合、isatty()は成功し、ライブラリは出力を1行ずつ書き込むため、ユーザーは通常のテキストの流れを確認できます)、パイプラインの一部として実行されているか(この場合、効率性を考慮してブロックごとに書き込まれます)を判断するために使用されます。ライブラリ ルーチンがシステム コールとは関係のない何らかの理由 (たとえば、ユーザー名がパスワード ファイルに見つからないなど) で失敗し、初心者のプログラマが失敗するたびに通常のエラー報告ルーチン perror() を盲目的に呼び出すと、残った ENOTTY によって、まったく不適切な「タイプライターではありません」(または「テレタイプではありません」、あるいは「デバイスの ioctl が不適切です」) がユーザーに配信されることになります。

UNIXメールプログラムsendmailには長年、あるバグがありました。別のシステムからメールが配信されると、メールプログラムが非対話的に実行されるというものでした。宛先アドレスがローカルアドレスであっても、ローカルパスワードファイルに存在しないユーザー名を参照している場合、メールの送信者に返信されるメッセージは、通信相手がタイプライターではないというアナウンスメントでした。[ 8 ]

参照

参考文献