LINUX.ORG.RU

Пример разработки простого многопоточного сетевого сервера: Часть 2. Полноценный разбор параметров командной строки

 


0

0

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

>>> Подробности

★★★

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

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

>долбаеб, тогда разработчики ядра Linux и просих известных открытых проектов, школота?

Ага. Так пишет именно школота.

Sun-ch
()
Ответ на: комментарий от Sun-ch

Цитируем Sun-ch

В java есть подходящий паттерн, бери и пользуй без лишней головной боли с управлением потоками и памятью.

Вас уже можно считать мегааналитиком и первым заместителем iZEN'a?

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

Херня какая-то. что это такое kswapd? Вообще говоря, на нормальных юниксах, все процессы работают в рамках установленных resource limits и скажем кильнуть sshd никто не даст.

Sun-ch
()
Ответ на: комментарий от shahid

Вот и пиши «конечный автомат», а не Flying Spaghetti Monster!

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

А чего не так? Именно многопоточный сервер на java отличный пример для обучения вещам такого рода. А учиться писать на С, не зная массы особенностей и граблей конкретной системы - профанация.

Sun-ch
()
Ответ на: комментарий от shahid

>> FSM - это Flying Spaghetti Monster? Не так ли? ;-))

Конечный автомат.


Не раздобудешь себе юмора, не быть тебе капитаном.

LamerOk ★★★★★
()
Ответ на: комментарий от Sun-ch

> А учиться писать на С, не зная массы особенностей и граблей конкретной системы - профанация.

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

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

Сдается мне, что изучение «С» тебе не поможет, если ты не знаешь про неблокирующий select/poll в разных потоках. Вот добрые дяди, из бывшей Sun отлично знают всю эту мутоту, и написали жабку, где вся эта хрен под капотом.

Sun-ch
()
Ответ на: комментарий от Sun-ch

> А зачем?

Затем, что жаба на нетбуке - извращение и тормоз.

Хотя, если ты напишешь лучше - можешь послать резюме в Оракл.

А если просто нормально - не останешься без работы. Учится, учится, ищо раз учится (с)

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

и правда, что ж МежДелМаш совсем расслабились :(

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

> FSM - это Flying Spaghetti Monster? Не так ли? ;-))

Не так ;) Finite State Machine. По аббревиатуре FSM гугл быстро подсказывает подходящий вариант :)

Кста, Sun-ch, не пробовал делать на жаве FSM на SSL сокеты со своими собственными корневыми сертификатами? Я хотел бы посмотреть на твой паттерн... ;)

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

> memset( ..., len+1) - добавление одного байта для конца строки strncpy - не мультибайтная функция. и совем не как массив байт.

В контектсе utf-8 это пофиг глубоко. Про utf-16 не уверен, правда, не изучал.

Casus ★★★★★
()
Ответ на: комментарий от anonymous
> while(gp.modulesList[i])
 > fprintf(stdout, "[%s]\n", gp.modulesList[i++]);
 > i--;
 
 Совершенно безграмотное предложение от школоты.
 Особенно использование инкремента/декремента в вызове функции.
 Например такой код:
 int i = 0;
 printf("%d %d %d\n", i++, i, --i);
 на разных компиляторах даст разный результат.

Упражнение для очень умных: найти различие между двумя разными выражениями while+fprintf и одним выражением fprintf.

Hint: результат оригинального кода не зависит от интерпретации его компилятором, если авторы компилятора реализовывали то же стандарт, что и остальные.

Casus ★★★★★
()
Ответ на: комментарий от Sun-ch

> Да самое тупое - перестать обслуживать новых клиентов до освобождения ресурсов.

Всё зависит от критичности сервиса, который предоставляет программа. Поскольку, когда кончается память в сложном довольно месте, например при выделении динамической строки для записи в лог, а при этом буфер для записи или выделен, или ещё нет, буфер для клиента, и т п, и функция формирования строки не в курсе какие действия надо же всё-таки прекратить, чтобы придти в какое-то состояние в программе, чтобы ждать, когда память появится, и не бояться, что прилетит OOM Killer — это очень сложная структура программы может получиться, чтобы в момент каждого выделения памяти знать какое действие совершить в случае облома, и чтобы самой при этом не попасть под раздачу. Далеко не каждый сервис заслуживает такого сложного планирования. Часто проще отдельный вотчер сделать.

Например, как в sendmail ...

О, да. Я помню как ручками в sendmail.cf лазил... Не надо мне его как пример приводить :)

Casus ★★★★★
()
Ответ на: комментарий от Sun-ch

> Сдается мне, что изучение «С» тебе не поможет, если ты не знаешь про неблокирующий select/poll в разных потоках. Вот добрые дяди, из бывшей Sun отлично знают всю эту мутоту, и написали жабку, где вся эта хрен под капотом.

У меня есть опыт по FSM и по тредам. Тредовая нагрузка получается выше, когда речь начинает идти о 3-5 тыщах соединений. FSM при этом не чихает ещё долго. Я их комбинировал, чтобы 10-15 тредов, каждый с FSM, при этом и процессоры загружены все, и 10-15к соединений на той же машине с меньшей нагрузкой держатся. А жабке стоило бы socketpair хотя бы иметь в арсенале ;)

Casus ★★★★★
()

Многопоточный сервер не на erlang? Ну и шутники работают в этом вашем IBM.

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

> А какое отношение разбор командной строки имеет к многопоточному сетевому серверу?

многопоточный сетевой сервер разбора командной строки? что-то типа Google App Engine.

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

Sun-ch> ...

Вас уже можно считать мегааналитиком и первым заместителем iZEN'a?

Sun-ch. первым заместителем iZEN'a. Это не расжаловал, это просто опустил.

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

