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

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

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(), поэтому мой вопрос: как добиться чего-то похожего на windows?

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

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

1

Решение

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

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

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

0

Другие решения


По вопросам рекламы [email protected]