Я действительно привык к символу статуса BSD ^ T, так как впервые начал использовать его еще в университете в 80-х. Он возник не из BSD, а из более старых операционных систем. Он по-прежнему работает и на современных системах BSD, включая Darwin. Это пример на MacOS, где я трижды нажимаю ^ T внутри grep, прежде чем нажимаю ^ D:
darwin% stty all
speed 38400 baud; 93 rows; 124 columns;
lflags: icanon isig iexten echo echoe echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel -iutf8
-ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf
discard dsusp eof eol eol2 erase intr kill lnext
^O ^Y ^D <undef> <undef> ^H ^C ^U ^V
min quit reprint start status stop susp time werase
1 ^\ ^R ^Q ^T ^S ^Z 0 ^W
darwin% grep foo
load: 0.05 cmd: grep 7227 waiting 0.00u 0.00s
load: 0.05 cmd: grep 7227 waiting 0.00u 0.00s
load: 0.05 cmd: grep 7227 waiting 0.00u 0.00s
И это то же самое на OpenBSD, где это даже лучше, так как я получаю канал ожидания
openbsd% stty all
speed 38400 baud; 93 rows; 124 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
-extproc -xcase
iflags: -istrip icrnl -inlcr -igncr -iuclc ixon -ixoff ixany imaxbel
-ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -ocrnl -onocr -onlret -olcuc oxtabs -onoeot
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -mdmbuf
discard dsusp eof eol eol2 erase intr kill lnext
^O ^Y ^D <undef> <undef> ^H ^C ^U ^V
min quit reprint start status stop susp time werase
1 ^\ ^R ^Q ^T ^S ^Z 0 ^W
openbsd% grep foo
load: 0.67 cmd: grep 3759 [ttyin] 0.00u 0.02s 0% 190k
load: 0.67 cmd: grep 3759 [ttyin] 0.00u 0.02s 0% 190k
load: 0.67 cmd: grep 3759 [ttyin] 0.00u 0.02s 0% 190k
Как вы видите, это действительно здорово знать, что делает программа, когда кажется, что она пошла на юг. Обратите внимание, что в OpenBSD он показывает не только канал ожидания, но и объем памяти процесса и процент загрузки процессора.
Мой вопрос: есть ли способ заставить это работать на Linux?
Тем не менее, он не работает в Linux, так есть ли способ заставить его работать? Кто-нибудь уже сделал это? Кажется, для этого достаточно места в c_ch[]
, так как в Linux, похоже, много заполнений неиспользуемыми слотами.
Вот файл Linux /usr/include/bits/termios.h
:
#define NCCS 32
struct termios
{
tcflag_t c_iflag; /* input mode flags */
tcflag_t c_oflag; /* output mode flags */
tcflag_t c_cflag; /* control mode flags */
tcflag_t c_lflag; /* local mode flags */
cc_t c_line; /* line discipline */
cc_t c_cc[NCCS]; /* control characters */
speed_t c_ispeed; /* input speed */
speed_t c_ospeed; /* output speed */
#define _HAVE_STRUCT_TERMIOS_C_ISPEED 1
#define _HAVE_STRUCT_TERMIOS_C_OSPEED 1
};
/* c_cc characters */
#define VINTR 0
#define VQUIT 1
#define VERASE 2
#define VKILL 3
#define VEOF 4
#define VTIME 5
#define VMIN 6
#define VSWTC 7
#define VSTART 8
#define VSTOP 9
#define VSUSP 10
#define VEOL 11
#define VREPRINT 12
#define VDISCARD 13
#define VWERASE 14
#define VLNEXT 15
#define VEOL2 16
Похоже, что в массиве Linux c_cc[]
определено 17 из 32 слотов. Можно ли их действительно использовать? Интересно, почему они не помечены как запчасти?
В OpenBSD /use/include/sys/termios.h
содержит:
/*
* Special Control Characters
*
* Index into c_cc[] character array.
*
* Name Subscript Enabled by
*/
#define VEOF 0 /* ICANON */
#define VEOL 1 /* ICANON */
#if __BSD_VISIBLE
#define VEOL2 2 /* ICANON */
#endif
#define VERASE 3 /* ICANON */
#if __BSD_VISIBLE
#define VWERASE 4 /* ICANON */
#endif
#define VKILL 5 /* ICANON */
#if __BSD_VISIBLE
#define VREPRINT 6 /* ICANON */
#endif
/* 7 spare 1 */
#define VINTR 8 /* ISIG */
#define VQUIT 9 /* ISIG */
#define VSUSP 10 /* ISIG */
#if __BSD_VISIBLE
#define VDSUSP 11 /* ISIG */
#endif
#define VSTART 12 /* IXON, IXOFF */
#define VSTOP 13 /* IXON, IXOFF */
#if __BSD_VISIBLE
#define VLNEXT 14 /* IEXTEN */
#define VDISCARD 15 /* IEXTEN */
#endif
#define VMIN 16 /* !ICANON */
#define VTIME 17 /* !ICANON */
#if __BSD_VISIBLE
#define VSTATUS 18 /* ICANON */
/* 19 spare 2 */
#endif
#define NCCS 20
Интересно, почему под Дарвином так много запчастей, учитывая, что под OpenBSD есть только две запчасти? Но даже в этом случае, похоже, это должно быть возможно, поэтому я не могу представить, чтобы никто не взламывал их ядро (как stty (1) и т.д.) Для его поддержки.
Есть какие-нибудь указатели на рабочие реализации, прежде чем я запачкаю руки?