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

Здесь есть возможность читать онлайн «Марк Митчелл - Программирование для Linux. Профессиональный подход» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 2002, ISBN: 2002, Издательство: Вильямс, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

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

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Программирование для Linux. Профессиональный подход»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Данная книга в основном посвящена программированию в среде GNU/Linux. Авторы применяют обучающий подход, последовательно излагая самые важные концепции и методики использования расширенных возможностей системы GNU/Linux в прикладных программах. Читатели научатся писать программы, к интерфейсу которых привыкли пользователи Linux; освоят такие технологии, как многозадачность, многопотоковое программирование, межзадачное взаимодействие и взаимодействие с аппаратными устройствами; смогут улучшить свои программы, сделав их быстрее, надежнее и безопаснее; поймут особенности системы GNU/Linux, ее ограничения, дополнительные возможности и специфические соглашения.
Книга предназначена для программистов, уже знакомых с языком С и имеющих базовый опыт работы в GNU/Linux.

Программирование для Linux. Профессиональный подход — читать онлайн бесплатно полную книгу (весь текст) целиком

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

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Сервер обрабатывает только запросы протокола HTTP версий 1.0 и 1.1. Столкнувшись с иными протоколом или версией сервер возвращает HTTP-код 400 и сообщение bad_request_response. Сервер понимает только HTTP-метод GET. Если клиент запрашивает какой-то другой метод, сервер возвращает HTTP-код 501 и сообщение bad_method_response_template.

■ Если клиент послал правильно сформированный запрос GET, функция handle_connection()вызывает функцию handle_get(), которая обрабатывает запрос. Эта функция пытается загрузить серверный модуль, имя которого генерируется на основании имени запрашиваемой страницы. Например, когда клиент запрашивает страницу с именем "information", делается попытка загрузить модуль information.so. Если модуль не может быть загружен, функция handle_get()возвращает HTTP-код 404 и сообщение not_found_response_template.

В случае обращения к верной странице функция handle_get()возвращает клиенту HTTP-код 200, указывающий на успешную обработку запроса, и вызывает функцию module_generate(), содержащуюся в модуле. Последняя генерирует HTML-код Web-страницы и посылает его клиенту.

■ Функция server_run()регистрирует функцию clean_up_child_process()в качестве обработчика сигнала SIGCHLD. Обработчик просто очищает ресурсы завершившегося дочернего процесса (см. раздел 3.4.4. "Асинхронное удаление дочерних процессов").

11.2.4. Основная программа

В файле main.c(листинг 11.5) содержится функция main()сервера. Она отвечает за анализ аргументов командной строки и обнаружение ошибок в них, а также за конфигурирование и запуск сервера.

Листинг 11.5. ( main.c ) Главная серверная функция, выполняющая анализ аргументов командной строки

#include

#include

#include

#include

#include

#include

#include

#include

#include "server.h"

/* Описание длинных опций для функции getopt_long(). */

static const struct option long_options[] = {

{ "address", 1, NULL, 'a' },

{ "help", 0, NULL, 'h' },

{ "module-dir", 1, NULL, 'm' },

{ "port", 1, NULL, 'p' },

{ "verbose", 0, NULL, 'v' },

};

/* Описание коротких опций для функции getopt_long(). */

static const char* const short_options = "a:hm:p:v";

/* Сообщение о том, как правильно использовать программу. */

static const char* const usage_template =

"Usage: %s { options }\n"

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

" to all local addresses).\n"

" -h, --help Print this information.\n"

" -m, --module-dir DIR Load modules from specified directory\n"

" (by default, use executable directory).\n"

" -p, --port PORT Bind to specified port.\n"

" -v, --verbose Print verbose messages.\n";

/* Вывод сообщения о правильном использовании программы

и завершение работы. Если аргумент IS_ERROR не равен нулю,

сообщение записывается в поток stderr и возвращается

признак ошибки, в противном случае сообщение выводится в

поток stdout и возвращается обычный нулевой код. */

static void print_usage(int is_error) {

fprintf(is_error ? stderr : stdout, usage_template,

program_name);

exit(is_error ? 1 : 0);

}

int main(int argc, char* const argv[]) {

struct in_addr local_address;

uint16_t port;

int next_option;

/* Сохранение имени программы для отображения в сообщениях

об ошибке. */

program_name = argv[0];

/* Назначение стандартных установок. По умолчанию сервер

связан со всеми локальными адресами, и ему автоматически

назначается неиспользуемый порт. */

local_address.s_addr = INADDR_ANY;

port = 0;

/* He отображать развернутые сообщения. */

verbose = 0;

/* Загружать модули из каталога, в котором содержится

исполняемый файл. */

module_dir = get_self_executable_directory();

assert(module_dir != NULL);

/* Анализ опций. */

do {

next_option =

getopt_long(argc, argv, short_options,

long_options, NULL);

switch (next_option) {

case 'a':

/* Пользователь ввел -a или --address. */

{

struct hostent* local_host_name;

/* Поиск заданного адреса. */

local_host_name = gethostbyname(optarg);

if (local_host_name == NULL ||

local_host_name->h_length == 0)

/* He удалось распознать имя. */

error(optarg, "invalid host name");

else

/* Введено правильное имя */

local_address.s_addr =

*((int*)(local_host_name->h_addr_list[0]));

}

break;

case 'h':

/* Пользователь ввёл -h или --help. */

print_usage(0);

case 'm':

/* Пользователь ввел -m или --module-dir. */

{

struct stat dir_info;

/* Проверка существования каталога */

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Программирование для Linux. Профессиональный подход»

Представляем Вашему вниманию похожие книги на «Программирование для Linux. Профессиональный подход» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


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

Обсуждение, отзывы о книге «Программирование для Linux. Профессиональный подход» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x