`stty line NUMBER`는 정확히 무엇을 하고 있나요?

`stty line NUMBER`는 정확히 무엇을 하고 있나요?

~에 따르면이것페이지에서 이 필드는 사용자가 백스페이스 키나 ^C를 누를 때 발생하는 결과를 결정하는 "줄 규칙"을 설명합니다. 본질적으로 프로그램이 read(2).

하지만 설정에는 아무런 영향이 없는 것 같습니다. 내 Linux 상자에는 두 가지 줄 규칙이 있습니다.

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

하지만 $ stty line 27아무 영향도 미치지 않는 것 같습니다. 백스페이스 키는 여전히 잘 작동합니다.

그러나 이렇게 하면 $ stty -icanon한 가지 변경 사항이 나타납니다. 백스페이스 키가 더 이상 제대로 작동하지 않고 프로그램이 내용을 문자별로 읽습니다( read(2)항상 1문자만 반환되는 것 같습니다).

여기서 무슨 일이 일어나고 있는 걸까요?

답변1

와이어 규율은 tty 드라이버와 tty 코어 사이의 계층입니다(다음 이미지 참조).여기): 여기에 이미지 설명을 입력하세요.

27(tty_null)로 설정하면 날짜가 차트 왼쪽을 가로지릅니다(행 규칙 건너뛰기). 0으로 설정되면 원시 입력을 처리할 수 있는 기본 연결 규칙을 전달하고요리입력하다.

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.

관련 정보