Разбиение терминала (Как разбить терминал на две независимые части?)

Модератор: Модераторы разделов

Headina
Сообщения: 11

Разбиение терминала

Сообщение Headina »

Здравствуйте. У меня есть задания по написания своего собственного командного интерпретатора. Я уже практически всё написал, но столкнулся с одной проблемой, которую я на данный момент не могу решить. Мне нужно у терминал «отколоть» последний рядок для нужд интерпретатора (вывод информации обо всех фоновых процессах). Помогите, как это можно сделать, что бы программы, которые запускает интерпретатор не использовали этот последний рядок, а использовали только верхнюю часть окна. Заранее спасибо за помощь!
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Разбиение терминала

Сообщение Uncle_Theodore »

Я думаю, ncurces -- это то, что Вам нужно.
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Разбиение терминала

Сообщение sergio »

Uncle_Theodore писал(а):
16.10.2007 16:37
Я думаю, ncurces -- это то, что Вам нужно.

ncurses :happy:
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Headina
Сообщения: 11

Re: Разбиение терминала

Сообщение Headina »

Я уже догодался что мне нужно именно ncurses. Только у меня возникают проблеммы с запуском внешних программ. Я их не могу заставить выводить туда куда нужно. Может приведёте примерчик?
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Разбиение терминала

Сообщение Uncle_Theodore »

Вот тут почитайте.
http://www.alexber220.narod.ru/ncurses/
Спасибо сказали:
Headina
Сообщения: 11

Re: Разбиение терминала

Сообщение Headina »

