Por que alterar as configurações do tty em um descritor de arquivo afeta outro?

2
A configuração

ECHO está ativada em stdin e stdout por padrão. Mas por que se desabilitamos ECHO no stdin, ele também está desabilitado em stdout ? Eles têm dois descritores separados - 0 e 1 , então por que eles são alterados simultaneamente como se tivessem um único descritor de arquivo?

O programa a seguir demonstra isso:

#include <termios.h>
#include <unistd.h>
#include <stdio.h>

int main(void)
{
  struct termios tty_stdin;
  struct termios tty_stdin_restore;
  struct termios tty_stdout;
  tcgetattr(STDIN_FILENO, &tty_stdin);
  tcgetattr(STDIN_FILENO, &tty_stdin_restore);

  /* disable echo on stdin */
  tty_stdin.c_lflag &= (tcflag_t) ~ECHO;
  tcsetattr(STDIN_FILENO, TCSANOW, &tty_stdin);

  /* observe that it was automatically disabled on stdout */
  tcgetattr(STDOUT_FILENO, &tty_stdout);
  printf("STDOUT ECHO after changing STDIN: %d\n", tty_stdout.c_lflag & ECHO ? 1 : 0);

  tcsetattr(STDIN_FILENO, TCSANOW, &tty_stdin_restore);
  return 0;
}
    
por Igor Liferenko 09.07.2017 / 04:23

1 resposta

3

Você está alterando atributos do dispositivo, não o descritor de arquivo. O descritor de arquivos é apenas uma maneira de identificar qual dispositivo você está falando. Se stdin e stdout forem os mesmos tty ( /dev/pts/0 por exemplo), então não importa qual você usar para tcgetattr e tcsetattr .

Como o eco, por definição, envolve entrada e saída, é difícil imaginar o que pode significar que o eco seja ativado na entrada e não na saída, ou vice-versa. Ou o driver tty irá ecoar ou não. Você tinha um objetivo em mente que envolve modificar o comportamento do eco de alguma forma? Se sim, diga o que você está tentando realizar e talvez alguém saiba como fazê-lo corretamente.

    
por 09.07.2017 / 05:59