неканонический и неэхо-режим не работает с трубой - PullRequest
1 голос
/ 22 марта 2019

В последнее время я пытаюсь написать простую версию команды Linux more. Для этого мне нужно войти в неканонический режим и режим без эха в терминале, чтобы я сразу получил ввод после нажатия клавиши, и терминал не отображал символ I типа.

Я сделал это так:

  // set the terminal mode
  struct termios tm;
  tcgetattr(STDIN_FILENO, &old);
  tm = old;
  tm.c_lflag &= ~(ICANON | ECHO);
  tm.c_cc[VMIN] = 1;
  tm.c_cc[VTIME] = 0;
  tcsetattr(STDIN_FILENO, TCSADRAIN, &tm);

Это работает, когда я использую аргументы типа

more test_file

Но когда я попытался передать more другой командой, например

ls /bin | more

Терминал вернулся в канонический режим и режим эха. Почему это происходит?

1 Ответ

2 голосов
/ 22 марта 2019

Вообще говоря, такие вещи, как more, должны считываться из stderr (или иногда /dev/tty, но stderr работает лучше).Вместо этого вы устанавливаете терминал на stdin.Это не очень хорошо работает.

...