`stty line NUMBER`は正確に何をしていますか?

`stty line NUMBER`は正確に何をしていますか?

~によるとこれこのページでは、このフィールドは、ユーザーがバックスペースキーまたは^ Cを押したときに発生する結果を決定する「行規則」を説明します。本質的にプログラムがread(2)

しかし、設定には何の影響もないようです。私のLinuxボックスには2つの行規則があります。

$ cat /proc/tty/ldiscs
n_tty       0
n_null     27

しかし、$ stty line 27何の影響も与えないようです。バックスペースキーはまだうまく機能します。

ただし、これを行うと$ stty -icanon1つの変更が表示されます。バックスペースキーが正しく機能しなくなり、プログラムは内容を文字ごとに読み込みます(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_linetcsetattr(3)ioctl(TCSETS*)c_linetcgetattr(3)ioctl(TCGETS)

この回答の終わりには、stdin fdの行規則を実際に変更する必要がある小さなCサンプルプログラムがあります。

stty(1)これがこの方法の唯一の欠点ではありません。stty「非標準」ボーレートを設定する方法もありません。 (これはLinuxでTCSETS2// TCSETSW2ioctlを使用して簡単に実行できますが、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

関連情報