Операционная система UNIX. Руководство программиста

     

Программа two


Эта программа просматривает входной файл, выводя первую его страницу на экран терминала, с которого она была вызвана, а вторую - на терминал, имя которого указывается в командной строке. Затем она ждет нажатия пробела на одном из терминалов, после чего выводит на него следующую страницу.

Программа two - это простейший пример двухтерминальной curses-программы. Она не поддерживает уведомления и требует указания имени и типа второго терминала в командной строке. После этого на втором терминале нужно ввести команду sleep 100000, чтобы перевести его в неактивное состояние на время работы программы. Пользователь первого терминала должен иметь полномочия для ввода и вывода на втором терминале.

#include <curses.h> #include <signal.h>

SCREEN *me, *you; SCREEN *set_term ();

FILE *fd, *fdyou; char linebuf [512];

main (argc, argv) int argc; char **argv; { void done (), exit (); unsigned sleep (); char *getenv (); int c;

if (argc != 4) { fprintf (stderr, "usage: %s oterm otype ifile\n", argv [0]); exit (1); }

fd = fopen (argv [3], "r"); fdyou = fopen (argv [1], "w+"); signal (SIGINT, done); /* Красиво умереть */

me = newterm (getenv ("TERM"), stdout, stdin); /* Инициализация своего терминала */ you = newterm (argv [2], fdyou, fdyou); /* Инициализация второго терминала */

set_term (me); /* Устанавливаем режимы своего терминала */ noecho (); /* Отменяем эхо */ cbreak (); /* Включаем cbreak */ nonl (); /* Разрешаем переход к новой строке */ nodelay (stdscr, TRUE) /* Не зависаем на вводе */

set_term (you); /* Уст. реж. другого терминала */ noecho (); /* Отменяем эхо */ cbreak (); /* Включаем cbreak */ nonl (); /* Разрешаем переход к новой строке */ nodelay (stdscr, TRUE) /* Не зависаем на вводе */

/* Выдаем первый экран на свой терминал */ dump_page (me);

/* Выдаем второй экран на другой терминал */ dump_page (you);

for (;;) { /* Для каждого экрана */ set_term (me); c = getch (); /* Ждем, пока пользователь прочитает все это */ if (c == 'q') done (); if (c == ' ') dump_page (me); set_term (you); c = getch (); /* Ждем, пока пользователь прочитает все это */ if (c == 'q') done (); if (c == ' ') dump_page (you); sleep(1); } }


dump_page (term) SCREEN *term; { int line;

set_term (term); move (0, 0); for (line = 0; line < LINES - 1; line++) { if (fgetc (linebuf, sizeof linebuf, fd) == NULL) { clrtobot (); done (); } mvaddstr (line, 0, linebuf); } standout (); mvprintw (LINES - 1, 0, "--Еще--"); standend (); refresh (); /* Выводим */ }

/* Очищаем и заканчиваем */ void done () { /* Очищаем первый терминал */ set_term (me); move (LINES - 1, 0); /* В левый нижний угол */

clrtoeol (); /* Очищаем нижнюю строку */ refresh (); /* Все обновляем */ endwin (); /* Для выхода из curses */

/* Очищаем второй терминал */ set_term (you); move (LINES - 1, 0); /* В левый нижний угол */

clrtoeol (); /* Очищаем нижнюю строку */ refresh (); /* Все обновляем */ endwin (); /* Для выхода из curses */ exit (0); }




Содержание раздела