Я уже с ncurces вожусь неделю, всё никак не получается :( Самому ввести и вывести текст не проблема, а вот сделать так что бы и запускаемы программы выводили куда надо не получается.
Пожалуйста, приведите примерчик программы, которая запускает на выполнение команду к примеру "man man" и так что бы при запуске этой команды, команда "man man" занимала не весь экран, а одна строчка была свободна, в которой была размещена надпись к примеру: "this programm used ncurses". Заранее благодарен за помощь.
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Разбиение терминала

Сообщение sergio »

Headina писал(а):
16.10.2007 18:45
Я уже с ncurces вожусь неделю, всё никак не получается :( Самому ввести и вывести текст не проблема, а вот сделать так что бы и запускаемы программы выводили куда надо не получается.

Объяснили бы хоть в общих словах что пытались делать.
Ну, имхо топорный вариант, не вникая в тонкости ncurses, - ваш доморощенный ком-процессор запускает процесс так, чтобы у того стд-аут pipe-ился обратно компроцессору, считывает его из пайпа и выводит в свое окно...
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Разбиение терминала

Сообщение Liksys »

Это какаято хне, вестимо ///
Функции интерпретатора - исполнять команды/сценарии, а не сплитить терминал и не писать в нижнюю часть всякий мусор...
Спасибо сказали:
Headina
Сообщения: 11

Re: Разбиение терминала

Сообщение Headina »

2Darth Liksys: Мне по заданию нужно в нижней частеи экрана постоянно отбражать список фоновых процессов.
Может кто-то считает что это бессмысленно, может это и так, но всё-таки мне это нужно реализовать.
Может всё-таки кто-нить сможет мне помочь?

2sergio: Можешь свою мысль выразить ввиде кода, а то я в линуксе програмлю совсем недавно, и поэтому плоховато понял, про что ты рассказывал.
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Разбиение терминала

Сообщение sergio »

Headina писал(а):
16.10.2007 20:11
2sergio: Можешь свою мысль выразить ввиде кода, а то я в линуксе програмлю совсем недавно, и поэтому плоховато понял, про что ты рассказывал.

Могу выразить в виде ссылки: http://www.gnu.org/software/libc/manual/ht...Pipes-and-FIFOs
И цитаты оттуда:

Function: FILE * popen (const char *command, const char *mode)

The popen function is closely related to the system function; see Running a Command. It executes the shell command command as a subprocess. However, instead of waiting for the command to complete, it creates a pipe to the subprocess and returns a stream that corresponds to that pipe.

If you specify a mode argument of "r", you can read from the stream to retrieve data from the standard output channel of the subprocess. The subprocess inherits its standard input channel from the parent process.

Similarly, if you specify a mode argument of "w", you can write to the stream to send data to the standard input channel of the subprocess. The subprocess inherits its standard output channel from the parent process.


Говорю же - топорный вариант. Полагаю, надо как-то выдать чайлд-процессу все три потока, и stderr тож. Но это уж не ко мне. Там наверно что-нить с файлдескрипторами надо поиграться...
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Разбиение терминала

Сообщение v04bvs »

форкаемся.
потом с помощью dup2 перенаправляем stdout и stderr в предварительно подготовленные функцией pipe каналы и экзекаемся в нужную программу.
после этого запущенная программа выводит инфу не на экран, а в каналы. Интерпретатор все данные из каналов выводит с помощью соответствующих функций на экран (по ходу дела например можно раскрашивать stdout и stderr в разные цвета. Для самых крутых можно попробовать сделать так, чтобы можно было запускать другие curses приложения, и даже вторую копию интерпретатора.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Разбиение терминала

Сообщение Folderx »

Headina писал(а):
16.10.2007 16:42
Я уже догодался что мне нужно именно ncurses. Только у меня возникают проблеммы с запуском внешних программ. Я их не могу заставить выводить туда куда нужно. Может приведёте примерчик?

Может быть так, вывод программы идёт просто в буфер, а на экран отображается часть этого буфера + другой буфер(размером со строку внизу), вам же небольшие файлы надо ?
Можно вывод программы записывать, а потом из этого и другого собирать общий экран.

например один буфер хранит stdout команды ls ~
другой хранит вашу строчку, которую вы хотите

собрать экран из этих двух буферов(буфер можно оформить в виде массива строк)
Спасибо сказали:
Headina
Сообщения: 11

Re: Разбиение терминала

Сообщение Headina »

Мысли уловил, попытаюсь их реализовать!
Спасибо сказали:
Headina
Сообщения: 11

Re: Разбиение терминала

Сообщение Headina »

Вот написал тестовую программку. Всё работает просто замечательно, если запускаемая команда не использует стандартный ввод. Вот если использует - начинаются проблемы. Подскажите, что мне нужно сделать со стандартным вводом запускаемой программы, для того что бы будущий интерпретатор корректно работал.

Код:

#include <curses.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> WINDOW *w1, *w2; void cmd(void) { int fds[2]; int status; FILE *stream; pid_t pid; pipe(fds); switch (pid=fork()) { case 0: dup2(fds[1], STDOUT_FILENO); execlp("bash",0); exit(0); default: close(fds[1]); stream = fdopen(fds[0],"r"); if (!stream) { wprintw(w2, "error"); wrefresh(w2); return; } for(;;) { int c = fgetc(stream); if (c == EOF) break; wprintw(w1, "%c", c); wrefresh(w1); } pclose(stream); break; } mvwprintw(w2, 1, 2, "OK"); wrefresh(w2); } int main (int argc, char *argv[]) { initscr(); cbreak(); keypad(stdscr, TRUE); w1 = newwin(LINES-4, COLS, 0, 0); scrollok(w1, TRUE); wrefresh(w1); w2 = newwin(3, COLS, LINES-3, 0); mvwprintw(w2, 0, 2, "Hello World!"); wrefresh(w2); cmd(); char x[80]; int messageLength = 79; mvwgetnstr( w2, 1, 1, x, messageLength); endwin(); return 0; }
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Разбиение терминала

Сообщение sergio »

Headina писал(а):
19.10.2007 02:11
Вот написал тестовую программку. Всё работает просто замечательно, если запускаемая команда не использует стандартный ввод. Вот если использует - начинаются проблемы. Подскажите, что мне нужно сделать со стандартным вводом запускаемой программы, для того что бы будущий интерпретатор корректно работал.

Уже подсказывали. Для stdin и stderr сделать то же, что вы сделали для stdout.
Дальше, в теории, есть еще много разного, что вероятно стоит сделать... вот, например, как ваш терминал на контрол-Ц реагирует?

И еще, бога ради, не позорьтесь с этим:

Код: Выделить всё

for(;;) {
char c = fgetc(stream);
if (c == EOF)

инт там... браться за управление процессами и такие ошибки... это не смешно даже.
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Headina
Сообщения: 11

Re: Разбиение терминала

Сообщение Headina »

Это вообще-то моя первая программа, поэтому ничего постыдного в этом не вижу!
Спасибо сказали:
Headina
Сообщения: 11

Re: Разбиение терминала

Сообщение Headina »

Блин, помогите с stdin сделать то же, что я сделали для stdout. А то у меня никак не получается :(
Программы которые не используют stdin запускаются хорошо. Я запутался, ПОМОГИТЕ!
Заранее спасибо.
Спасибо сказали:
Headina
Сообщения: 11

Re: Разбиение терминала

Сообщение Headina »

Тут ещё наткнулся на такую проблемму, библиотека curses использует свои собственные функции ввода, а вызываемые команды используют стандартные функции, типа "scanf". Как обойти эту проблемы, что бы запускаемые команды правильно фунционировали?
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Разбиение терминала

Сообщение sergio »

Headina писал(а):
20.10.2007 18:53
Тут ещё наткнулся на такую проблемму, библиотека curses использует свои собственные функции ввода, а вызываемые команды используют стандартные функции, типа "scanf". Как обойти эту проблемы, что бы запускаемые команды правильно фунционировали?

Никак не обходить. Если вы считываете курсезами ввод пользователя и пишите его в пайп связанный с stdin запущенной программы, то она считывает оттуда ввод как обычно. Как раз когда она использует scanf и пр. проблем нет, проблемы могут быть если эта программа захочет сама использовать (свои) курсез.
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Headina
Сообщения: 11

Re: Разбиение терминала

Сообщение Headina »

sergio писал(а):
20.10.2007 23:18
Никак не обходить. Если вы считываете курсезами ввод пользователя и пишите его в пайп связанный с stdin запущенной программы, то она считывает оттуда ввод как обычно.

Хух, с этим вроде как разобрался.
sergio писал(а):
20.10.2007 23:18
Как раз когда она использует scanf и пр. проблем нет, проблемы могут быть если эта программа захочет сама использовать (свои) курсез.

Наткнулся на эту проблему. Вы не знаете как её решить?
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Разбиение терминала

Сообщение v04bvs »

Headina писал(а):
20.10.2007 18:53
Тут ещё наткнулся на такую проблемму, библиотека curses использует свои собственные функции ввода, а вызываемые команды используют стандартные функции, типа "scanf". Как обойти эту проблемы, что бы запускаемые команды правильно фунционировали?

Могу посоветовать почитать исходники: rxvt, screen. Уверен - вы почерпнёте оттуда немало ценных идей.
Спасибо сказали:
Headina
Сообщения: 11

Re: Разбиение терминала

Сообщение Headina »

2v04bvs: С вводом-выводом разобрался. Только что делать с программами, которые используют особые возможности терминала, типа mc???
Спасибо сказали: