Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3590

.pdf
Скачиваний:
0
Добавлен:
15.11.2022
Размер:
7.67 Mб
Скачать

O_RDWR | O_APPEND)) < 0) return(&result); len = strlen(*arg);

if (write(fd, *arg, strlen(*arg)) != len) result = 1;

else

result = 0; close(fd);

return(&result); /*Возвращаем результат — адрес result*/

}

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

client.c

#include <rpc/rpc.h> #include "log.h"

main(int argc, char *argv[])

{

CLIENT *cl;

char *server, *mystring, *clnttime; time_t bintime;

int *result; if(argc != 2) {

fprintf(stderr, "Формат вызова: %s Адрес_хоста\n",argv[0]);

exit (1) ;

}

server = argv[l]; //Адрес хоста

/*Получим дескриптор клиента. В случае неудачи — сообщим о невозможности установления связи с сервером*/

61

if((cl = clnt_create(server,LOG_PROG, LOG_VER, "udp")) == NULL) {

clnt_pcreateerror(server); exit(2);

}

/*Выделим буфер для строки*/ mystring = (char *)malloc(100);

/*Определим время события*/

bintime = time((time_t *)NULL); clnttime = ctime(&bintime); sprintf(mystring,"%s — Клиент

запущен",clnttime);

/*Сообщение для журнала — время начала работы клиента. При неудаче — сообщим об ошибке*/

if((result = rlog_l(&mystring,cl) ) == NULL) {

fprintf(stderr,"error2\n"); clnt_perror(cl,server); exit(3);

}

/*B случае неудачи на удаленном компьютере сообщим об ошибке*/

if (*result != 0)

fprintf(stderr, "Ошибка записи в журнал\n"); /*Освободим дескриптор*/ clnt_destroy(cl);

exit(0);

}

Заглушка клиента log_clnt.c компилируется с модулем client.c для получения исполняемой программы клиента.

cc -о rlog client.c log_clnt.c -lnsl

Заглушка сервера log_svc.c и процедура log.c компилируются для получения исполняемой программы сервера.

cc -о logger log_svc.c log.c -lnsl

62

Теперь на некотором хосте server.nowhere.ru необходимо запустить серверный процесс:

$ logger

После этого при запуске клиента rlog на другой машине сервер добавит соответствующую запись в файл журнала.

Модули взаимодействуют следующим образом:

1.Когда запускается серверный процесс, он создает сокет UDP и выделяет локальный порт этому сокету. Далее сервер вызывает функцию svc_register для регистрации номеров программы и ее версии. Эта функция обращается к процессу portmap и передает требуемые значения. Процесс portmap запускается при инициализации системы и связывается с некоторым общеизвестным портом. Теперь portmap знает номер порта для программы и версии. Сервер же ожидает получения запроса.

2.Когда запускается программа rlog, она сначала вызывает функцию clnt_create, указывая ей адрес удаленной системы, номера программы и версии, а также транспортный протокол. Функция направляет запрос к серверу portmap удаленной системы server.nowhere.ru и получает номер удаленного порта для сервера журнала.

3.Клиент вызывает процедуру rlog_1, определенную в заглушке клиента, и передает управление заглушке. Та формирует запрос (преобразуя аргументы в формат XDR) в виде пакета UDP и направляет его на удаленный порт, полученный от сервера portmap. Затем она некоторое время ожидает отклика

ив случае неполучения отклика повторно отправляет запрос. При благоприятных обстоятельствах запрос принимается сервером logger (модулем заглушки сервера). Заглушка определяет, какая именно функция была вызвана (по номеру процедуры), и вызывает функцию rlog_1 модуля log.c. После возврата управления заглушка преобразует возвращенное функцией rlog_1( ) значение в формат XDR, и формирует отклик также в виде пакета UDP. После получения отклика заглушка клиента извлекает возвращенное значение, преобразует его и возвращает в головную программу клиента.

63

1.5. Разработка приложений для UNIX

Для создания графического пользовательского интерфейса на компьютерах, работающих под управлением ОС семейства UNIX, используется система X Window. Система реализует четыре базовых принципа: 1) сетевая организация на основе X-протокола; 2) оконный интерфейс; 3) хранение параметров приложений в виде набора «ресурсов»; 4) архитектура на основе управления по событиям.

