Подскажите пожалусто как написать эмулятор терминала под Линукс на С/С++.
Я слышал для этого используется функция openpty.
Как её использовать?
Заранее благодарен.
Эмулятор терминала
Модератор: Модераторы разделов
-
JaGoTerr
- Сообщения: 380
Re: Эмулятор терминала
Типичный вопрос. Дело в том, что документация по функции openpty находится в крайне нестандартном месте и найти её практически невозможно, если заранее не знать где она лежит. Я только что спросил у знакомого гуру - он открыл мне секрет. Правда теперь я должен ему за это 100 долларов. Вот такая вот ценная информация. Так вот, сообщаю государственную, можно сказать, тайну:
Код: Выделить всё
man openpty-
TwisT
- Сообщения: 265
- ОС: Debian
Re: Эмулятор терминала
Да лучше пример в гугле поиши, в МАНе толком ничего не написано, только в общих чартах, да и если с языком траблы нифига не поимешь.
Linux user #432536.
-
Asgard
- Сообщения: 215
- Статус: North Valfader
Re: Эмулятор терминала
для этого юзаются псевдотерминалы.
алгоритм такой:
1) открываете master terminal device(man getpt || man posix_openpt || open("/dev/ptmx", O_RDWR))
2) unlo'чите терминал(man unlock)
3) получаете имя slave terminal device(man ptsname)
4) делаете fork()
5) в дочернем процессе открываете slave terminal device, используя имя, полученное ptsname
6) в дочернем: отвязываете процесс от терминала(man setsid)
7) в дочерернем: дублируете полученный дескриптор слейва в STDIN_FILENO, STDERR_FILENO и STDEOUT_FILENO (man dup2)
8) дальше(в том же дочернем процессе) идёт что-то вроде execl("/bin/bash", ..., NULL);
9) в дочернем: закрываем слейв
10) далее восновном процессе с помощью select совершаем нужные нам манипуляции с вводом/выводом
алгоритм такой:
1) открываете master terminal device(man getpt || man posix_openpt || open("/dev/ptmx", O_RDWR))
2) unlo'чите терминал(man unlock)
3) получаете имя slave terminal device(man ptsname)
4) делаете fork()
5) в дочернем процессе открываете slave terminal device, используя имя, полученное ptsname
6) в дочернем: отвязываете процесс от терминала(man setsid)
7) в дочерернем: дублируете полученный дескриптор слейва в STDIN_FILENO, STDERR_FILENO и STDEOUT_FILENO (man dup2)
8) дальше(в том же дочернем процессе) идёт что-то вроде execl("/bin/bash", ..., NULL);
9) в дочернем: закрываем слейв
10) далее восновном процессе с помощью select совершаем нужные нам манипуляции с вводом/выводом