EN JA
TERMIOS(4)
TERMIOS(4) FreeBSD Kernel Interfaces Manual TERMIOS(4)

名称

termios一般的な端末の回線制御規則 (line discipline)

書式

#include < termios.h>

解説

これは tty 非同期通信ポート上でサポートされる一般的な端末の回線制御規則 (line discipline) について説明しています。

端末デバイスファイルのオープン

端末ファイルがオープンされるとき、通常接続が確立されるまで、プロセスは待ちます。ほとんどのハードウェアでは、接続の存在はハードウェアの CARRIER ラインのアサーション (表明) によって示されます。端末のファイルに関連している termios 構造体が cflag に CLOCAL フラグセットがあるかまたは、 open(2) 呼び出しで O_NONBLOCK フラグが設定されているなら、オープンは現在接続がなくても成功します。実際には、アプリケーションはめったにこれらのファイルをオープンしません。それらは、 getty(8)rlogind(8) のような特別のプログラムでオープンされ、アプリケーションの標準入力、標準出力と標準エラーファイルになります。

nutshell のジョブ制御

あらゆるプロセスは特定のプロセスグループとセッションに関連しています。グループ分けは階層的です: 特定のプロセスグループのすべてのメンバは同じセッションのメンバです。この構造は、 ジョブ制御 の目的のために関連するプロセスのグループを管理する際に使用されます。すなわち、同時に複雑なコマンド (2 つ以上の関連するプロセスからなるコマンド) を停止するか、または再開するためのキーボード (またはプログラムの制御) の能力です。プロセスグループへのグループ分けすることによって、プロセスグループが単一の制御端末にアクセスすることを調整するともに、全体としてグループを停止するか、または開始するシグナルを配信できます。セッションへの高い層でのグループ分けはジョブ制御に関連するシグナルとシステムコールを“ログイン”の特定のインスタンスから生じるプロセスに制限することです。一般的に、ユーザがログインするときにセッションは作成され、ログイン端末は制御端末となるようにセットアップされます。そのログインシェルから生じたすべてのプロセスは、同じセッションであり、制御端末を継承します。

インタラクティブに動作するジョブ制御シェル (すなわち、端末からコマンドを読み込む) は、それらを同じプロセスグループに置くことによって、関連するプロセスを一緒にします。同じプロセスグループ中の 1 組のプロセスは“ジョブ”としてまとめて参照されます。端末のフォアグランドプロセスグループが特定のジョブのプロセスグループと同じであるときに、そのジョブは“フォアグランド”になっていると言われます。端末のプロセスグループがジョブのプロセスグループと異なっているとき (しかし、それでも制御端末である)、そのジョブは“バックグラウンド”になっていると言われます。通常、シェルはコマンドを読み込んで、そのコマンドを実装するジョブを始めます。コマンドが (標準的な) フォアグランドで開始されるなら、端末のプロセスグループを開始されたジョブのプロセスグループに設定し、ジョブが完了するのを待って、端末のプロセスグループをそれ自体のプロセスグループに戻します (それはフォアグランドに置かれます)。ジョブがバックグラウンドで開始されるなら (シェル演算子 "&"によって指示されるように)、端末のプロセスグループを決して変更せず、ジョブが完了するのを待ちません (すなわち、すぐに次のコマンドを読み込もうと試みます)。ジョブがフォアグランドで開始されるなら、ユーザは全体のジョブを停止するという効果を持っている、端末の停止シグナル ( SIGTSTP) を発生させる、キー (通常‘ ^Z’) をタイプするかもしれません。シェルはジョブが停止したことに気付いて、フォアグランドにシェル自体を置いた後に実行を再開します。シェルにはまた、バックグラウンドで停止したジョブおよび、停止したまたはバックグラウンドに置かれたジョブをフォアグランドに置くコマンドがあります。

親のないプロセスグループ

親のないプロセスグループは、親がまだ同じセッションにいて異なったプロセスグループにはいますが、その親のプロセスがないプロセスグループです。概念的に、それが停止されることになっているなら何もできる親のないプロセスグループを意味します。例えば、初期のログインシェルは一般的に親のないプロセスグループです。親のないプロセスグループはキーボードで生成された停止シグナルと制御端末への読み込みまたは書き込みに由来するジョブ制御を免除されています。

制御端末

端末は制御端末としてプロセスに属します。制御端末を持っているセッションの各プロセスは、同じ制御端末になります。端末は高々 1 つのセッションのための制御端末となります。セッションのための制御端末は、 TIOCSCTTY ioctl を発行することによって、セッションリーダによって割り付けられます。制御端末は端末デバイスファイルを単にオープンすることによって、決して獲得されません。制御端末がセッションに関連するようになるとき、フォアグランドプロセスグループはセッションリーダのプロセスグループに設定されます。

