Kniga-Online.club
» » » » Марк Митчелл - Программирование для Linux. Профессиональный подход

Марк Митчелл - Программирование для Linux. Профессиональный подход

Читать бесплатно Марк Митчелл - Программирование для Linux. Профессиональный подход. Жанр: Программирование издательство -, год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

■ Функция module_generate() генерирует HTML-страницу с таблицей процессов. Выводная информация включает начальный HTML-блок (переменная page_start), строки с информацией о процессах (создаются функцией format_process_info()) и конечный HTML-блок (переменная page_end).

Функция module_generate() определяет идентификаторы процессов, проверяя содержимое файловой системы /proc. Для получения и анализа списка каталогов вызываются функции opendir() и readdir() (описаны в приложении Б, "Низкоуровневый ввод-вывод''). Из данного списка отбираются элементы, имена которых состоят из одних цифр: это каталоги процессов.

Поскольку в таблице может содержаться достаточно большое число строк, последовательная запись их в сокет с помощью функции write() приведет к ненужному повышению трафика. Для оптимизации числа передаваемых пакетов используется функция writev() (описана в приложении Б, "Низкоуровневый ввод-вывод"). Для нее создается массив vec, состоящий из элементов типа iovec. Так как число процессов не известно заранее приходится начинать с маленького массива и увеличивать его по мере необходимости. В переменной vec_length содержится число используемых элементов массива vec, а в переменной vec_size — число выделенных элементов. Когда эти переменные становятся почти равными друг другу, размер массива удваивается с помощью функции xrealloc(). По окончании работы с массивом удаляются все адресуемые в нем строки, а также сам массив.

11.4. Работа с сервером

Если бы демонстрационную программу нужно было распространять в виде исходных текстов, сопровождать и переносить на другие платформы, потребовалось бы упаковать ее с помощью GNU-утилит Automake и Autoconf. Но их рассмотрение выходит за рамки нашей книги.

11.4.1. Файл Makefile

Вместо утилиты Autoconf мы воспользуемся простым файлом Makefile, совместимым с GNU-утилитой Make.[39] Этот файл упростит компиляцию и компоновку сервера и его модулей. Содержимое файла показано в листинге 11.10.

Листинг 11.10. (Makefile) Файл конфигурации сервера

### Конфигурация. ##############################################

# Стандартные параметры компилятора языка С.

CFLAGS = -Wall -g

# Исходные файлы сервера.

SOURCES = server.c module.c common.c main.c

# Соответствующие объектные файлы.

OBJECTS = $(SOURCES:.c=.o)

# Совместно используемые библиотеки серверных модулей.

MODULES = diskfree.so issue.so processes.so time.so

### Правила. ####################################################

# Служебный целевой модуль.

.PHONY: all clean

# Стандартный целевой модуль: компиляция всех файлов.

all: server $(MODULES)

# Удаление всех компонентов.

clean:

    rm -f $(OBJECTS) $(MODULES) server

# Главная серверная программа, должна компоноваться с флагами

# -Wl,-export-dynamic, чтобы динамически загружаемые модули могли

# находить в программе символические константы. Подключается также

# библиотека libdl, в которой находятся функции динамической

# загрузки.

server: $(OBJECTS)

    $(CC) $(CFLAGS) Wl,-export-dynamic -о [email protected] $^ -ldl

# Все объектные файлы сервера зависят от файла server.h.

# Используем стандартное правило создания объектных файлов из

# исходных файлов.

$(OBJECTS): server.h

# Правило создания совместно используемых библиотек из

# соответствующих исходных файлов, компилируем с флагом -fPIC и

# генерируем совместно используемый объектный файл.

$(MODULES):

%.so: %.c server.h

    $(CC) $(CFLAGS) -fPIC -shared -o [email protected] $<

В файле Makefile есть следующие целевые модули.

■ Модуль all (используется по умолчанию при вызове файла Makefile без аргументов, так как стоит первым) содержит исполняемый файл server и все серверные модули. Последние перечислены в переменной MODULES.

■ Модуль clean предназначен для удаления всех скомпилированных компонентов.

■ Модуль server подключает к проекту исполняемый файл сервера. Компилируются и компонуются исходные файлы, перечисленные в переменной SOURCES.

■ Последнее правило представляет собой шаблон компиляции совместно используемых файлов серверных модулей.

Обратите внимание на то, что исходные файлы серверных модулей компилируются с флагом -fPIC, так как они включаются в совместно используемые библиотеки (см. раздел 2.3.2, "Совместно используемые библиотеки").

Исполняемый файл server компонуется с флагом -Wl,-export-dynamic. Благодаря этому файл будет экспортировать свои символические константы, что позволит динамически загружаемым модулям ссылаться на функции, находящиеся в файле common.c.

11.4.2. Создание сервера

Построить исполняемый файл несложно. Перейдите в каталог, содержащий исходные файлы, и вызовите команду make:

% make

cc -Wall -g -с -o server.о server.с

cc -Wall -g -с -o module.о module.с

cc -Wall -g -с -o common.о common.с

cc -Wall -g -с -o main.o main.c

cc -Wall -g -Wl,-export-dynamic -o server server.о module.о

 common.о main.o -ldl

cc -Wall -g -fPIC -shared -o diskfree.so diskfree.c

cc -Wall -g -fPIC -shared -o issue.so issue.с

cc -Wall -g -fPIC -shared -o processes.so processes.с

cc -Wall -g -fPIC -shared -o time.so time.с

В результате будут созданы программа server и совместно используемые библиотеки серверных модулей:

% ls -l server *.so

-rwxr-xr-x 1 samuel samuel 25769 Mar 11 01:15 diskfree.so

-rwxr-xr-x 1 samuel samuel 31184 Mar 11 01:15 issue.so

-rwxr-xr-x 1 samuel samuel 41579 Mar 11 01:15 processes.so

-rwxr-xr-x 1 samuel samuel 71758 Mar 11 01:15 server

-rwxr-xr-x 1 samuel samuel 13980 Mar 11 01:15 time.so

11.4.3. Запуск сервера

Для запуска сервера достаточно ввести в командной строке имя server. Если не задать номер порта с помощью опции --port (-p). ОС Linux самостоятельно выберет порт. При указании опции --verbose (-v) сервер покажет, какой порт ему назначен.

Если не назначить серверу адрес с помощью опции --address (-а), сервер будет принимать запросы по всем имеющимся адресам. Для подключенного к сети компьютера это означает, что любой пользователь сети, зная номер порта сервера и имя страницы, сможет обратиться к серверу. Из соображений безопасности рекомендуем указывать адрес localhost, пока вы не убедитесь в правильной работе сервера. В этом случае сервер будет связан с локальным сетевым устройством (обозначается как lo) и к нему смогут обращаться только программы, работающие на том же самом компьютере.

% ./server --address localhost --port 4000

Теперь сервер работает. Откройте окно броузера и попытайтесь обратиться к серверу по номеру порта. Запросите страницу, имя которой совпадает с именем модуля. Вот как, например, вызывается модуль diskfree.so:

http://localhost:4000/diskfree

Вместо 4000 можно указать любой другой номер порта, который был выбран. Чтобы завершить работу сервера, нажмите <Ctrl+C>.

Если сервер принимает запросы по сети, к нему можно подключиться с помощью броузера, работающего на другом компьютере, например:

httр://host.domain.com:4000/diskfree

Если задать опцию --verbose (-v), сервер при запуске отобразит свою конфигурационную информацию, а затем будет показывать IP-адрес каждого подключающегося к нему клиента. Если подключаться через интерфейс localhost, клиентский адрес всегда будет равен 127.0.0.1.

С помощью опции --module-dir (-m) можно указать другой каталог размещения серверных модулей. По умолчанию они находятся там же, где и программа server.

Те, кто забыли или не знают синтаксис опций командной строки, могут вызвать программу server с опцией --help (-h):

% ./server --help

Usage: ./server [ options ]

 -a, --address ADDR   Bind to local address (by default, bind

                      to all local addresses).

 -h, --help           Print this information.

 -m, --module-dir DIR Load modules from specified directory

                      (by default, use executable directory).

 -p, --port PORT      Bind to specified port.

 -v, --verbose        Print verbose messages.

11.5. Вместо эпилога

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

Перейти на страницу:

Марк Митчелл читать все книги автора по порядку

Марк Митчелл - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


Программирование для Linux. Профессиональный подход отзывы

Отзывы читателей о книге Программирование для Linux. Профессиональный подход, автор: Марк Митчелл. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*