LINUX.ORG.RU

Книга «Linux API. Исчерпывающее руководство»

 , ,


5

2

Добрый день! Предлагаю вашему вниманию книгу «Linux API. Исчерпывающее руководство»(перевод книги The Linux Programming Interface). Ее можно заказать на сайте издательства, и если применить промокод LinuxAPI , то получите скидку 30%.

Отрывок из книги для ознакомления:

Сокеты: архитектура сервера

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

Итерационные и параллельные серверы

Существуют две распространенные архитектуры сетевых серверов на основе сокетов:

  • итерационная: сервер обслуживает клиентов по одному, сначала обрабатывая запрос (или несколько запросов) одного клиента и затем переходя к следующему;

  • параллельная: сервер спроектирован для обслуживания нескольких клиентов одновременно.

В разделе 44.8 уже был представлен пример итерационного сервера на основе очередей FIFO.

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

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

В следующих разделах мы рассмотрим примеры итерационного и параллельного серверов на основе сокетов интернет-домена. Эти два сервера реализуют упрощенный вариант службы echo (RFC 862), которая возвращает копию любого сообщения, посланного ей клиентом.

Итерационный UDP-сервер echo

В этом и следующем разделе мы представим серверы для службы echo. Она доступна на порте с номером 7 и работает как по UDP, так и по TCP (данный порт зарезервирован, в связи с чем сервер echo необходимо запускать с привилегиями администратора).

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

Листинг 56.1. Заголовочный файл для программ id_echo_sv.c и id_echo_cl.c

#include "inet_sockets.h" /* Объявляет функции нашего сокета */
#include "tlpi_hdr.h"

#define SERVICE "echo" /* Имя UDP-службы */

#define BUF_SIZE 500 /* Максимальный размер датаграмм, которые
могут быть прочитаны клиентом и сервером */
____________________________________________________________________sockets/id_echo.h 

В листинге 56.2 представлена реализация сервера. Стоит отметить следующие моменты:

  • для перевода сервера в режим демона мы задействуем функцию becomeDaemon() из раздела 37.2;

  • чтобы сделать программу более компактной, мы используем библиотеку для работы с сокетами интернет-домена, разработанную в разделе 55.12;

  • если сервер не может вернуть ответ клиенту, то записывает сообщение в журнал, применяя вызов syslog().

В реальном приложении мы бы, скорее всего, ввели определенное ограничение на частоту записи сообщений с помощью syslog(). Это исключило бы возможность переполнения системного журнала злоумышленником. К тому же не стоит забывать, что каждый вызов syslog() довольно затратный, так как по умолчанию использует fsync().

Листинг 56.2. Итерационный сервер, который реализует UDP-службу echo

_________________________________________________________________sockets/id_echo_sv.c
#include <syslog.h>
#include "id_echo.h"
#include "become_daemon.h"

int
main(int argc, char *argv[])
{
   int sfd;
   ssize_t numRead;
   socklen_t len;
   struct sockaddr_storage claddr;
   char buf[BUF_SIZE];
   char addrStr[IS_ADDR_STR_LEN];

   if (becomeDaemon(0) == -1)
       errExit("becomeDaemon");

   sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
   if (sfd == -1) {
      syslog(LOG_ERR, "Could not create server socket (%s)",
         strerror(errno));
      exit(EXIT_FAILURE);

   /* Получаем датаграммы и возвращаем отправителям их копии */
   }
   for (;;) {
      len = sizeof(struct sockaddr_storage);
       numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

       if (numRead == -1)
           errExit("recvfrom");
       if (sendto(sfd, buf, numRead, 0, (struct sockaddr *) &claddr, len)
            != numRead)
          syslog(LOG_WARNING, "Error echoing response to %s (%s)",
            inetAddressStr((struct sockaddr *) &claddr, len,
                addrStr, IS_ADDR_STR_LEN),
             strerror(errno));
   }
}
_________________________________________________________________sockets/id_echo_sv.c

