LINUX.ORG.RU

Совместное использование терминала


0

0

Hi
Напрягло меня руководство учебным заданием для одной студентки.
Структура системы такова:
сервер, который при старте запускает свой шелл
шелл, который понимает пару команд и передает их серверу, а сервер их выполняет
тестовые программы, запускаемые из моего шелла и общающиеся с сервером.
Сервер демоном не является, так как от термнала отцепляться нельзя.
В общем все работает, только возникает след. проблема:
Все эти программы и сервер пишут на один терминал. И получается, что при выводе программы чего-то на консоль,
она спит, пока я из шелла не введу некоторую команду или просто Enter не нажму.

Как это можно победить?
Т.е. я хочу чтобы все проги спокойно писали себе на консоль без моего вмешательства.

★★★★

Вообще-то все это немножко закручено (или просто я не понял ничего)... :) В общем, могу сказать, что в ncurses вывод на экран реализован следующим образом: кроме непосредственной видеопамяти, содержимое которой отображается на экране, сама библиотека работает с виртуальной памятью - копией видеопамяти. Все текущие действия, например, вывод текста на экран, отображаются в виртуальной памяти, а потом, по команде refresh() или redrawwin() содержимое виртуальной памяти переписывается в видеопамять. Похоже, что в приведенном примере происходит что-то подобное и перерисовка экрана производится при появлении чего-то в потоке stdin. В общем-то все это только теория, а вот по поводу практики... Посмотри в man terminfo - там есть ссылка на некий "ключ" key_refresh - для перерисовки экрана. Насколько я понимаю у этого "ключа" должна быть своя escape-последовательность, при добавлении которой в выводимую строку, по идее, должна будет происходить перерисовка видеопамяти. Какова эта escape-последовательность - сказать не могу...

Akan
()

скорее всего тебе нужно сделать два пайпа, потом fork, потом
(ну вообщем приблизительно так)

int pipes[2];
pid_t pid;
ssize_t s;
char outbuf[1024];

pipe(pipes);
pid = fork();
if (pid == 0) {
dup2(pipes[1], STDOUT_FILENO);
dup2(pipes[1], STDERR_FILENO);
fcntl(pipes[0], F_SETFL, O_NONBLOCK); /* важный момент - режим неблокирования, чтобы не тормозился
вывод на терминал */
.................
/* здесь запускаешь команду, какую надо, например execlp(.....) */
_exit(1);
}

while(1) {

s = read(pipes[0], outbuf, 10 /*например 10 */);
if (s == -1)
waitpid(0, NULL, WUNTRACED);
else {
outbuf[s] = '\0';
write(pipes[1], outbuf, 10);
}

}

close(pipes[0]);
close(pipes[1]);

DOBRO
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.