Что вообще делает `stty line NUMBER`?

Используйтеsed

sed 's/./&\&/g;s/.$//'
2
11.11.2019, 18:19
2 ответа

stty line Nпочти ничего не делает.

Чтобы изменить линейную дисциплину в Linux, он должен вызвать ioctl(TIOCSETD), но он этого не делает; stty line Nпросто изменяет (не -стандартное)c_lineполе структуры termios, а затем вызываетtcsetattr(3)-> ioctl(TCSETS*), что просто изменит поле c_line, которое будет возвращено последующимtcgetattr(3)-> ioctl(TCGETS)звонки.

В конце этого ответа приведен небольшой пример программы на C, которая действительно должна изменить линейную дисциплину на своем стандартном вводе fd.

Это не единственный способ, stty(1)неадекватный; sttyтакже не может устанавливать «нестандартные -» скорости передачи данных (, что можно было бы легко сделать в Linux с помощью TCSETS2/ TCSETSW2/ TCSETSF2ioctl, но которые, к сожалению, не представлены в стандартной библиотеке 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.

2
27.01.2020, 21:58

Линейные дисциплины — это слой между драйвером tty и ядром tty (см. эту картинку, из здесь):enter image description here

Если вы установите его на 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
27.01.2020, 21:58

Теги

Похожие вопросы