Создание псевдотерминала в C++, который может использоваться другими программами

Я создал псевдотерминал в C++, используя следующий код:

int main(int, char const *[])
{
  int master, slave;
  char name[1024];
  char mode[] = "0777"; //I know this isn't good, it is for testing at the moment
  int access;

  int e = openpty(&master, &slave, &name[0], 0, 0);
  if(0 > e) {
    std::printf("Error: %s\n", strerror(errno));
    return -1;
  }

  if( 0 != unlockpt(slave) )
  {
      perror("Slave Error");
  }

  access = strtol(mode, 0, 8);

  if( 0 > chmod(name, access) )
  {
      perror("Permission Error");
  }

  //std::cout << "Master: " << master << std::endl;
  std::printf("Slave PTY: %s\n", name);

  int r;
  prompt = "login: ";

  while(true) 
  {
    std::cout << prompt << std::flush;
    r = read(master, &name[0], sizeof(name)-1);
    checkInput(name);
    name[r] = '\0';
    std::printf("%s", &name[0]);
    std::printf("\n");
  }

  close(slave);
  close(master);

  return 0;
}

Это работает довольно хорошо в том смысле, что из другого терминала я могу сделать:

printf 'username'> / dev / pts / x

и он будет отображаться и обрабатываться как следует.

У меня вопрос: когда я пытаюсь использовать экран, на экране терминала ничего не появляется. Затем, когда я печатаю, он попадает к моему рабу по 1 символу за раз.

Кто-нибудь знает почему это? Или как я могу это исправить.

Я могу предоставить более подробную информацию, если требуется.

Спасибо:)

2 ответа

Потому что вы не очищаете буфер после использования printf,

Поскольку ответ Пауля уже предполагает, что вам нужно очистить буфер.

Для этого вы можете использовать функцию tcflush.

Первый аргумент — это int дескриптора файла, а второй может быть одним из следующих:

  • TCIFLUSH Сбрасывает входные данные, полученные системой, но не прочитанные приложением.

  • TCOFLUSH Сбрасывает выходные данные, которые были записаны приложением, но не отправлены на терминал.

  • TCIOFLUSH Сбрасывает как входные, так и выходные данные.

Для получения дополнительной информации см.: https://www.ibm.com/docs/en/zos/2.3.0?topic=functions-tcflush-flush-input-output-terminal .

Другие вопросы по тегам