Софтинки    

  Калькулятор ~ 
  Калькулятор-2 ~ 
  Калькулятор-3 ~ 
  Web-сервер ~ 
  Weeby ~ 
  Кука ~ 
  PAM-SSRA ~ 
  Dozer ~ 
  JI Synth ~ 
  JI Synth 2 ~ 
  httpfw ~ 
  nanoNET ~ 
  kurare ~ 
  edsm ~ 
  edsm-2 ~ 
  One more webd ~ 
  avr8-edsm ~ 
/Разное/Софтинки/Weeby

WEBD

Everything in UNIX is a file

Если как следует накуриться мануалов про eventfd, signalfd, timerfd_create, inotify, io_submit и иже с ними, то неизбежно приходишь к мысли, что, во-первых, парни, которые пилят ядро Linux, молодцы и во-вторых - что таки $эпиграф. Вот если бы ещё системный вызов fork() возвращал не pid, а файловый дескриптор, была бы вообще красота - не надо было бы возиться с SIGCHLD, но увы, вряд ли это уже когда-нибудь изменится. Хотя, надежда умирает последней.

А раз так - то берём и подсовываем все эти fd в epoll - получается практически универсальный движок для любой, извиняюсь, event driven programm.

Замечание между строк: можно и Иксы сюды впихнуть - см. про ConnectionNumber() в руководстве про X Window. Тонко намекаю - эта штука возвращает сокет, который используется для связи с X-сервером. Стало быть, к XNextEvent() обращаемся только тогда, когда epoll/poll сообщает что-нить там по по поводу этого самого сокета. Чо-то в таком духе... И ещё - есть такое смутное подозрение, что и ALSA можно туда же пристроить. Собственно, уже пристроил и xlib, и alsa И базы данных - тоже. Впрочем, можно на заморачиваться с libpq, а реализовать протокол Postgres ручками и тогда вообще никакой проблемы нет.

Ну я так и сделал. Смотри include/ee.h и ee/libee.c в исходных текстах. Красотулечка, да? :) Если кто не понял насчёт аббревиатуры "ee" - это Event Engine.

Чем дальше в лес, тем толще партизаны. Раз есть двигунок, надобно какой-то примерчик его использования нарисовать. Почесав немного свой программистский зуд, порешил я в качестве такового забабахать http-сервер. Далее речь, сопсна, об ём, об WEBДемоне.

Тут для начала надо заметить, что движок (который ee), выполнен в виде динамически загружаемой библиотеки. Грузи себе, да пользуйся.

Далее - движок веб-сервера (не путать с event engine) сам по себе почти ничего не умеет - даже не умеет выдавать, извиняюсь, статический контент. А что же он умеет? Он умеет принимать соединения от клиентов, считывать и разбирать запросы (при этом с легкостью управляется с конвейеризацией оных), а также отправлять "контент" в сторону клиента. Всё.

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

На данный момент есть только один "генератор" - см. webd-congs/libstatic.c. Как понятно из названия - именно он и могёт считывать данные с накопителя. Делает он это весьмааа своеобрааазно - при помощи libaio, да ещё при открытии файла использует флажок O_DIRECT. Это всё для того, чтобы при чтении очередного фрагмента файла не уйти вдруг в состояние ожидания, а пойти на следующий заход epoll_wait и тут, возможно, обработать другое событие в виде, например, подключения очередного клиента. Есть, правда, одна неприятность с этим O_DIRECT - муторно делать докачку. Я не буду рассказывать, почему - это вам домашнее задание ггг. Но никто не мешает написать другой плагинчик, который бы читал файлы "обычным" образом. Флаг в руки, как говорится :)

Если кто до сих пор не понял - расширение функциональности веб-сервера делается не гламурным писанием всяких там скриптов на всяких там perl, php и прочих питонах, а суровым, брутальным и одновременно хардкорным писанием dll-ки на языке программирования Си. При этом сами собой отпадают всякие дурацкие "проблемы" вроде, например, "persistent connections". Плагинчик при инициализации подключился к СУБД и вуаля.

Генераторы контента, если кто вдруг опять не понял, используют тот же самый механизм (ee) для получения уведомлений о возможности записи/чтения в тот или иной fd, что и сам веб-движок. Более того, генераторам предоставляется набор инструментов для всяких насущных потребностей. См. webd-tools/. На сей момент имеется токмо один чемоданчик под кодовым названием http, в котором имеются такие инструментики, как parse_http_request, url_decode и всякая такая мелочёвка...

Ну вот, сопсна, всё. Вместо заключения скажу, что серверочек-то не особо крутой в плане функциональности - понимает только GET и HEAD... потому что реализовать POST за 2 недели мне было реально влоооомммм.... :)

Скачать пакетики DEB

i386
amd64

Дата последней модификации: 2018-10-11


/Разное/Софтинки/Weeby

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

Valid HTML 4.0 Strict Valid CSS!