Для проверки работы сервера мы используем программу из листинга 56.3. В ней тоже применяется библиотека для работы с сокетами интернет-домена, разработанная в разделе 55.12. В качестве первого аргумента командной строки клиентская программа принимает имя сетевого узла, на котором находится сервер. Клиент входит в цикл, где отправляет серверу каждый из оставшихся аргументов в виде отдельных датаграмм, а затем считывает и выводит датаграммы, полученные от сервера в ответ.

Листинг 56.3. Клиент для UDP-службы echo

#include "id_echo.h"

int
main(int argc, char *argv[])
{
   int sfd, j;
   size_t len;
   ssize_t numRead;
   char buf[BUF_SIZE];

   if (argc < 2 || strcmp(argv[1], "--help") == 0)
      usageErr("%s host msg...\n", argv[0]);

   /* Формируем адрес сервера на основе первого аргумента командной строки */
   sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
   if (sfd == -1)
      fatal("Could not connect to server socket");

   /* Посылаем серверу остальные аргументы в виде отдельных датаграмм */
   for (j = 2; j < argc; j++) {
      len = strlen(argv[j]);
      if (write(sfd, argv[j], len) != len)
         fatal("partial/failed write");

      numRead = read(sfd, buf, BUF_SIZE);
      if (numRead == -1)
         errExit("read");
      printf("[%ld bytes] %.*s\n", (long) numRead, (int) numRead, buf);
   }
   exit(EXIT_SUCCESS);
}
_________________________________________________________________sockets/id_echo_cl.c

Ниже показан пример того, что мы увидим при запуске сервера и двух экземпляров клиента:

$ su              // Для привязки к зарезервированному порту нужны привилегии
Password:
# ./id_echo_sv    // Сервер переходит в фоновый режим
# exit            // Отказываемся от прав администратора
$ ./id_echo_cl localhost hello world  // Этот клиент отправляет две датаграммы
[5 bytes] hello                       // Клиент выводит ответ, полученный от сервера
[5 bytes] world
$ ./id_echo_cl localhost goodbye      // Этот клиент шлет одну датаграмму
[7 bytes] goodbye

Желаю приятного чтения)

>>> Можно купить на сайте издательства



Проверено: alpha ()

Ответ на: комментарий от AKonia

ты сам запутался=) между КПД двигателя и навыками довольно слабая связь. а вот между автоматической коробкой передач и количеством баб за рулем связь прямая. пока переключение скоростей было ручным, для них это было слишком сложно. ты по сути недопетриваешь, что английский - это базовый навык айтишника и типа такой: «разжуйте мне и сделайте попроще, иначе мне слабо. не буду учить английский, пусть через 5 лет кто-нибудь переведет».

crypt ★★★★★ ()
Ответ на: комментарий от crypt

пока переключение скоростей было ручным, для них это было слишком сложно

А на грузовики автомат ставят, потому что мужики слишком тупые? Логика это не твое.

anonymous ()
Ответ на: комментарий от crypt

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

AKonia ()
Последнее исправление: AKonia (всего исправлений: 1)

Как быстро это "исчерпывающее руководство" устареет? Ядро Linux сейчас очень быстро ломают переписывают, так что не особо-то оно актуально, писать такие книжки.

mord0d ★★★ ()
Ответ на: комментарий от mord0d

Пользовательский уровень не ломают с ядра 2.5.* или даже раньше, меняется только внутренний апи, уровня ядра, для разработчиков низкоурованевых подсистем - планироващиков, драйверов ФС и железа, если бы постоянно ломали пользовательский апи, то линуксом бы никто и никогда не пользовался, т.к. постоянно ломались почти все проги разом.

AKonia ()
Последнее исправление: AKonia (всего исправлений: 1)
Ответ на: комментарий от AKonia

Пользовательский уровень не ломают

А, это для хомячков смузихлёбов-погромистов… Я не стал читать весь этот TL;DR, я не пользуюсь Linux, и уж тем более не пишу софт для.

mord0d ★★★ ()
Ответ на: комментарий от mord0d

