1

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

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

0