Система X Window разработана в Массачусетском технологическом институте (США) в 1985 г. Некоторые принципы системы — такие, как оконный интерфейс и управление на основе событий нашли применение в других графических сре-

дах, в том числе в Microsoft Windows.

1.5.1. Сетевая организация системы X Window

Особенность сетевой организации системы X Window заключается в том, что она поддерживает работу приложений как на локальной ЭВМ, так и в сети. Система обеспечивает вывод информации на экран (экраны) ЭВМ, воспринимает сигналы от внешних устройств, таких как клавиатура и мышь, и передает их тем программам, которым они адресованы. Совокупность экранов и устройств ввода называется в терминах X Window дисплеем (или X-дисплеем).

Основой X Window является программа X-сервер. Это отдельный процесс, выполняющийся на компьютере, к которому подсоединен дисплей. В системе X Window должен существовать хотя бы один X-сервер.

Прикладные программы в системе X Window называют X-клиентами. От прикладных программ серверу идут пакеты, содержащие информацию о том, какие графические элементы следует отобразить на экране, а также сообщения для других прикладных программ. От сервера прикладным программам передаются пакеты, содержащие информацию о событиях (со-

64

общениях), инициированных внешними устройствами или другими прикладными программами. Обмен данными ведется асинхронно по X-протоколу.

X-протокол построен на основе стека TCP/IP. Если приложение работает на локальной машине, то обмен данными идет через адрес локального адаптера (который называется loopback или localhost adapter) - обычно это «127.0.0.1». Паке-

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

Оконный интерфейс системы X Window

Система создает на экране дисплея виртуальные подэкраны – окна для вывода данных приложений.

За внутреннюю часть окна отвечает приложение, а за обрамление его рамкой - X-сервер. Обычно обрамлением окон на сервере занимается специальный процесс, называемый оконным менеджером. Тип оконного менеджера определяет внешний вид окон на сервере.

Каждому приложению в системе X Window соответствует хотя бы одно окно. При этом все окна связываются в иерархию. Сам X-сервер на экране всегда создает одно основное окно, которое является верхним окном в иерархии (корневым) и родителем всем остальным окнам.

Ресурсы приложений в системе X Window

Как правило, приложение в системе X Window имеет набор конфигурационных параметров, или ресурсов, которые определяют внешний вид его интерфейса.

Совокупность функций для работы с ресурсами называется «менеджер ресурсов» (X Resource Manager). Хранилище

65

конфигурационных параметров программы называется базой данных ресурсов программы.

Принцип организации и использования ресурсов приложений применяется и в других графических средах (напри-

мер, в семействе Microsoft Windows).

Управление на основе событий (сообщений)

Особенность системы X Window заключается в том, что она организует общение между самими программами, а также между программами и внешней средой путем рассылки сообщений, называемых событиями.

Событие - это единица информации, идентифицирующая происходящие в системе изменения или действия, и содержащая сведения о них. Событие считается единицей, неделимой во времени, то есть не имеющей длительности. Предполагается, что события происходят и обрабатываются в системе «мгновенно» – то есть за интервалы времени, несопоставимые с длительностью интервалов между наступлением событий.

Управление на основе событий – это технология программирования интерактивных систем, применяемая во многих графических средах и ОС.

1.5.2. Создание программ для системы X Window

Каждую программу для X Window можно условно разбить на три части: подготовительную часть, которая отвечает за установление связи с сервером и подготовку начальных данных; основную часть, которая содержит цикл обработки сообщений; и функции, отвечающие за реакцию программы на различные события в системе. Более сложные программы могут содержать дополнительные модули, такие, как функция реакции на таймер или на отсутствие действий пользователя в системе.

Подготовительная часть программы и цикл обработки

66

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

Далее на простом примере рассмотрим последовательность действий и связанную с ней последовательность вызовов функций.

Любая программа, работающая в системе X Window, начинается с того, что устанавливает связь с X сервером. Затем нужно создать окно и показать его на дисплее. На этом подготовительная часть программы заканчивается.

Цикл обработки событий (сообщений) с точки зрения разработчика – это бесконечный цикл, который начинается сразу же вслед за подготовительной частью программы. На каждом шаге цикла прикладная программа должна запросить у системы параметры очередного наступившего события, затем в зависимости от того, какое событие наступило, выполнить некоторые действия или проигнорировать это событие. После чего можно переходить к обработке следующего события (сообщения) – т.е. возвращаться к началу цикла. Конечно, цикл является бесконечным только формально – реальная программы рано или поздно должна прервать его и завершиться. Обычно для завершения программы (прерывания цикла обработки сообщений) служит какое-то событие, выбранное разработчиком – это может быть, например, нажатие на кнопку «Выход» мышью на экране или на определенную клавишу клавиатуры.