А, это для хомячков смузихлёбов-погромистов… Я не стал читать весь этот TL;DR, я не пользуюсь Linux, и уж тем более не пишу софт для.

… и идите вы все …

anonymous ()
Ответ на: комментарий от mord0d

ну по сути да - прикладной уровень, этап сбора и обработки урожая

AKonia ()
Ответ на: комментарий от AKonia

я еще раз тебе говорю. это твои личные проблемы, что у тебя связи так в голове составлены. может, ты еще и ЭВМ выговариваешь. у меня прямые связи с англ. термином идут.

p.s.

жди еще 5 лет пока выйдет следующая книга. а че? нормально!

crypt ★★★★★ ()
Последнее исправление: crypt (всего исправлений: 1)
Ответ на: комментарий от AKonia

отмечаю важный факт, что на родном языке попросту быстрее, потому что вы уменьшаете ассоциативные цепочки

А программируешь ты, конечно же, выстраивая ассоциативные цепочки всех этих конструкций, особенно всяких непереводимых, не имеющих аналогов в русском?

В плане изложения технической информации английский во-первых лаконичнее, во-вторых полноценен (потому что термины рождаются на английском, а не перевираются в попытках перевода).

Ну и плюс ко всему любой перевод всегда будет отставать от оригинала. И не только по времени публикации, но и по качеству контента.

Потому самым правильным решением будет выучить английский на таком уровне, чтобы свободно думать на нём.

mord0d ★★★ ()

Можно купить на сайте издательства

Спасибо, не надо. Скачал бесплатно, оригинальную версию конечно как настоящий программист.

wtj12 ()
Ответ на: комментарий от mord0d

Потому самым правильным решением будет выучить английский на таком уровне, чтобы свободно думать на нём.

Техлитература вообще легко читается на английском. Не понимаю у кого с этим могут быть трудности. Ещё будучи школьником читал без проблем.

wtj12 ()
Ответ на: комментарий от wtj12

Программист без знания английского это как парализованный порноактёр.

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

mord0d ★★★ ()
Ответ на: комментарий от mord0d

А программируешь ты, конечно же, выстраивая ассоциативные цепочки всех этих конструкций, особенно всяких непереводимых, не имеющих аналогов в русском?

А программируешь ты, конечно же, выстраивая ассоциативные цепочки всех этих конструкций, особенно всяких непереводимых, не имеющих аналогов в русском? А вот синтаксис - да, он малопереводим, но мы не думаем в духе for(i = 1; i <= 10; ++i), а думаем так «цикл/проход по переменной от одного до десяти» и уже его переводим в синтаксис, при том даже сказанное мною на русском должно перевестись в цепочку нематериальных сущностей, на уровне которых работает мозг.

В плане изложения технической информации английский во-первых лаконичнее, во-вторых полноценен (потому что термины рождаются на английском, а не перевираются в попытках перевода).

На самом деле у вас талант: вы в одном утверждении смогли сразу два ложных утверждения выдать за истину. По сути лаконичность штука субъективная и чисто так к сведению - очень многие книги в переводе становятся короче оригиналов, при том не потому что их по живому режут, выбрасывая часть материала, а потому что многие группы предложений получается сделать короче, без потери смысла, более того чисто так вам для общего развития «лаконичность» зависит от автора и если владение языком у переводчика лучше, то и книга может преобразиться в лучшую сторону и это касается как тех литературы, так и любой другой, включая художку, поэтому если переводчик грамотен и либо хорошо разбирается в теме, либо может в случае чего посоветоваться с более подкованными людьми, то перевод будет как минимум хорошим, а порой даже отличным. Хотя и не спорю что перевод плохоразбирающимся в теме переводчиком, выполняющим черновой перевод через какой-нибудь яндекс.переводчик - да возможно будет весьма сомнительного качества и тогда оригинал будет в этом плане проще, если конечно повторюсь автор не перечитался британских классиков.

Ну и плюс ко всему любой перевод всегда будет отставать от оригинала. И не только по времени публикации, но и по качеству контента.

