2014-09-01 2 views
2

В настоящее время я пытаюсь написать минимальный терминальный мультиплексор, используя ncurses. Однако, когда я пытаюсь сделать execv оболочку, она не печатает в окне и вместо этого запускает новый подпроцесс, который принимает управление окном (т. Е. Игнорирует ncurses).Shell в окне ncurses?

Как я могу предотвратить это и контролировать ncurses? Есть ли способ получить tty и контролировать это?

EDIT

Благодаря Росс Ридж в комментариях, теперь я знаю, что мне нужно, чтобы создать псевдо-терминал, который я тогда прочитал в Ncurses окно. Однако я не могу понять, как заставить stdout печатать в окне ncurses. Есть ли функция ncurses, которая считывает дескрипторы файлов? Или мне нужно использовать read() с printw() как-нибудь?

+4

Вам нужно будет использовать терминал psuedo. Это не будет так легко, как вы надеялись. –

+0

Посмотрите, что делает GNU mc (midnight commander). Он реализует нечто похожее на то, что вы хотите. – fuz

ответ

5

Вам нужно будет сделать примерно следующее:

  • Создать (PTY псевдотерминала). Вы не указываете, какую ОС вы используете, но если это POSIX, то поможет man pty. Также смотрите на openpty
  • Ведомый конец pty должен быть подключен к тому, что вы используете (например, оболочка), тогда как главный конец должен быть подключен к вашему эмулятору терминала.
  • Вы, таким образом, должны fork(), и у ребенка, dup2 ведомое Fd на stdin, stdout и stderr
  • Затем вам нужно подключить мастер FD в родительском к среде Ncurses (для вывода) и клавиатура (для ввода).

This answer, This answer и this answer может быть полезным, но я рекомендую особенно первый дал это относится Stephens' Advanced Programming in the UNIX Environment (я связан с более современным изданием), а source code можно скачать. Купите книгу, потому что это неоценимый ресурс, но если вы посмотрите в каталоге pty (я не буду копировать и вставлять по причинам авторского права), вы найдете хороший пример forkpty.

Это оставляет вопрос о том, как вы получаете данные на выходе из процесса, который вы используете, до ncurses. Ну, вам нужно написать эмулятор терминала. Выберите терминал, который вы хотите эмулировать, прочитайте все управляющие последовательности, которые он использует, и реализуйте все из них.

Если это звучит как тяжелая работа (какая она есть), я предлагаю вам вместо этого использовать tmux или screen; последний делает именно то, что вы хотите, включая полный эмулятор терминала VT100/ANSI; первая почти такая же полная. tmux - лицензионная программа BSD, что означает, что вы можете просто адаптировать источник для выполнения своих ставок в маловероятном случае, если это еще не сделано. screen - это GPL, поэтому, если ваша программа также не является GPL, она предназначена только для вдохновения.

+0

Книга Стивена UNIX, безусловно, должна владеть. Между ним и файлами BSD есть все, что вам нужно для программирования в UNIX. –

+1

[libvterm] (http://www.leonerd.org.uk/code/libvterm/) является хорошим вариантом для этого, это то, что Neovim использует для своего терминального окна. – s4y

Смежные вопросы