Como fazer o ^ T funcionar para o char de status no Linux?

1

Eu me acostumei bastante com o status char do BSD, ^ T, desde que comecei a usá-lo na universidade durante os anos 80. Ele não se originou do BSD, mas veio de sistemas operacionais mais antigos. Ele ainda funciona em sistemas modernos da BSD, incluindo Darwin. Este é um exemplo no MacOS, onde eu acertei ^ T três vezes dentro do grep antes de apertar ^ 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

E isso é a mesma coisa no OpenBSD, onde é ainda melhor, já que eu recebo o canal de espera

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

Como você vê, é realmente ótimo saber o que um programa está fazendo quando parece ter ido para o sul. Observe como no OpenBSD ele mostra não apenas o canal de espera, mas a memória do processo e a porcentagem da CPU.

A minha pergunta é: existe alguma maneira de fazer isso funcionar no Linux?

No entanto, isso não funciona no Linux, então há alguma maneira de fazer isso funcionar? Alguém já fez isso? Parece haver espaço suficiente para isso na matriz c_ch[] , já que o Linux parece ter muito preenchimento com espaços não utilizados.

Aqui está o arquivo /usr/include/bits/termios.h do 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

Parece que há 17 de 32 slots na matriz Linux c_cc[] definida. Podem aqueles verdadeiramente ser usados? Eu me pergunto por que eles não são marcados como peças de reposição.

No OpenBSD, /use/include/sys/termios.h tem isso:

/*
 * 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

Eu me pergunto por que parece haver tantas peças sob o Darwin, já que existem apenas duas peças no OpenBSD. Mas, mesmo assim, parece que isso deve ser possível, então não posso imaginar que ninguém tenha hackeado seu kernel (como stty (1), etc) para suportá-lo.

Quaisquer sugestões para implementar implementações antes de eu sujar as mãos?

    
por tchrist 25.08.2011 / 00:31

0 respostas