首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘`stty line NUMBER`’到底在做什么?

‘`stty line NUMBER`’到底在做什么?
EN

Unix & Linux用户
提问于 2019-11-11 16:19:01
回答 2查看 1.3K关注 0票数 2

根据页面,这个字段描述了“行规则”,它决定了当用户按下backspace或^C时会发生什么,本质上,当程序调用read(2)时会发生什么。

然而,设置它似乎没有任何效果。在我的Linux机器上,我有两个行规则:

代码语言:javascript
复制
$ cat /proc/tty/ldiscs
n_tty       0
n_null     27

$ stty line 27似乎没有影响任何事情。后置空间仍然正常工作。

但是,如果我做了$ stty -icanon,我确实看到了一个变化

这里发生了什么事?

EN

回答 2

Unix & Linux用户

发布于 2019-11-11 18:42:09

行规则是tty驱动程序和tty核心之间的一个层(参见这里中的这幅图):

如果将其设置为27 (tty_null),则日期通过图表的左侧(跳过行规则)。如果将其设置为0,则会通过默认的行规则来处理原始输入和熟输入。

代码语言:javascript
复制
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,您会注意到以下内容:

代码语言:javascript
复制
$ cat /proc/tty/ldiscs 
n_tty       0
slip        1
n_null     27

当您执行$ stty line 27时,您删除了行规则(将其设置为空行规则),在执行$ stty -icanon时,您在raw模式下设置了默认的行规则。

票数 3
EN

Unix & Linux用户

发布于 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也没有使用)。

代码语言:javascript
复制
$ 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。

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/551611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档