Разбиение терминала (Как разбить терминал на две независимые части?)
Модератор: Модераторы разделов
-
Headina
- Сообщения: 11
Разбиение терминала
Здравствуйте. У меня есть задания по написания своего собственного командного интерпретатора. Я уже практически всё написал, но столкнулся с одной проблемой, которую я на данный момент не могу решить. Мне нужно у терминал «отколоть» последний рядок для нужд интерпретатора (вывод информации обо всех фоновых процессах). Помогите, как это можно сделать, что бы программы, которые запускает интерпретатор не использовали этот последний рядок, а использовали только верхнюю часть окна. Заранее спасибо за помощь!
-
Uncle_Theodore
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: Разбиение терминала
Я думаю, ncurces -- это то, что Вам нужно.
-
sergio
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: Разбиение терминала
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
Headina
- Сообщения: 11
Re: Разбиение терминала
Я уже догодался что мне нужно именно ncurses. Только у меня возникают проблеммы с запуском внешних программ. Я их не могу заставить выводить туда куда нужно. Может приведёте примерчик?
-
Uncle_Theodore
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: Разбиение терминала
Вот тут почитайте.
http://www.alexber220.narod.ru/ncurses/
http://www.alexber220.narod.ru/ncurses/
-
Headina
- Сообщения: 11
Re: Разбиение терминала
Я уже с ncurces вожусь неделю, всё никак не получается
Самому ввести и вывести текст не проблема, а вот сделать так что бы и запускаемы программы выводили куда надо не получается.
Пожалуйста, приведите примерчик программы, которая запускает на выполнение команду к примеру "man man" и так что бы при запуске этой команды, команда "man man" занимала не весь экран, а одна строчка была свободна, в которой была размещена надпись к примеру: "this programm used ncurses". Заранее благодарен за помощь.
Пожалуйста, приведите примерчик программы, которая запускает на выполнение команду к примеру "man man" и так что бы при запуске этой команды, команда "man man" занимала не весь экран, а одна строчка была свободна, в которой была размещена надпись к примеру: "this programm used ncurses". Заранее благодарен за помощь.
-
sergio
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: Разбиение терминала
Объяснили бы хоть в общих словах что пытались делать.
Ну, имхо топорный вариант, не вникая в тонкости ncurses, - ваш доморощенный ком-процессор запускает процесс так, чтобы у того стд-аут pipe-ился обратно компроцессору, считывает его из пайпа и выводит в свое окно...
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
Liksys
- Сообщения: 2910
Re: Разбиение терминала
Это какаято хне, вестимо ///
Функции интерпретатора - исполнять команды/сценарии, а не сплитить терминал и не писать в нижнюю часть всякий мусор...
Функции интерпретатора - исполнять команды/сценарии, а не сплитить терминал и не писать в нижнюю часть всякий мусор...
-
Headina
- Сообщения: 11
Re: Разбиение терминала
2Darth Liksys: Мне по заданию нужно в нижней частеи экрана постоянно отбражать список фоновых процессов.
Может кто-то считает что это бессмысленно, может это и так, но всё-таки мне это нужно реализовать.
Может всё-таки кто-нить сможет мне помочь?
2sergio: Можешь свою мысль выразить ввиде кода, а то я в линуксе програмлю совсем недавно, и поэтому плоховато понял, про что ты рассказывал.
Может кто-то считает что это бессмысленно, может это и так, но всё-таки мне это нужно реализовать.
Может всё-таки кто-нить сможет мне помочь?
2sergio: Можешь свою мысль выразить ввиде кода, а то я в линуксе програмлю совсем недавно, и поэтому плоховато понял, про что ты рассказывал.
-
sergio
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: Разбиение терминала
Могу выразить в виде ссылки: 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
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: Разбиение терминала
форкаемся.
потом с помощью dup2 перенаправляем stdout и stderr в предварительно подготовленные функцией pipe каналы и экзекаемся в нужную программу.
после этого запущенная программа выводит инфу не на экран, а в каналы. Интерпретатор все данные из каналов выводит с помощью соответствующих функций на экран (по ходу дела например можно раскрашивать stdout и stderr в разные цвета. Для самых крутых можно попробовать сделать так, чтобы можно было запускать другие curses приложения, и даже вторую копию интерпретатора.
потом с помощью dup2 перенаправляем stdout и stderr в предварительно подготовленные функцией pipe каналы и экзекаемся в нужную программу.
после этого запущенная программа выводит инфу не на экран, а в каналы. Интерпретатор все данные из каналов выводит с помощью соответствующих функций на экран (по ходу дела например можно раскрашивать stdout и stderr в разные цвета. Для самых крутых можно попробовать сделать так, чтобы можно было запускать другие curses приложения, и даже вторую копию интерпретатора.
-
Folderx
- Сообщения: 296
- ОС: fedora, mandriva
Re: Разбиение терминала
Может быть так, вывод программы идёт просто в буфер, а на экран отображается часть этого буфера + другой буфер(размером со строку внизу), вам же небольшие файлы надо ?
Можно вывод программы записывать, а потом из этого и другого собирать общий экран.
например один буфер хранит stdout команды ls ~
другой хранит вашу строчку, которую вы хотите
собрать экран из этих двух буферов(буфер можно оформить в виде массива строк)
-
Headina
- Сообщения: 11
Re: Разбиение терминала
Мысли уловил, попытаюсь их реализовать!
-
Headina
- Сообщения: 11
Re: Разбиение терминала
Вот написал тестовую программку. Всё работает просто замечательно, если запускаемая команда не использует стандартный ввод. Вот если использует - начинаются проблемы. Подскажите, что мне нужно сделать со стандартным вводом запускаемой программы, для того что бы будущий интерпретатор корректно работал.
Код:
#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: Разбиение терминала
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
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
Headina
- Сообщения: 11
Re: Разбиение терминала
Это вообще-то моя первая программа, поэтому ничего постыдного в этом не вижу!
-
Headina
- Сообщения: 11
Re: Разбиение терминала
Блин, помогите с stdin сделать то же, что я сделали для stdout. А то у меня никак не получается 
Программы которые не используют stdin запускаются хорошо. Я запутался, ПОМОГИТЕ!
Заранее спасибо.
Программы которые не используют stdin запускаются хорошо. Я запутался, ПОМОГИТЕ!
Заранее спасибо.
-
Headina
- Сообщения: 11
Re: Разбиение терминала
Тут ещё наткнулся на такую проблемму, библиотека curses использует свои собственные функции ввода, а вызываемые команды используют стандартные функции, типа "scanf". Как обойти эту проблемы, что бы запускаемые команды правильно фунционировали?
-
sergio
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: Разбиение терминала
Никак не обходить. Если вы считываете курсезами ввод пользователя и пишите его в пайп связанный с stdin запущенной программы, то она считывает оттуда ввод как обычно. Как раз когда она использует scanf и пр. проблем нет, проблемы могут быть если эта программа захочет сама использовать (свои) курсез.
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
Headina
- Сообщения: 11
Re: Разбиение терминала
Хух, с этим вроде как разобрался.
Наткнулся на эту проблему. Вы не знаете как её решить?
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: Разбиение терминала
Могу посоветовать почитать исходники: rxvt, screen. Уверен - вы почерпнёте оттуда немало ценных идей.
-
Headina
- Сообщения: 11
Re: Разбиение терминала
2v04bvs: С вводом-выводом разобрался. Только что делать с программами, которые используют особые возможности терминала, типа mc???