Как заставить ^ T работать для статуса char под Linux?

355
tchrist

Я действительно привык к символу статуса 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, похоже, много заполнений неиспользуемыми слотами.

Вот /usr/include/bits/termios.hфайл Linux :

#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 

Похоже, что в c_cc[]массиве Linux определены 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) и т. Д.) Для его поддержки.

Есть какие-нибудь указатели на рабочие реализации, прежде чем я запачкаю руки?

1

0 ответов на вопрос