Как реализовать эмулятор терминала для Windows?

Вот немного шаблона C для создания и связи с терминальными программами в Linux (и, возможно, в других Unix-системах)

int master, slave;

struct winsize wsize = {24, 80, 0, 0}; // 24 rows and 80 columns

if (openpty(&master, &slave, NULL, NULL, &wsize) < 0)
  die("Failed to open the pty master/slave");

if (!fork()) {
  // child, set session id and copy the pty slave to std{in,out,err}
  setsid();
  dup2(slave, STDIN_FILENO);
  dup2(slave, STDOUT_FILENO);
  dup2(slave, STDERR_FILENO);
  close(master);
  close(slave);
  // then use one of the exec* variants to start executing the terminal program
}

// parent, close the pty slave
close(slave);
// At this point, we can read/write data from/to the master fd, and to the child
// process it would be the same as a user was interacting with the program

Я понимаю, что в окнах нет fork() или openpty(), поэтому мой вопрос: как добиться чего-то подобного в окнах?

Если возможно, я хотел бы увидеть минимальное количество рабочего кода C/C++, необходимого для выполнения следующих действий:

  • Создайте интерактивный сеанс cmd.exe, используя CreateProcess
  • Получите набор дескрипторов/файловых дескрипторов, которые можно использовать для чтения/записи данных из/в порожденный процесс таким образом, чтобы имитировать сеанс интерактивной консоли.

person Thiago de Arruda    schedule 25.07.2014    source источник
comment
Я ничего не нашел. Я не понимаю, как эта проблема связана с потоками?   -  person Thiago de Arruda    schedule 25.07.2014
comment
Какова функциональность fork? Можно ли использовать потоки вместо процесса?   -  person Thomas Matthews    schedule 25.07.2014
comment
Нет, вилка предназначена для создания нового процесса и запуска терминальной программы.   -  person Thiago de Arruda    schedule 25.07.2014
comment
Я бы не назвал то, что требуется, реализацией эмулятора терминала. PuTTY — эмулятор терминала. Я бы сказал, что вы спрашиваете, как взаимодействовать с консольным приложением Windows.   -  person CoreyStup    schedule 28.07.2014


Ответы (1)


Консоль Windows работает совсем не так, как консоль Linux. В Windows нет PTY или виртуальных консолей для создания или подключения. Вы в основном работаете в самой консоли Windows.

Затем вы будете обрабатывать все операции ввода-вывода самостоятельно, чтобы эмулировать терминал, отслеживая консоль как свое окно, координаты положения x/y, цвета и т. д.

Вы можете изучить что-то вроде PDcurses для окон, если вас интересуют текстовые интерфейсы.

person Mercyful    schedule 30.09.2015