制御端末は fork(2) 関数呼び出しの間に、子プロセスによって継承されます。プロセスは setsid(2) 関数で新しいセッションを作成するとき、制御端末を放棄します。他のプロセスは、それらの制御端末がそれを持ち続けるようにこの端末を持っていた古いセッションに残っています。プロセスは、他のプロセスが、それをオープンし続けるなら、制御端末に関連しているファイル記述子のすべてをクローズすることによって、単に制御端末を放棄しません。

制御プロセスが終了するとき、制御端末は新しいセッションリーダによって獲得できる、現在のセッションから分離されます。以前のセッションで他のプロセスによる端末へのその後のアクセスは、まるでモデムの切断が気付かれたかのように扱われた端末にアクセスする試みによって、拒絶されます。

端末アクセス制御

プロセスが制御端末のフォアグランドプロセスグループになっているなら、読み込み操作は許されます。制御端末から読み込まれるバックグラウンドプロセスでプロセスによるどんな試みも次の特別なケースの 1 つが適用されないなら、 SIGTTIN シグナルをプロセスグループへ送る原因となります: 読み込みプロセスが SIGTTIN シグナルを無視するかブロックされるなら、または読み込みプロセスのプロセスグループが親のないプロセスであるなら、 read(2) は -1 を返し、 errnoEIO を設定し、シグナルは送られません。 SIGTTIN シグナルのデフォルト動作はそれに送られるプロセスを停止することです。

プロセスが制御端末のフォアグランドプロセスグループになっているなら、書き込み操作は許されます。制御端末へ書き込まれるバックグラウンドプロセスでプロセスによる試みは次の特別なケースの 1 つが適用されないなら、 SIGTTOU シグナルをプロセスグループへ送る原因となります: TOSTOP が設定されないか、 TOSTOP が設定されプロセスが SIGTTOU シグナルを無視するかブロックされるなら、プロセスは端末への書き込みを許し、 SIGTTOU シグナルは送られません。 TOSTOP が設定され、書き込みプロセスのプロセスグループが親のないプロセスであるなら、そして書き込みプロセスが SIGTTOU を無視しないかブロックされるなら、 write(2) は -1 を返し、errno に EIO を設定し、シグナルは送られません。

端末パラメータを設定する特定の呼び出しは TOSTOP が無視されることを除いて、書き込みと同じやりかたで取り扱われます。すなわち、 TOSTOP が設定されるとき、端末への書き込みの効果は同じです。

入力処理とデータの読み込み

端末デバイスファイルに関連している端末デバイスは全二重モードで動作するので、データは出力が生じている間でも到着するかもしれません。各端末デバイスファイルは、着信データはプロセスによって読み込まれる前にシステムに格納される、入力キューに関連づけられます。システムは入力キューに格納されバイト数に制限 { MAX_INPUT} をつけています。この制限を超えるとき、システムの振る舞いは termios の c_iflagIMAXBEL フラグの設定に依存しています。このフラグが設定されるなら、端末は入力キューが満杯である間、文字が付け取られるたびに ASCII BEL 文字を送ります。そうでなければ、文字を受け取られるとき、入力キューはフラッシュされます。

一般的な 2 種類の入力処理が、端末デバイスファイルがカノニカル (canonical) モードか非カノニカル (noncanonical) モードであるかによって決定され、利用可能です。さらに、入力文字は c_iflagc_lflag フィールドに従って処理されます。そのような処理は、一般的に、それらが端末から受け取られるられるとき、端末へすぐに転送された入力文字を戻すことを意味する、エコー機能を含むことができます。これは全二重モードで動作することができる端末で役に立ちます。

データが端末デバイスファイルから読み込むプロセスに提供されている方法は、端末デバイスファイルがカノニカルモードか非カノニカルモードであるかに依存しています。

他に O_NONBLOCK フラグが open(2)fcntl(2) によって設定されるかどうかに依存しています。 O_NONBLOCK フラグがクリアされているなら、データが利用可能になるかシグナルが受け取られるまで、読み込み要求はブロックされます。 O_NONBLOCK フラグが設定されているなら、読み込み要求は次の 3 のうちの 1 つでブロックすることなしに完了します:

  1. 全体の要求を満たすために利用可能な十分なデータがある、そして読み込みが成功して完了するなら、読み込んだバイト数を返します。
  2. 全体の要求を満たすために利用可能な十分なデータがない、そしてできるだけ多くのデータを読み込んで、読み込みが成功して完了するなら、読み込んだバイト数を返します。
  3. 利用可能なデータがななら、読み込みは errno に EAGAIN を設定して -1 で返ります。

データがいつ利用可能であるかは入力処理モードがカノニカルか非カノニカルであるかに依存します。

カノニカル (canonical) モード入力処理

