~によるとこれこのページでは、このフィールドは、ユーザーがバックスペースキーまたは^ Cを押したときに発生する結果を決定する「行規則」を説明します。本質的にプログラムがread(2)
。
しかし、設定には何の影響もないようです。私のLinuxボックスには2つの行規則があります。
$ cat /proc/tty/ldiscs
n_tty 0
n_null 27
しかし、$ stty line 27
何の影響も与えないようです。バックスペースキーはまだうまく機能します。
ただし、これを行うと$ stty -icanon
1つの変更が表示されます。バックスペースキーが正しく機能しなくなり、プログラムは内容を文字ごとに読み込みます(read(2)
常に1文字だけが返されるようです)。
ここで何が起こっているのでしょうか?
答え1
ワイヤ規律は、ttyドライバとttyコアの間の階層です(次の画像を参照)。ここ):
27(tty_null)に設定すると、日付はチャートの左側を横切ります(行ルールをスキップ)。 0に設定されている場合は、raw入力を処理できる基本的な接続規則を渡します。料理入力する。
TTY(0)
The default line discipline, providing transparent operation (raw mode)
as well as the habitual terminal line editing capabilities (cooked mode).
その他の科目リストはここ。
自分で作成したり、既存のものを使用したりできます。モジュールがあり、slip
それを接続すると、modprobe slip
次のことがわかります。
$ cat /proc/tty/ldiscs
n_tty 0
slip 1
n_null 27
これにより$ stty line 27
ラインルールが削除され(空のラインルールに設定されます)、これによりネイティブモードでデフォルトの$ stty -icanon
ラインルールが設定されます。
答え2
stty line N
多くのことは行われませんでした。
Linux で回線ルールを変更するには、次を呼び出す必要があります。ioctl(TIOCSETD)
しかし、そうしません。 ->を呼び出す前にtermios構造のstty line N
(非標準)フィールドを変更してください。これは単に後続 - >呼び出しで返されるフィールドを変更します。c_line
tcsetattr(3)
ioctl(TCSETS*)
c_line
tcgetattr(3)
ioctl(TCGETS)
この回答の終わりには、stdin fdの行規則を実際に変更する必要がある小さなCサンプルプログラムがあります。
stty(1)
これがこの方法の唯一の欠点ではありません。stty
「非標準」ボーレートを設定する方法もありません。 (これはLinuxでTCSETS2
// TCSETSW2
ioctlを使用して簡単に実行できますが、TCSETSF2
残念ながら標準Cライブラリには公開されません。)は使用されませんstty
。
$ cat > tiocsetd.c <<'EOT'
#include <sys/ioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <err.h>
int main(int ac, char **av){
int o;
if(ioctl(0, TIOCGETD, &o)) err(1, "io(TIOCGETD)");
if(ac > 1){
int n, d = atoi(av[1]);
if(ioctl(0, TIOCSETD, &d)) err(1, "io(TIOCSETD)");
if(ioctl(0, TIOCGETD, &n)) err(1, "io(TIOCGETD)");
printf("%d -> %d => %d\n", o, d, n);
}else
printf("%d\n", o);
return 0;
}
EOT
$ cc -Wall tiocsetd.c -o tiocsetd
$ ./tiocsetd
0
$ tty
/dev/pts/4 ## << make a note of this
$ cat /proc/tty/ldiscs
n_tty 0
n_null 27
$ ./tiocsetd 27
<your tty is hugged ;-)>
これを復元するには、./tiocsetd 0 </dev/pts/4
別の端末で実行し(/dev/pts/4
実際のttyを置き換える)キーを押します^C
。