~에 따르면이것페이지에서 이 필드는 사용자가 백스페이스 키나 ^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_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
.