カノニカルモードの入力処理では、端末の入力は行単位に処理されます。行は改行‘ \n’文字、ファイルの終り ( EOF) 文字、または行末 ( EOL) 文字によって区切られます。 EOFEOL の詳しい情報については、 特殊文字 セクションを参照してください。これは、読み込み要求が全体の行をタイプしたか、またはシグナルを受け取るまで、返らないことを意味します。また、read 呼び出しでどんなに多くのバイトが要求されても、高々 1 行が返されます。しかしながら、一度にすべての行を読み込む必要はありません。いくつのバイト (1 つ) でも情報を失うことなしに読み込みの要求ができます。

{ MAX_CANON} は 1 行のバイト数の制限です。この制限を超えるとき、システムの振る舞いは入力キューの制限 { MAX_INPUT}, が越えるときと同じです。

2 つの特殊文字 ERASEKILL 文字 ( 特殊文字 セクション参照) のいずれかを受け取られるとき、 erase (最後の文字前削除) と kill (すべての文字削除) 処理は起こります。この処理は、改行 NL, EOF または EOL 文字によってまだ区切られていない入力キューのデータに影響します。この区切られていないデータは現在行を整えます。 ERASE 文字は現在行の最後の文字があればそれを削除します。 KILL 文字は現在行があればそのすべてのデータを削除します。 ERASEKILL 文字は現在行にデータがなければ効果はありません。 ERASEKILL 文字自体は入力キューに置かれません。

非カノニカル (noncanonical) モード入力処理

非カノニカルモードの入力処理では、入力バイトは行にまとめられません、そして erase と kill 処理は起こりません。 c_cc 配列の VMINVTIME メンバの値は受け取られたバイトをどのように処理するかを決定するために使用されます。

MINread(2) 関数が成功して返るときに受け取られるべきである最小のバイト数を表します。 TIME はタイムアウトが生じ短期間のデータ送信に使用される 0.1 秒の精度のタイマです。 MIN{ MAX_INPUT}, より大きいなら、要求への応答は不定です。 MINTIME のための 4 つのあり得る値とそれらの相互作用は次に説明されます。

ケース A: MIN > 0, TIME > 0

この場合、 TIME はバイト間のタイマとして役立ち、最初のバイトが受け取られた後にアクティブにされます。バイト間のタイマであるので、1 バイトが受け取られた後に、それはリセットされます。 MINTIME との間の相互作用は次の通りです: 1 バイトが受け取られるとすぐに、バイト間のタイマは始動されます。バイト間のタイマの期限が切れる前に (タイマが各バイトを受け取られるときにリセットされるのを思い出してください) MIN バイトが受け取られなら、読み込みは充足されます。 MIN バイトが受け取られる前にタイマの期限が切れるなら、その時点で受け取られた文字をユーザに返します。 TIME が期限が切れるなら、1 バイトを受け取られない場合、タイマが有効にされていないので少なくとも 1 バイトが返されることに注意してください。この場合、 ( MIN > 0, TIME > 0)、read は MINTIME メカニズムが最初のバイトを受け取られることによってアクティブでないかシグナルが受け取られるまで、ブロックされます。データが read() の時点でバッファ中にあるなら、結果はまるでデータが read() の直後に受け取られるようになります。

ケース B: MIN > 0, TIME = 0

この場合、 TIME の値が 0 であるので、タイマは役割を果たさず、 MIN だけが意味があります。保留の read は MIN バイトが受け取られるか、(すなわち、 MIN バイトが受け取られるまで保留の read はブロックされます)、またはシグナルが受け取られるまで充足されません。レコードベースの端末の I/O を読み込むこのケースで使用されるプログラムは読み込み操作で無期限にブロックされます。

ケース C: MIN = 0, TIME > 0

この場合、 MIN = 0 であるので、 TIME はもはやバイト間のタイマを表しません。読み込み関数が処理されるとすぐにアクティブとなる読み込みタイマとして現在、役立ちます。 1 バイトが受け取られるか、または読み込みタイマの期限が切れるとすぐに、 read は充足されます。タイマが期限が切れるなら、この場合バイトが返されないことに注意してください。タイマの期限が切れていないなら、 read が満足することができる唯一の方法は 1 バイトが受け取られるかどうかということです。この場合、read は 1 バイトの待ちを無期限にブロックしないでしょう。読み込みを開始した後 TIME*0.1 秒以内にバイトを全く受け取られないなら、読み込みはデータを全く読んでいないので、0 の値を返します。読み込みの時点でデータがバッファ中にあるなら、タイマはまるで読み込み直後にデータを受け取られたかのように始動されます。

ケース D: MIN = 0, TIME = 0

要求されたバイト数または現在利用可能なバイト数のいずれかの最小は、より多くのバイトが入力されるのを待たないで返されます。文字が少しも利用可能でないなら、読み込みはデータを全く読んでいないので、0 の値を返します。

