根据这页面,这个字段描述了“行规则”,它决定了当用户按下backspace或^C时会发生什么,本质上,当程序调用read(2)时会发生什么。
然而,设置它似乎没有任何效果。在我的Linux机器上,我有两个行规则:
$ cat /proc/tty/ldiscs
n_tty 0
n_null 27但$ stty line 27似乎没有影响任何事情。后置空间仍然正常工作。
但是,如果我做了$ stty -icanon,我确实看到了一个变化
这里发生了什么事?
发布于 2019-11-11 18:42:09
行规则是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时,您在raw模式下设置了默认的行规则。
发布于 2019-11-11 22:25:35
stty line N什么也不做。
要更改Linux上的行规则,它应该调用ioctl(TIOCSETD),但它不会这样做;stty line N只是更改termios结构的(非标准的) c_line字段,然后调用tcsetattr(3) -> ioctl(TCSETS*),这将简单地更改将由后续tcgetattr(3) -> ioctl(TCGETS)调用返回的c_line字段。
在这个答案的末尾是小的C示例程序,它应该真正改变它的stdin fd上的行纪律。
这并不是stty(1)不足的唯一方法;stty也不能设置“非标准”波特率(这可以在Linux上使用D9 ioctls轻松完成,但不幸的是,标准C库中没有公开,stty也没有使用)。
$ cat > tiocsetd.c <<'EOT'
#include
#include
#include
#include
#include
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要恢复它,请从另一个终端运行./tiocsetd 0 (用实际的tty替换/dev/pts/4 ),然后按^C。
https://unix.stackexchange.com/questions/551611
复制相似问题