Для получения у системы очередного события служит функция XNextEvent. Она помещает всю информацию о наступившем событии в структуру типа XEvent. Затем определяется тип наступившего события - для этого служит поле структуры XEvent.type. В общем виде цикл обработки событий (сообщений) в прикладной программе для X Window на языке «Си» имеет примерно следующий вид:

67

...

Display* ptDisplay;

XEvent ptEvent;

...

while (1)

{

XNextEvent(ptDisplay,&ptEvent);

switch (ptEvent.type)

{

case ...

...

case ...

...

} /* end switch */

}/* end while */

...

Программа в системе X Window завершается по вы-

бранному разработчиком событию обычным образом (доста-

точно вызвать функцию exit).

1.5.3.Программирование с управлением по сообщениям (событиям)

Программирование с управлением по сообщениям (событиям) – это технология программирования, вошедшая в употребление задолго до появления таких систем, как X Window. Она была положена в основу многих других систем с графическим оконным интерфейсом, в том числе и в Microsoft Windows.

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

68

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

То, что в прикладной программе для X Window не функции управляют данными, а наоборот – поступающие данные управляют поведением программы, принципиально отличает ее от традиционных программ с «линейным» программированием. События в системе X Window могут зависеть друг от друга и наступать одно за другим - и тогда их обработка будет идти последовательно; а могут быть не зависимы - и тогда нельзя четко сказать, в какой последовательности они будут обработаны. В этом смысле программирование с управлением по событиям имеет много общего с программированием параллельных взаимодействующих процессов, с той лишь разницей, что обработка событий всегда происходит в рамках одного процесса (с точки зрения ОС) и потому никогда два или более событий не могут обрабатываться одновременно.

В цикле обработки сообщений, построенном выше на основе библиотеки Xlib, ключевую роль играет вызов функции XNextEvent. Именно эта функция выбирает из потока поступающих данных программы очередное событие. Тип события определяет, по какому пути пойдет дальше работа программы

– где и как это событие будет обработано (в примере этому служит простейший оператор switch-case, но в реальной программе все может быть куда сложнее).

Более того, функция XNextEvent обращается к системе за очередным событием, но в потоке входящих данных на этот момент может и не быть новых событий. Тогда прикладной программе, по сути, нечего делать, и ее выполнение будет приостановлено до того, как наступит очередное событие.

Развитие этой технологии, где данные управляют поведением программы, предопределило бурный расцвет другой

69

технологии программирования – объектно-ориентированного программирования (ООП), которая также позволяет связать воедино данные и методы их обработки. Современные средства разработки предоставляют создателю программ инструментарии, построенные на основе обеих этих технологий – управления по событиям (сообщениям) и ООП.

1.5.4. ОС МСВС

МСВС (2000 г.) — защищенная многопользовательская многозадачная операционная система «мобильная система вооруженных сил с разделением времени, разработанная на основе Linux. Операционная система обеспечивает многоуровневую систему приоритетов с вытесняющей многозадачностью, виртуальную организацию памяти и полную сетевую поддержку; работает с многопроцессорными (SMP — symmetrical multiprocessing) и кластерными конфигурациями на платформах Intel, MIPS и SPARC.

Оболочка для управления ОС (Midnight Commander) для текстового режима во многом схожа с оболочкой Norton Commander.

Для взаимодействия с системой можно пользоваться графическим пользовательским интерфейсом. Для всех программ используется стандартная оконная система - X Window. Для работы в графической среде применяются оконные ме-

неджеры: ELK, IceWM и KDE.

Поддерживаются виртуальные терминалы, переключение между которыми осуществляется с помощью комбинации клавиш <Alt><Fn>.

В ОС МСВС есть мощные утилиты, позволяющие программистам управлять разработкой приложений. Для ОС WINDOWS разработано много программ на языке С и С++, поэтому в тех случаях, когда файлы программ не используют библиотечные функции, при переходе на ОС МСВС понадобится лишь трансляция исходных текстов.

70

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]