データの書き込みと出力処理

プロセスが端末デバイスファイルに 1 バイト以上を書き込むとき、 c_oflag フィールド ( 出力モード セクション参照) に従って、それらは処理されます。実装は次のようなバッファリングメカニズムを提供します。 write() への呼び出しが完了してとき、書き込まれたすべてのバイトはデバイスへの送信のためスケジュールされていますが、送信は必ず完了する必要はありません。

特殊文字

一部の文字は入力、出力または両方で特別な機能があります。これらの機能は次の通りにまとめられます:
INTR
入力時の特殊文字で、 ISIG フラグ ( ローカルモード 参照) が有効であるなら、認識されます。端末が制御端末であるフォアグランドプロセスグループのすべてのプロセスに送られる SIGINT シグナルを発生させます。 ISIG が設定されるなら、 INTR 文字は処理されるとき、破棄されます。
QUIT
入力時の特殊文字で、 ISIG フラグが有効であるなら、認識されます端末が制御端末であるフォアグランドプロセスグループのすべてのプロセスに送られる SIGQUIT シグナルを発生させます。 ISIG が設定されるなら、 QUIT 文字は処理されるとき、破棄されます。
ERASE
入力時の特殊文字で、 ICANON フラグが設定されるなら、認識されます現在行の最後の文字を削除します。 カノニカル (canonical) モード入力処理 参照。 NL, EOF または EOL 文字によって区切られるような、行の始まりを超えて削除しません。 ICANON が設定されるなら、 ERASE 文字は処理されるとき、破棄されます。
KILL
入力時の特殊文字で、 ICANON フラグが設定されるなら、認識されます NL, EOF または EOL 文字によって区切られるような、全体の行を削除します。 ICANON が設定されるなら、 KILL 文字は処理されるとき、破棄されます。
EOF
入力時の特殊文字で、 ICANON フラグが設定されるなら、認識されます受け取られるとき、読み込みを待つすべてのバイトは改行を待たないで、直ちにプロセスに渡され、そして EOF は破棄されます。したがって、待っているバイトがなければ (すなわち、 EOF は行の始めに生じました)、 read() から 0 バイトのカウントが返され、ファイルの終りを表します。 ICANON が設定されるなら、 EOF 文字は処理されるとき、破棄されます。
NL
入力時の特殊文字で、 ICANON フラグが設定されるなら、認識されます。それは行デリミタ (を区切る) ‘ \n’です。
EOL
入力時の特殊文字で、 ICANON フラグが設定されるなら、認識されますそれは NL のような追加行デリミタです。
SUSP
ISIG フラグが有効にされるなら、 SUSP 文字を受け取られることによって、端末が制御端末であるフォアグランドプロセスグループのすべてのプロセスに SIGTSTP シグナルが送られ、そして、 SUSP 文字は処理されるとき、破棄されます。
STOP
入力時と出力時の両方の特殊文字で、 IXON (出力制御) または IXOFF (入力制御) フラグが設定されるなら、認識されます。一時的に出力をサスペンド (一時停止) するために使用することができます。速い端末で読み込む前に出力が見えなくなるのを防ぐために役に立ちます。 IXON が設定されるなら、 STOP 文字は処理されるとき、破棄されます。
START
入力時と出力時の両方の特殊文字で、 IXON (出力制御) または IXOFF (入力制御) フラグが設定されるなら、認識されます。 STOP 文字によってサスペンド (一時停止) された出力を再開するために使用することができます。 IXON が設定されるなら、 START 文字は処理されるとき、破棄されます。
CR
入力時の特殊文字で、 ICANON フラグが設定されるなら、認識されますそれは C 標準 {2} で示されるような‘ \r’です。 ICANONICRNL が設定され、 IGNCR が設定されないとき、この文字は NL に変換され、 NL 文字と同じ効果があります。

次の特殊文字はこのシステムによって拡張定義されたもので、 IEEE Std 1003.1 (“POSIX.1”) termios の一部ではありません。

