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

Тут можно читать онлайн Марк Митчелл - Программирование для Linux. Профессиональный подход - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство Вильямс, год 2002. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Программирование для Linux. Профессиональный подход
  • Автор:
  • Жанр:
  • Издательство:
    Вильямс
  • Год:
    2002
  • Город:
    Москва
  • ISBN:
    5-8459-0243-6
  • Рейтинг:
    3.6/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

char module_file_name[64];

/* Имя страницы правильно. Формируем имя модуля, добавляя

расширение ".so" к имени страницы. */

snprintf(module_file_name, sizeof(module_file_name),

"%s.so", page + 1);

/* Попытка открытия модуля. */

module = module_open(module_file_name);

}

if (module == NULL) {

/* Имя страницы неправильно сформировано или не удалось

открыть модуль с указанным именем. В любом случае

возвращается HTTP-ответ "404. Not Found". */

char response[1024];

/* Формирование ответного сообщения. */

snprintf(response, sizeof(response),

not_found_response_template, page);

/* Отправка его клиенту. */

write(connection_fd, response, strlen(response));

} else {

/* Запрашиваемый модуль успешно загружен. */

/* Выдача HTTP-ответа, обозначающего успешную обработку

запроса, и HTTP-заголовка для HTML-страницы. */

write(connection_fd, ok_response, strlen(ok_response));

/* Вызов модуля, генерирующего HTML-код страницы и

записывающего этот код в указанный файл. */

(*module->generate_function)(connection_fd);

/* Работа с модулем окончена. */

module_close(module);

}

}

/* Обработка клиентского запроса на подключение. */

static void handle_connection(int connection_fd) {

char buffer[256];

ssize_t bytes_read;

/* Получение данных от клиента. */

bytes_read =

read(connection_fd, buffer, sizeof(buffer) — 1);

if (bytes_read > 0) {

char method[sizeof(buffer)];

char url[sizeof(buffer)];

char protocol[sizeof(buffer)];

/* Часть данных успешно прочитана. Завершаем буфер

нулевым символом, чтобы его можно было использовать

в строковых операциях. */

buffer[bytes_read] = '\0';

/* Первая строка, посылаемая клиентом, -- это HTTP-запрос.

В запросе указаны метод, запрашиваемая страница и

версия протокола. */

sscanf(buffer, "%s %s %s", method, url, protocol);

/* В заголовке, стоящем после запроса, может находиться

любая информация. В данной реализации HTTP-сервера

эта информация не учитывается. Тем не менее необходимо

прочитать все данные, посылаемые клиентом. Данные читаются

до тех пор, пока не встретится конец заголовка,

обозначаемый пустой строкой. В HTTP пустой строке

соответствуют символы CR/LF. */

while (strstr(buffer, " \r\n\r\n") == NULL)

bytes_read = read(connection_fd, buffer, sizeof(buffer));

/* Проверка правильности последней операции чтения.

Если она не завершилась успешно, произошел разрыв

соединения, поэтому завершаем работу. */

if (bytes_read == -1) {

close(connection_fd);

return;

}

/* Проверка поля версии. Сервер понимает протокол HTTP

версий 1.0 и 1.1. */

if (strcmp(protocol, "HTTP/1.0") &&

strcmp(protocol, "HTTP/1.1")) {

/* Протокол не поддерживается. */

write(connection_fd, bad_request_response,

sizeof(bad_request_response));

} else if (strcmp (method, "GET")) {

/* Сервер реализует только метод GET, а клиент указал

другой метод. */

char response[1024];

snprintf(response, sizeof(response),

bad_method_response_template, method);

write(connection_fd, response, strlen(response));

} else

/* Корректный запрос. Обрабатываем его. */

handle_get(connection_fd, url);

} else if (bytes_read == 0)

/* Клиент разорвал соединение, не успев отправить данные.

Ничего не предпринимаем */

;

else

/* Операция чтения завершилась ошибкой. */

system_error("read");

}

void server_run(struct in_addr local_address, uint16_t port) {

struct sockaddr_in socket_address;

int rval;

struct sigaction sigchld_action;

int server_socket;

/* Устанавливаем обработчик сигнала SIGCHLD, который будет

удалять завершившееся дочерние процессы. */

memset(&sigchld_action, 0, sizeof(sigchld_action));

sigchld_action.sa_handler = &clean_up_child_process;

sigaction(SIGCHLD, &sigchld_action, NULL);

/* Создание TCP-сокета */

server_socket = socket(PF_INET, SOCK_STREAM, 0);

if (server_socket == -1) system_error("socket");

/* Создание адресной структуры, определяющей адрес

для приема запросов. */

memset(&socket_address, 0, sizeof(socket_address));

socket_address.sin_family = AF_INET;

socket_address.sin_port = port;

socket_address.sin_addr = local_address;

/* Привязка сокета к этому адресу. */

rval =

bind(server_socket, &socket_address,

sizeof(socket_address));

if (rval != 0)

system_error("bind");

/* Перевод сокета в режим приема запросов. */

rval = listen(server_socket, 10);

if (rval != 0)

system_error("listen");

if (verbose) {

/* В режиме развернутых сообщений отображаем адрес и порт,

с которыми работает сервер. */

socklen_t address_length;

/* Нахождение адреса сокета. */

address_length = sizeof(socket_address);

rval =

getsockname(server_socket, &socket_address, &address_length);

assert(rval == 0);

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

из сетевого (обратного) порядка следования байтов

в серверный (прямой). */

printf("server listening on %s:%d\n",

inet_ntoa(socket_address.sin_addr),

(int)ntohs(socket_address.sin_port));

}

/* Бесконечный цикл обработки запросов. */

while (1) {

struct sockaddr_in remote_address;

socklen_t address_length;

int connection;

pid_t child_pid;

/* Прием запроса. Эта функция блокируется до тех пор, пока

не поступит запрос. */

address_length = sizeof(remote_address);

connection = accept(server_socket, &remote_address,

&address_length);

if (connection == -1) {

/* Функция завершилась неудачно. */

if (errno == EINTR)

/* Функция была прервана сигналом. Повторная попытка. */

continue;

else

/* Что-то случилось. */

system_error("accept");

}

/* Соединение установлено. Вывод сообщения, если сервер

работает в режиме развернутых сообщений. */

if (verbose) {

socklen_t address_length;

/* Получение адреса клиента. */

address_length = sizeof(socket_address);

rval =

getpeername(connection, &socket_address, &address_length);

assert(rval == 0);

/* Вывод сообщения. */

printf("connection accepted from %s\n",

inet_ntoa(socket_address.sin_addr));

}

/* Создание дочернего процесса для обработки запроса. */

child_pid = fork();

if (child_pid == 0) {

/* Это дочерний процесс. Потоки stdin и stdout ему не нужны,

поэтому закрываем их. */

close(STDIN_FILENO);

close(STDOUT_FILENO);

/* Дочерний процесс не должен работать с серверным сокетом,

поэтому закрываем его дескриптор. */

close(server_socket);

/* Обработка запроса. */

handle_connection(connection);

/* Обработка завершена. Закрываем соединение и завершаем

дочерний процесс. */

close(connection);

exit(0);

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

Интервал:

Закладка:

Сделать


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

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




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


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


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x