> Я их комбинировал, чтобы 10-15 тредов, каждый с FSM, при этом и процессоры загружены все

А не проще ли было взять Erlang, который делает число тредов равным числу процессоров да ещё и preemtive multitasking между процессами в отличие от FSM на поллинге.

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

> А не проще ли было взять Erlang

Может и проще, если б знал его. Как-то вот до сих пор не довелось. Предметно спорить про erlang не могу. А избыточно треды не мешают, если их немного, наоборот, пока один блокируется на доступе к базе/диску, второй может поработать, поэтому делать их количество равным количеству процессоров может быть не всегда оптимально.

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

> В контектсе utf-8 это пофиг глубоко. Про utf-16 не уверен, правда, не изучал.

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

hawai
()
Ответ на: комментарий от Sun-ch

> И вообще нахрена учить детей, писать в 21 веке мультридовые сервера на С?

Эффект неплохой, разрыв шаблона и расширение сознания.

В java есть подходящий паттерн, бери и пользуй без лишней головной боли с управлением потоками и памятью.

Эффект слабый, близкий к отсутствующему.

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

> а юзверы порой такие юзверы и любят давать файлам и каталогам осмысленные ими длинные имена на родном языке.

Многопоточные серверы на С обычно работают с файлами в /var/spool и на юзверей им положить. В /etc и Maildir имён в utf не бывает.

sv75 ★★★★★
()
Ответ на: комментарий от Sun-ch

> А учиться писать на С, не зная массы особенностей и граблей конкретной системы - профанация.

Разумеется, с особенностями и граблями. И желательно с билдом хотя бы под 2-3 разные ОС. Это же не курс изучения Си.

sv75 ★★★★★
()

Мда потратил сегодня полчаса на параметры командной строки используя малоизвестную (и то потому ято нет ещё документации и пришлось смотреть в коде), но очень быструю реализацию вебсервера на питоне, и не на потоках кстати. Причем разбор командной строки народ судя по всему туда «до кучи» просто реализовал. ))) И причем от PHP FastCGI+ngnix, это дело проигрывает всего 20% работая в одном инстансе без frontendа.

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

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

Ох, господи... Даже троллить лень.

UTF-8, a transformation format of ISO 10646


3 UTF-8 definition
...

The table below summarizes the format of these different octet types. The letter x indicates bits available for encoding bits of the character number.

   Char. number range  |        UTF-8 octet sequence
      (hexadecimal)    |              (binary)
   --------------------+---------------------------------------------
   0000 0000-0000 007F | 0xxxxxxx
   0000 0080-0000 07FF | 110xxxxx 10xxxxxx
   0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
   0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
...

4 Syntax of UTF-8 Byte Sequences
For the convenience of implementors using ABNF, a definition of UTF-8 in ABNF syntax is given here.

A UTF-8 string is a sequence of octets representing a sequence of UCS characters. An octet sequence is valid UTF-8 only if it matches the following syntax, which is derived from the rules for encoding UTF-8 and is expressed in the ABNF of [RFC2234].

UTF8-octets = *( UTF8-char )
   UTF8-char   = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4
   UTF8-1      = %x00-7F
   UTF8-2      = %xC2-DF UTF8-tail
   UTF8-3      = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
                 %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
   UTF8-4      = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
                 %xF4 %x80-8F 2( UTF8-tail )
   UTF8-tail   = %x80-BF

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

> а юзверы порой такие юзверы и любят давать файлам и каталогам осмысленные ими длинные имена на родном язык

Пофиг это полностью и совершенно! strncpy копирует БАЙТЫ! По 8 бит! И чо там, то ли UTF-8, то ли UTF-16 или UTF-32 полностью параллельно!

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

> на utf-8 все будут молиться, что бы имена файлов остались в пределах английского алфавита, ибо даже немецкие умляуты всё поставят в позу.

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

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

> Поподробнее, что вы хотите?

Я? Уже ничего. Но утрахался капитально :) Больше всего бесит, что нельзя обойтись без вызова программы keytool.

Casus ★★★★★
()

Для полноценного разбора параметров командной строки нет необходимости писать многопоточный сетевой сервер.

Напиши с десяток строк на Питоне.

pythonist
()

Что-то я туплю.

#include <getopt.h>

Что этим хотел сказать автор, и какой тип должны иметь эти самые переменные lt и gt. А то автор упростил код до такого состояния, что он не работает :). Уж лучше бы в псевдокоде написал, а то от такой проги у меня шаблон трещит. Я просто думал посмотреть велосипед, не заводится.

rave
()

Так, присмотрелся, подозреваю, что эти переменные - это int

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

>На эрланге было бы интереснее

Многопоточный сервер на эрланге - интереснее???

Скорее - банальнее (на порядок)

Led ★★★☆☆
()
Ответ на: комментарий от Sun-ch

> Эрланг - очень узконишевый недоязычок.

Все существующие языки - узконишевые недоязычки, кроме Lisp. Поэтому ими и пользуются. ;)

Уж если портить детей, то портить их надо


Портить не надо, поэтому D :P

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

> next_option = getopt_long(argc, (char**)argv, short_options, long_options, NULL);

Да-да, именно на случай wchar_t в коде идет приведение к char** с последующим strlen...

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

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

Дело не в gcc, в случае с fprintf(stdout, «[%s]\n», gp.modulesList[i++]); неоднозначности нет.

Reset ★★★★★
()

Не люблю getopt. Он мало того, что переусложнен, так еще и платформозависим. Простой синтаксис командной строки руками проще разобрать, а для сложного синтаксиса, например как у команды find, ничего удобнее bison'а пока не придумали.

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