EOL2
2 番目の EOL 文字。 EOL と同じ機能です。
WERASE
入力時の特殊文字で、 ICANON フラグが設定されるなら、認識されます 2 つのアルゴリズムの 1 つに従って、現在行で最後のワードを削除します。 ALTWERASE フラグが設定されないなら、最初にどんな先行する空白類は削除され、非空白類文字の最大のシーケンスです。 ALTWERASE が設定されるなら、最初にどんな先行する空白類は削除され、アルファベット/下線または非アルファベット/下線の最大のシーケンスです。この 2 番目のアルゴリズムで特殊なものとして、最初に前のの非空白類文字は、先行するワードがアルファベット/下線のシーケンスであるかどうか決定する際にスキップされます。これは紛らわしく思えますが、かなり実用的であると判明します。
REPRINT
入力時の特殊文字で、 ICANON フラグが設定されるなら、認識されます現在の入力編集行を再びタイプで打たれるようにします。
DSUSP
フォアグランドプロセスグループのプロセスの 1 つが制御端末に read() を発行するとき、 SIGTSTP シグナルが配信されるのを除いて、 SUSP 文字と同様の動作をします。
LNEXT
入力時の特殊文字で、 IEXTEN フラグが設定されるなら、認識されますこの文字の受け取られるなら、文字通り次の文字を取ります。
DISCARD
入力時の特殊文字で、 IEXTEN フラグが設定されるなら、認識されますこの文字の受け取りは端末出力のフラッシュを切り換えます。
STATUS
入力時の特殊文字で、 ICANON フラグが設定されるなら、認識されますこの文字の受け取りで、 SIGINFO シグナルを端末のフォアグランドプロセスグループに送ります。また、 NOKERNINFO フラグが設定されないなら、カーネルはステータスメッセージを現在のロードアベレージ (負荷平均)、フォアグランドのコマンドの名前、プロセス ID、シンボリックな待ちチャネル、ユーザ番号とシステムが使用した秒、プロセスが取得した cpu の割合、およびプロセスの常駐セットサイズを表示する端末へ書き込みます。

NLCR 文字を変更することはできません。残りのすべての文字の値は設定することができ、下の特殊制御文字の文書で後で説明されます。

変更可能な特殊制御文字に関連している特殊文字の機能は {_POSIX_VDISABLE} にそれらの値を設定することによって個別に無効にすることができます。 特殊制御文字 参照。

2 つ以上の特殊文字に同じ値があるなら、その文字が受け取られているとき実行された機能は不定です。

モデム切断

制御端末の端末インタフェースによってモデムとの接続が切れているのを検出して、 CLOCAL が端末の c_cflag フィールドに設定されていないら、 SIGHUP シグナルが端末に関連づけられた制御プロセスに送られます。他の処置が行われていないなら、これは制御プロセスを終了させます。その後のどんな read() 関数への呼び出しはファイルの終りを示す 0 を返します。したがって、端末ファイルを読み込み、ファイルの終りをテストするプロセスは切断後に適切に終了することができます。その後のどんな端末デバイスへの write() はデバイスがクローズされるまで errnoEIO を設定して、-1 を返します。

一般的な端末インタフェース

端末デバイスファイルのクローズ

最後のプロセスが端末デバイスファイルをクローズするとデバイスに送られるどんな出力もどんな入力も破棄されます。そして、 HUPCL がコントロールモードで設定されて、通信ポートが切断機能をサポートするなら、端末デバイスは切断を実行します。

設定することができるパラメータ

ある端末の I/O 特性を制御する必要があるルーチンは、ヘッダ < termios.h> で定義されるような termios 構造体を使用することによって行えます。この構造体はビットフラグの 4 つのスカラ要素と 1 つの特殊文字の配列を最低限含んでいます。スカラフラグ要素は次のように名前が付けられています: c_iflag, c_oflag, c_cflagc_lflag です。文字配列は c_cc と名前がつけられ、最大のインデックスは NCCS です。

入力モード

c_iflag フィールドの値は、基本的な端末入力制御について説明して、次のマスクで構成されます:

IGNBRK
/* BREAK 状態を無視 */
BRKINT
/* BREAK を SIGINTR にマップ */
IGNPAR
/* パリティエラーを無視 (破棄) */
PARMRK
/* パリティとフレーミングエラーをマーク */
INPCK
/* パリティエラーのチェックを有効 */
ISTRIP
/* 文字の 8 ビット目を取り去る */
INLCR
/* NL を CR にマップ */
IGNCR
/* CR を無視 */
ICRNL
/* CR を NL にマップ (ala CRMOD) */
IXON
/* 出力フロー制御を有効 */
IXOFF
/* 入力フロー制御を有効 */
IXANY
/* どんな文字も停止の後で再開 */
IMAXBEL
/* 入力キューが満杯でベルを鳴らす */

非同期シリアルデータ送信のコンテキストでは、中断 (ブレーク) 状態は 1 バイトを送信する時間以上に続く 0 値ビットのシーケンスと定義されます。 0 値のビットの全体のシーケンスは 2 バイト以上と同等な時間が続いても、ただ一つの中断状態として解釈されます。非同期シリアルデータ送信以外のコンテキストでは、中断条件の定義は実装時定義です。

IGNBRK が設定されるなら、入力時に検出された中断状態は無視され、すなわち、入力キューに置かれないで、したがって、どんなプロセスでも読み込まれません。 IGNBRK が設定されないで、 BRKINT が設定されるなら、中断状態は入力と出力キューをフラッシュし、そして、端末がフォアグランドプロセスグループの制御端末であるなら、中断状態はただ一つの SIGINT シグナルをそのフォアグランドプロセスグループに発生させます。 IGNBRKBRKINT も設定されないなら、中断状態は単一の‘ \0’として読み込まれ、または PARMRK が設定されるなら、‘ \377’, ‘ \0’, ‘ \0’として読み込まれます。

