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
/ TCSETSF2
ioctl, но которые, к сожалению, не представлены в стандартной библиотеке 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
.
Линейные дисциплины — это слой между драйвером 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
, вы установили линейную дисциплину по умолчанию в необработанном режиме.