Частично верно, с той точки зрения, что перевод будет оставать по времени, но это сильно зависит от его распространения и того как её использовать. С точки зрения наполнения, содержания - вы скорее неправы, т.к. это перевод, а перевод как правило от оригинала особо не отходит, да иногда могут у нас цветные рисунки заменить на ч/б, но чаще всего так выходит дешевле, а на восприятии книги не сказывается - главное чёткость рисунков, т.е. в целом контент не страдает, а иногда так вообще переводчики и дополняют книги пояснениями и сносками, например помню в одной книге по ЦОС переводчица не поленилась и указала для читателя момент с тем, что частота найквиста в нашей литературе определяется теоремой Котельникова и добавила пол страницы текста про неё и сделало книгу только лучше.

Потому самым правильным решением будет выучить английский на таком уровне, чтобы свободно думать на нём.

Опять не состоятельную ерунду пишете - вы забываете о том, что для того, чтобы думать на английском вам нужно 1) забыть русский 2) быть в возрасте до 4-ёх годов, - иначе вы будете думать на кривом русском с кучей англоязычных мнемосвязок на русские слова или образы которые вы введёте через русскую лексику и как итог вы будете не думать на английском, а интерпретировать.

AKonia ()
Ответ на: комментарий от wtj12

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

AKonia ()
Ответ на: комментарий от AKonia

я читал страуструпа без перевода и совершенно не понимаю что именно вы имели ввиду поставив в пример именно его. книга конечно сложновата к прочтению но вовсе не из за языковых сложностей. книга написана сухим языком, рассчитана на программистов имеющих опыт. по C++ советую перед страустрапом почитать что то наподобие этого https://archive.org/details/TICPP2ndEdVolOne, по крайней мере мне помогло. ну и попрограммировать немного на C, иначе смысл OOP концепций будет не понятен.

wtj12 ()
Ответ на: комментарий от wtj12

По диагонали на английском и я Страуструпа прочитать могу, другой вопрос всё ли вы разобрали и действительно поняли, в пример привёл как пример сухого, нудного и бессмысленного чтива, на которое человек, действительно обдумывающий(= пережёвавает) прочитанное, тратить время бы не стал, поэтому положу что вы либо тролль, либо потратили в пустую много времени(сейчас уже жду, как вы скажите, что не много, т.к. читаете 250+ страниц в час, ну так для большей убедительности), т.к. книга одновременно философство на пустом месте и одновременно достаточно вязкая. За себя скажу, что у меня процесс реального(не диагонального) разбора на английском занимает в 2-3 раза больше времени чем на русском и это не считая выполнения и разбора упражнений, я даже первое время думал, что не тяну, т.к. однокурсники умудрялись в разы быстрее прочитать, но когда я начал замечать, что в лучшем случае люди были зубрилками, а в худшем прочитал=пролистал по диагонали, веду я к тому, что всё зависит от того что вы понимаете под прочитал и не окажется ли это как с той девочкой, которой мама сказала что «- конфеты, после того как покушаешь кашу, та скушала одну ложку каши и сказала - я покушала, где конфеты».

AKonia ()
Ответ на: комментарий от AKonia

Я пишу не для того что бы похвастаться и я точно не читаю по 250 страниц в час. Однако, Страустрап явно неудачный пример книги которая могла бы вызвать языковые проблемы у программиста. Какая я то художественная литература с обилием незнакомых слов - да, вызовет языковые проблемы. Но почему Страустрап убей не пойму. Она сложна для понимания на любом языке. Прочитай книгу с обилием примеров как ту что я приводил выше (выложенную в свободный доступ автором кстати), напечатай все примеры, скомпилируй, запусти. А потом уже переходи к философствованиям Страустрапа. Либо это дело привычки либо не знаю. Несколько раз было попадалась техлитература в переводе и в итоге я всё равно утруждался поисками в гугле оригинального текста т.к. непривычно и всё тут.

wtj12 ()

иллюстрация в виде завязки ганжубаса символизирует

fooser ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей