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 ()

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

говорить что он лучше по всем параметрам любого другого языка… пфффффф. Нет.

Я такого и не говорил. Каждый естественный язык по-своему хорош.

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

Ну, если уж про русский говорить то хехехе «вот эта херабора»,«эту херовину» и тому подобное успешно заменяет любую терминологию

Только по факту в реальной жизни заменяют на другое. На что-то наподобие «раздеплоить вот эту джобу» и «отдебажить вот эту ишшую». Потому что таки терминология нужна и важна. А вот перевод её никому особо не сдался.

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

А потом ракеты падают.

Эх, взять бы тебя хоть на денек, чтоб ты показал добрым молодцам, как надо код писать «для ракет», чтобы «не падали», но что-то чую, что тебе больше по душе на форуме филосовствовать.

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

тебе больше по душе на форуме филосовствовать

Написание кода вообще довольно философское занятие.

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

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

Я так понимаю что ты тоже пока писал забыл.

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

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

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

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

Да и пох. Всё равно не нужно. Систематически изучать имеет смысл архитектуру вещей, а не их API.

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

вы не связываете напрямую water с физической водой, вы связываете сначала с вашим представлением, словом родного языка - «вода»

Doing it wrong.

всегда будете лучше и главное быстрее(при равнвх усливиях) усваивать информацию на родном языке

Конечно, литература на русском языке предназначена для страданий и поиска скрытого смысла, даже если это питон за 21 день.

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

Категоричные… Неверные… - они не являются таковыми пока этого не доказать, а кроме заносчивого выпада вы доказательства моей «неправоты» не предоставили.

Данная книга это разболтанные маны автора, в ней и в оригинале нет проблем со словарём - вы привели слабый пример, в прочем я другого нре ожидал, т.к. вы у меня уже были помечены как «целлюлитный токсик»

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

Конечно, литература на русском языке предназначена для страданий и поиска скрытого смысла, даже если это питон за 21 день.

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

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

Ну, если уж про русский говорить то хехехе «вот эта херабора»,«эту херовину» и тому подобное успешно заменяет любую терминологию.

Кстати сказать забавная статья https://www.thelocal.es/20140108/people-are-more-logical-in-a-second-language

«When people used their native language, their choices tended to be more affected by emotional factors,» said study author Alberat Costa who heads up the Speech Production and Bilingualism unit at the Universidad Pompeu Fabra.

«But we found the study participants tended to be more rational and ‘colder’ in their problem-solving when using their second language — in this case English.»

Это ещё в тему почему в технических рассылках надо за языком следить, а не красочно посылать всех направо и налево «для экономии времени». Надо будет запомнить для следующей такой дискуссии.

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

Категоричные… Неверные… - они не являются таковыми пока этого не доказать, а кроме заносчивого выпада вы доказательства моей «неправоты» не предоставили.

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

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

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

Оригинал был издан в 2010 году. Не слишком ли старая книга для уже почти 2021 года?

У тебя в 2021 какие-то кардинально новые open и pread? Или ты так, просто теоретик?

anonymous ()

Скачал эту книгу в PDF, а там на одной из первых страниц такое:

16+ (Всоответствии с Федеральным законом от 29 декабря 2010 г. No 436-ФЗ.)

Неужели в России Linux запрещён детям до 16 или только его API? Откуда и зачем такое ограничение по возрасту?

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

Кардинально или нет, но даже стандарт языка C, с тех пор, дважды обновился.

Да я уже понял, что ты теоретик, но все же:

Как выход или невыход новых версий языка C влияет на содержимое этой книги?

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

Да, я уже читал. Это было видно и ранее бери тот же stackoverflow.com когда иностранец в en задаёт вопрос, то он обычно чёткий и прямолинейный, а в своём например в ru (поддомены я имею в виду) сообщение уже часто больше и с пояснениями и прочими красками. Я это подтверждаю и с тобой согласен. Только вот эта большая ясность и логичность вытекает из того что не носитель языка часто прибегает к максимальному упрощению своей речи от того она конечно же воспринимается как более локаничная. Часто это так и есть, это такой как бы сказать полезный побочный эффект.

Но как всегда тут упускаются важные вещи

  • 1 Это работает и в обратную сторону, то есть например англичанин в русском/ином месте тоже задаст более чёткий,короткий и лаконичный вопрос (или даст ответ). Просто потому что он максимально упростил вот и всё. Но да эта побочка очень хороша.

  • 2 Если посмотреть уже на обычные вещи то они как и мы также красочно и более развёрнуто порой с шутками и отступлениями описывают тоже самое уже в своей среде.

  • 3 Умалчивается очень частое -> «Что вы имели в виду» в ответ на такие логичные и лаконичные слова не носителя.

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

Часто более лаконично и однозначно выражают свои мысли это да. Повторяюсь это удобная побочка и всё. Но, часто удобная, чё тут говорить. Это как и на форуме тут «Нахрена ты всё это написал, где вопрос то?» не мне тебе рассказывать :D

anonymous ()
Ответ на: комментарий от bbk123
  1. Книгу перевели и выпустили в 2018-ом
  2. Linux API не меняется существенно уже 15 лет, более того автор отмечает различия между стандартами и указывает изменения со старыми версиями ядра и API, поэтому она максимально актуальна, т.к. уже писал - это книга по пользовательском API, а по этому поводу вы должны были слышать споры с Торвальдсом ломающим совместимость предложениям, которые сворачивались, т.к. «нельзя ломать пользовательский api и его поведение.»
AKonia ()
Последнее исправление: AKonia (всего исправлений: 1)
Ответ на: комментарий от anonymous

иностранец по отношению к en

Я сразу подумал, что это «ёп». Доктор, меня не допустят в элитный circle jerk «думателей на английском»?

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

Да я уже понял, что ты теоретик

Я тоже уже понял, что ты тролль, предпочитающий переходить на личности.

Как выход или невыход новых версий языка C влияет на содержимое этой книги?

Влияет на актуальность тех примеров кода и приёмов программирования, которые там приводятся.

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

Влияет на актуальность тех примеров кода и приёмов программирования, которые там приводятся.

Хорошо, продолжим. Какие возможности C11/C17 лично бы ТЫ затащил в эту книгу, чтобы повысить «актуальность тех примеров кода и приёмов программирования, которые там приводятся». (Я полагаю, что пациент начнет судорожно гуглить «C нью фичерс»).

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

Напиши в издательство и спроси. Я предположу что это подстраховка, выдержка из соответствующего ФЗ:

К допускаемой к обороту информационной продукции для детей, достигших возраста шестнадцати лет, может быть отнесена информационная продукция, предусмотренная статьей 9 настоящего Федерального закона, а также информационная продукция, содержащая оправданные ее жанром и (или) сюжетом:

1) изображение или описание несчастного случая, аварии, катастрофы, заболевания, смерти без натуралистического показа их последствий, которые могут вызывать у детей страх, ужас или панику;

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

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

4) отдельные бранные слова и (или) выражения, не относящиеся к нецензурной брани;

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

А почему издательтсво перестраховаывается с такими книгами - спрашивайте у них

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

Скандалы, интриги, расследования: аноним выводит тролля на чистую воду))

AKonia ()

Книга хорошая, у меня есть предыдущая редакция. По качеству текста не скажу, а вот как гнёт для квашеной капусты, очень хороша.

AUX ★★★ ()

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

На фоне «Stable API nonsese» звучит как издевательство.

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

А эта книжка не улетит в макулатуру через полгода из-за «stable api is nonsence»?

Как сказала бы Альфа, «Elaborate, please.»

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

Имхо такие книжки не как справочник держат, а как эскурс в тему.

Если надо куда-то будет копнуть поглубже, и для практического применения, то придётся в любом случае брать актуальные маны и доки и работать по ним. А тут просто всё собрано и упаковано в большой «плейлист», по которому можно просвещаться на досуге.

P.S. Я не спец в теме, если что. Я сама до десятой главы ещё не дошла. У меня это была «походная» книжка для самолета и поезда.

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

В C11 убрали динамические массивы, которые были и использовались до этого в C99. В самом ядре Linux от динамических массивов полностью избавились лишь в декабре 2018 года в версии 4.20

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

В C11 убрали динамические массивы, которые были и использовались до этого в C99.

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

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

Штудировать всё API на случай если вдруг что-то оттуда понадобится – контрпродуктивно.

Кто-то говорил о штудировании всей книги? Ей же можно пользоваться как справочником. Она заведомо даст больше информации по теме, чем куцый ответик на SO. Каждую главу подобной книги можно считать аналогом большой статьи на хабре по теме. А всю книгу — тематическим сборником таких статей =)

Короче, ты прав только в том, что информацию сейчас ищут иначе, чем в до-интернетовские времена — поиском по ключевым словам. Но вот CTRL-F по хорошему учебнику — почему бы и да?

Crocodoom ★★★★ ()
Последнее исправление: Crocodoom (всего исправлений: 2)
Ответ на: комментарий от alpha

Слишком много категоричных неверных утверждений в одном предложении.

Английский технический язык читается проще.

Слишком много категоричных неверных утверждений в одном предложении.

кому проще? и не из за деградации ли владения русским проще?

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

И это никак не сказалось на прикладном интерфейсе программирования Linux

Это и другие изменения в стандартах могут сказаться на примерах кода, которые приводятся в этой книге.

Следующая попытка.

Водички попей.

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

А что в C когда-то были массивы?

Всегда? просто люди о них не знали и им проще с указателями работать, чем с массивами. Но массивы в С есть и были всегда.

fsb4000 ★★★★ ()

Кому нужна ИТ литература не на английском? Оно устаревает еще до перевода.

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

Кому нужна ИТ литература не на английском? Оно устаревает еще до перевода.

так долго переводить на русский язык?

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

На vk.com вмести с массой другой IT литературы.

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

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

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

Динамические массивы никто не удалял, их просто нет и не было никогда.

Если ты про это

int func(int size)
{
    int array[size];
    return sizeof(array);
}

То это не удалили, а как рас таки добавили в с11. Так что я ещё раз спрашиваю, ссылку можно? Ибо я реально не понимаю про что ты.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.