IGNPAR が設定されるなら、(中断以外の) フレーミングかパリティエラーがある 1 バイトは無視されます。

PARMRK が設定され IGNPAR が設定されるなら、(中断以外の) フレーミングかパリティエラーがある 1 バイトは 3 文字シーケンス‘ \377’, ‘ \0’, X としてをアプリケーションに与えられます、ここで‘ \377’, ‘ \0’は各シーケンスに先行する 2 文字のフラグであり、X はエラーで受け取られた文字のデータです。 ISTRIP が設定されないなら、この場合あいまいさを避けるために、有効な文字である‘ \377’は‘ \377’, ‘ \377’としてアプリケーションに与えられます。 PARMRKIGNPAR も設定されないなら、(中断以外の) フレーミングかパリティエラーは単一文字‘ \0’としてアプリケーションに与えられます。

INPCK が設定されるなら、入力パリティチェックは有効になります。 INPCK が設定されないなら、入力パリティエラーなしで出力パリティの生成を許して、入力パリティチェックは無効になります。入力パリティチェックが有効にされるか、または無効にされるかは、パリティ検出が有効にされるか、または無効にされるか ( 制御モード 参照) とは無関係であることに注意してください。パリティ検出が有効にされていますが、入力パリティチェックが無効にされているなら、端末が接続されているハードウェアはパリティビットを認識しますが、端末特殊ファイルはこのビットが正しく設定されているかどうかチェックしません。

ISTRIP が設定されるなら、有効な入力バイトは最初に 7 ビットを取り除き、そうでなければ、すべての 8 ビットを処理します。

INLCR が設定されるなら、受け取られた NL 文字は CR 文字に変換されます。 IGNCR が設定されるなら、受け取られた CR 文字は無視されます (読み込まれません)。 IGNCR が設定されないで ICRNL が設定されるなら、受け取られた CR 文字は NL 文字に変換されます。

IXON が設定されるなら、スタート/ストップ (start/stop) 出力制御は有効にされます。受け取られた STOP 文字は出力をサスペンド (一時停止) し、そして、受け取られた START 文字は出力を再開します。また、 IXANY が設定されるなら、どんな文字も出力を再開します。 IXON が設定されるとき、 STARTSTOP 文字は読み込まれませんが、単にフロー制御機能を実行します。 IXON が設定されないとき、 STARTSTOP 文字は読み込まれます。

IXOFF が設定されるなら、スタート/ストップ入力制御は有効にされます。システムは、入力キューがオーバフローすること、および 入力処理とデータの読み込み で説明された未定義の振る舞いを引き起こすことから回避する必要であるので、端末デバイスがデータを転送するのを停止することが意図されている、 2 つ以上の STOP 文字を転送するべきです。そして、システムは、デバイスが入力キューからオーバフローするリスクなしでデータを転送し続けることができるようになるとすぐに、端末デバイスがデータを転送するのを再開することが意図されている、 2 つ以上の START 文字を転送するべきです。 STOPSTART 文字が送信される明確な条件は実装時定義です。

IMAXBEL が設定されて、入力キューが満杯であるなら、その後の入力は ASCII BEL 文字を出力キューに転送するべきです。

open() の後の初期の入力制御値は実装時定義です。

出力モード

c_oflag フィールドの値は、基本的な端末出力制御について説明して、次のマスクで構成されます:

OPOST
/* 続く出力処理を有効 */
ONLCR
/* NL を CR-NL にマップ (ala CRMOD) */
OCRNL
/* CR を NL にマップ */
TABDLY
/* タブ遅延マスク */
TAB0
/* タブ遅延と拡張なし */
TAB3
/* タブを空白に拡張 */
ONOEOT
/* 出力時に EOT の‘ ^D’を破棄 */
ONOCR
/* カラム 0 で CR を転送しない */
ONLRET
/* 端末で NL は CR 機能を実行 */

OPOST が設定されるなら、残っているフラグのマスクは次の通り解釈されます。そうでなければ、文字は変更なしで転送されます。

ONLCR が設定されるなら、改行 (ニューライン) は復帰 (キャリッジリターン)、ラインフィードに変換されます。

OCRNL が設定されるなら、復帰 (キャリッジリターン) はニューラインに変換されます。

TABDLY ビットは、タブ遅延を指定します。 c_oflag は、 TABDLY でマスクされ、値 TAB0 または TAB3 と比較します。 TAB3 が設定されるなら、タブは適切な数の空白に拡張されます (8 カラムタブストップを仮定)。

ONOEOT が設定されるなら、 ASCII EOT のものは出力時に破棄されます。

ONOCR が設定されるなら、CR 文字はカラム 0 (第 1 ポジション) のときに、転送されません。

ONLRET が設定されるなら、NL 文字は復帰 (キャリッジリターン) 機能を行うと仮定されます。カラムポインタは 0 に設定されます。

制御モード

c_cflag フィールドの値は、基本的な端末ハードウェア制御について説明して、次のマスクで構成されます。指定されたすべての値がすべてのハードウェアによってサポートされているとは限りません。

CSIZE
/* 文字サイズマスク */
CS5
/* 5 ビット (疑似) */
CS6
/* 6 ビット */
CS7
/* 7 ビット */
CS8
/* 8 ビット */
CSTOPB
/* ストップビットを送る */
CREAD
/* 受信側を有効 */
PARENB
/* パリティを有効 */
PARODD
/* 奇数パリティ, さもなけれは偶数 */
HUPCL
/* 最後のクローズでハングアップ */
CLOCAL
/* モデム状態ラインを無視 */
CCTS_OFLOW
/* 出力の CTS フロー制御 */
CRTSCTS
/* CCTS_OFLOW と同様 */
CRTS_IFLOW
/* 入力の RTS フロー制御 */
MDMBUF
/* キャリアを通してフロー制御出力 */

CSIZE ビットは送信と受信の両方のビットでバイトサイズを指定します。 c_cflagCSIZE でマスクされ、値 CS5, CS6, CS7 または CS8 と比較されます。このサイズはもしあればパリティビットを含んでいません。 CSTOPB が設定されるなら、 2 つのストップビットが使用され、そうでなければ、1 つのストップビットが使用されます。例えば、110 ボーでは、通常、2 つのストップビットが使用されます。

CREAD が設定されるなら、受信側は有効にされます。そうでなければ、どんな文字も受け取られません。すべてのハードウェアがこのビットをサポートしているとは限りません。実際に、このフラグはかなり愚かです、そして、それが termios 仕様の一部でないなら、省略されるでしょう。

PARENB が設定されるなら、パリティ生成と検出は有効にされ、パリティビットは各文字に追加されます。パリティが有効にされるなら、 PARODD はパリティが設定されるなら奇数パリティを指定し、そうでなければ、偶数パリティが使用されます。

HUPCL が設定されるなら、最後のプロセスがポートオープンでポートをクローズするかプロセスが終了するとき、ポートへのモデム制御ラインは下げられます。モデム接続は中断されます。

CLOCAL が設定されるなら、接続はモデム状態ラインの状態に依存しません。 CLOCAL がクリアされるなら、モデム状態ラインはモニタされます。

通常の環境下で、 open() 関数への呼び出しは終了するモデム接続を待ちます。しかしながら、 O_NONBLOCK フラグが設定されるか、または CLOCAL が設定されているなら、 open() 関数は接続を待たないですぐに返ります。

CCTS_OFLOW ( CRTSCTS) フラグは現在、未使用です。

MDMBUF が設定されるなら、出力フロー制御は "キャリア検出"の状態によって制御されます。

制御モードが設定されるオブジェクトは非同期シリアル接続でないなら、モードのいくつかは無視されるかもしれません。例えば、別のホスト上の端末へのネットワーク接続でボーレートの設定を試みるなら、直接接続される端末とマシンの間との接続でボーレートは設定されるかどうか分かりません。

ローカルモード

c_lflag フィールドの値は様々な機能の制御について説明し、次のマスクで構成されています。

ECHOKE
/* 行 kill (削除) のための視覚削除 */
ECHOE
/* 視覚削除文字 */
ECHO
/* エコー機能を有効 */
ECHONL
/* ECHO がオフでも NL をエコー */
ECHOPRT
/* ハードコピーのための視覚削除モード */
ECHOCTL
/* ^(文字) のように制御文字をエコー */
ISIG
/* INTR, QUIT, [D]SUSP シグナルを有効 */
ICANON
/* カノニカルモードの入力行 */
ALTWERASE
/* 代替の WERASE アルゴリズムを使用 */
IEXTEN
/* DISCARDLNEXT を有効 */
EXTPROC
/* 外部処理 */
TOSTOP
/* 出力からバックグラウンドジョブを停止 */
FLUSHO
/* フラッシュされる出力 (状態) */
NOKERNINFO
/* VSTATUS からのカーネル出力なし */
PENDIN
/* XXX ペンディング入力 (状態) を再タイプ */
NOFLSH
/* 割り込みの後でフラッシュしない */

ECHO が設定されるなら、入力文字は端末にエコーバックされます。 ECHO が設定されないなら、入力文字はエコーされません。

ECHOEICANON が設定されるなら、 ERASE 文字は、可能なら、端末に表示されている現在行の最後の文字を削除します。削除文字がなければ、実装は、この場合であるまたは何もしないことの印をエコーします。

ECHOKICANON が設定されるなら、 KILL 文字は現在行を破棄し、システムは KILL 文字の後に‘ \n’文字をエコーします。

ECHOKEICANON が設定されるなら、 KILL 文字は現在行を破棄し、システムは端末に表示されている行を削除します。

ECHOPRTICANON が設定されるなら、システムは、ディスプレイが印刷デバイスであり、前方スラッシュがあとに続いた ERASE 文字を処理するとき、バックスラッシュと削除文字を印刷すると仮定しています。

ECHOCTL が設定されるなら、システムは制御文字があとに続いたキャレットを使用する視覚方法で制御文字をエコーします。

ALTWERASE が設定されるなら、システムは WERASE 文字 ( WERASE 参照) を処理するとき、何がワードを構成するかを決定する代替のアルゴリズムを使用します。

ECHONLICANON が設定されるなら、 ECHO が設定されなくても‘ \n’文字をエコーします。

ICANON が設定されるなら、カノニカル処理は有効にされます。これは erase と kill 編集機能と カノニカル (canonical) モード入力処理 で説明されるように NL, EOFEOL によって区切られた行に入力文字の組み立てを有効にします。

ICANON が設定されないなら、読み込み要求は直接入力キューから充足されます。少なくとも MIN バイトを受け取ったか、またはタイムアウト値 TIME がバイトの間で期限が切れるまで、読み込みは充足されません。時間の値は 10 分の 1 秒を表します。その他の詳細については、 非カノニカル (noncanonical) モード入力処理 を参照してください。

ISIG が設定されるなら、それぞれの入力文字は特殊制御文字の INTR, QUIT, と SUSP (ジョブ制御専用) かチェックされます。入力文字がこれらの制御文字の 1 つに一致するなら、その文字に関連している機能が実行されます。 ISIG が設定されないなら、チェックは行われません。したがって、 ISIG が設定される場合にだけ、これらの特別の入力機能が可能です。

IEXTEN が設定されるなら、実装で定義された機能は入力データから認識されます。設定される IEXTEN がどのように ICANON, ISIG, IXON または IXOFF と相互に作用するかは、実装時定義です。 IEXTEN が設定されないなら、実装で定義された機能は認識されず、対応する入力文字は ICANON, ISIG, IXONIXOFF に関して説明されるように処理されません。

NOFLSH が設定されるなら、 INTR, QUITSUSP 文字に関連する入力と出力キューの通常のフラッシュは行われません。

TOSTOP が設定されるなら、端末のフォアグランドプロセスグループにプロセスがないなら制御端末に書き込もうとするプロセスのプロセスグループにシグナル SIGTTOU を送ります。このシグナルはデフォルトでプロセスグループのメンバを停止します。そうでなければ、そのプロセスで発生する出力は現在の出力ストリームへ出力されます。 SIGTTOU シグナルをブロックするか、または無視しているプロセスは、除外され、出力を生成することができ、 SIGTTOU シグナルは送られません。

NOKERNINFO が設定されるなら、 STATUS 文字 ( STATUS 参照) を処理するとき、カーネルはステータスメッセージを生成しません。

特殊制御文字

特殊制御文字値は配列 c_cc によって定義されます。このテーブルは配列インデックス、対応する特殊文字とシステムデフォルト値をリストします。システムデフォルトの正確なリストについては、ヘッダファイル < sys/ttydefaults.h> を調べてください。

インデックス名 特殊文字 デフォルト値
VEOF EOF ^D
VEOL EOL _POSIX_VDISABLE
VEOL2 EOL2 _POSIX_VDISABLE
VERASE ERASE ^? ‘ \177
VWERASE WERASE ^W
VKILL KILL ^U
VREPRINT REPRINT ^R
VINTR INTR ^C
VQUIT QUIT ^\\‘ \34
VSUSP SUSP ^Z
VDSUSP DSUSP ^Y
VSTART START ^Q
VSTOP STOP ^S
VLNEXT LNEXT ^V
VDISCARD DISCARD ^O
VMIN --- 1
VTIME --- 0
VSTATUS STATUS ^T

変更可能な特殊制御文字 ( 特殊文字 参照) の 1 つの値が {_POSIX_VDISABLE} であるなら、その関数は使用不可能です。すなわち、入力データは利用不可能な特殊文字として認識されません。 ICANON が設定されないなら、 {_POSIX_VDISABLE} の値には、 c_cc 配列の VMINVTIME エントリについて特別な意味はありません。

open() 後でフラグと制御文字の初期値は、ヘッダ < sys/ttydefaults.h> の値に従って設定されます。

October 19, 2013 FreeBSD