LINUX.ORG.RU

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

 


0

0

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

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

★★★

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

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

про какой язык речь? erlang чтоли?

автор использует valgrind


это такие намеки чтобы мы догадались про язык? млин, такое ощущение, что помимо default city есть еще и default lang.

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

> млин, такое ощущение, что помимо default city есть еще и default lang

Есть. Там как раз он, есличо.

//c:thermos programming

anonymous
()

>кандидатом на включение в «промышленные» программы

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

Автор статьи - идиот?

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

Чувствую, многопоточностью и сетью запахнет части эдак на двадцать пятой. А то ж еще логать надо, конфиг читать, SIGHUP ловить и т.д...

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

> Автор статьи - идиот?

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

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

> Автор статьи - идиот?

int main(int argc, void **argv) { в первой статье

Зачем void, а не char? Или правда идиот?

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

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

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

>... и до продакшена его поделки тоже допускать нельзя....

Это безусловно, но вот это я так бегло не увидел сразу, в чём там проблема:

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

А я вот как-то не догадываюсь что там не так. Там работа со строками как с массивом байт построена, utf-8 или другой юникод/кодировка должны передаваться, копироваться «как есть», т.е. это фунции, которые работают со строками, должны понимать в какой кодировке им что дали. В данном примере просто должна совпадать кодировка терминала, сообщений программы и файловой системы, что в случае utf-8 везде как раз не представляет проблемы.

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

> Педагог, который после вызова calloc() не проверяет на ENOMEM?

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

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

Надо учить plain C и его популярность растёт, в отличии от жабы. Вокруг толпы мелких железок - роутеры, адсл-и, нетбуки и ещё море. Их будет только больше - маленьких, маложрущих. И тактовая в уже расти не будет.

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

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

Учитывая, что автору самому не помешало бы пообразовываться ;)

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

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

Кстати, если уж заморачиваться такими сложностями, то стоит сразу не просто малтитредовые, но ещё и FSM зараз делать, чтобы уж совсем полный улёт был... ;)

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

Цитируем Sun-ch

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

Новость-то читал? Особенно слова «простого многопоточного сетевого сервера».

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

>Как раз разумнее упасть в корку и лежать

Глупость. Это как раз не фатальный отказ, как в случае отказа оборудования, а временный, типа нехватки ресурсов. Существует масса разуммный стратегий поведения, а не тупо завершить процесс.

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

Да самое тупое - перестать обслуживать новых клиентов до освобождения ресурсов. Например, как в sendmail, который спокойно работает при совершенно охренительной загрузке системы. И вместо того, чтобы клепать такие дилетанские писульки, лучше разобраться и опубликовать тщательно прокомментированный код серверной части того же sendmail. Вот у кого надо учиться программировать, это настоящий образец «промышленного кода», к которому автор статьи даже и близко не подошел.

Sun-ch
()

А какое отношение разбор командной строки имеет к многопоточному сетевому серверу? В том смысле, что разбор командной строки должен быть в (почти) любой программе. Может стоит переименовать статью? Что-нибудь типа «Пример разработки программы: полноценный разбор параметров командной строки» вполне подошло бы.

Laz ★★★★★
()

Об авторе

Занимается администрированием ОС GNU/Linux и разработкой ПО для нее (C/C++, LAMP), а также проектированием информационных систем на базе GNU/Linux. Является идеологом, maintainer'ом и одним из основателей ресурса LinuxPortal.Ru.


Пиз-ец этим информационным системам при таком кодировании. Нет всех проверок на ошибки и количество строк кода можно было сократить. Мда...

anonymous
()

Хм да уж.Исложение немножко не то ( Хотя какой-то базис может дать. Кроме того учитывая где это публикуется - то это нормально(Статью наверное в несколько раз порезали)

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

кандидатом на включение в «промышленные» программы >нужно дополнить проверкой значений, возвращаемых функциями, работающими с динамически выделяемой памятью

Автор статьи - идиот?

судя по стилю оформления кода, какая-то школота

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

Нахера так:

while (NULL != gp.modulesList[i]) {
fprintf(stdout, «[%s]\n», gp.modulesList[i]);
i++;
}
i--;
Если так можно (тогда уже):

while(gp.modulesList[i])
fprintf(stdout, «[%s]\n», gp.modulesList[i++]);
i--;

Обратите внимание на i-- после этого цикла. Это говорит о том, что автор не грамотно закодировал алгоритм.

Промышленный стандарт блин........

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

> Педагог, который после вызова calloc() не проверяет на ENOMEM? Может он еще руки после туалета не моет?

после вызова *alloc() нужно проверять возвращаемый указатель

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

>> А я вот как-то не догадываюсь что там не так. Там работа со строками как с массивом байт построена, utf-8 или другой юникод/кодировка должны передаваться, копироваться «как есть», т.е. это фунции, которые работают со строками, должны понимать в какой кодировке им что дали. В данном примере просто должна совпадать кодировка терминала, сообщений программы и файловой системы, что в случае utf-8 везде как раз не представляет проблемы.

if (_confFilePathLength > len) { memset(&gp.confFile, '\0', len + 1); strncpy(gp.confFile, optarg, len);

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

всё это сложится, как только имя файла не будет в латинcких буквах. http://ru.wikipedia.org/wiki/UTF-8 - не всегда байт на символ.

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

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

http://www.kegel.com/c10k.html

ибо возникает ощущение, что автор плавает в излагаемом вопросе.

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

>> Нахера так:


while (NULL != gp.modulesList[i]) {

я бы сказал, что это замена неявного преобразования из char* в bool на явное. как минус - избыточные символы. как плюс - явное указание стратегии толкования условия. бывает, нужно, бывает компилятор не любит неявно преобразовывать указатель в bool и пишет всякую хрень.

Обратите внимание на i-- после этого цикла. Это говорит о том, что автор не грамотно закодировал алгоритм.

не вижу криминала. «грамотный» алгоритм, вероятно, потребовал бы больше кода и переменных. --i; предпочтительнее, но тоже не фатально.

hawai
()
else if (NULL == result) {
...
}
else if (NULL != result) {
...
}

Оптимальненько

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

>после вызова *alloc() нужно проверять возвращаемый указатель

Это не модно. Для борьбы с течкой памяти, автор рекомендует использовать valgrind.

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

> http://ru.wikipedia.org/wiki/UTF-8 - не всегда байт на символ.

Чушь, кодировка никому не интересна - char * strncpy (char * dest, const char * src, size_t n);

strncpy копирут char, т.е. восьмибитные числа и всё. Как _человек_ интерпретирует имя как-то параллельно

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

>Обратите внимание на i-- после этого цикла. Это говорит о том, что автор не грамотно закодировал алгоритм.

если компилер посадит i в регистр, то с точки зрения производительности это очень даже хороший алгоритм (dec eax - быстро, 2 байта емнип). да, некрасивый.

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

> while(gp.modulesList[i])

fprintf(stdout, «[%s]\n», gp.modulesList[i++]);

i--;



Совершенно безграмотное предложение от школоты.
Особенно использование инкремента/декремента в вызове функции.
Например такой код:
int i = 0;
printf(«%d %d %d\n», i++, i, --i);
на разных компиляторах даст разный результат.

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

2anonymous (11.02.2010 17:26:45)

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

2) Речь идет о gcc

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

лучше разобраться и опубликовать
тщательно прокомментированный
код серверной части того же sendmail

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

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

> Например такой код

А где ты увидел «такой код» в предложении от «школоты»?

LamerOk ★★★★★
()

Чето я не понял, чем по сути это отличается от man 3 getopt_long...

Правда просмотрел по диагонали =)

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

Дяденька в курсе во что обходится отсутствие памяти для системы в целом? java что, совсем мозги отбивает? А, ну да, у вас же там свой процессор работающий на частоте 1.25 от исходного. Я вам намекну что kswapd съест всё до чего может дотянутся, я имею в виду CPU, с тем чтобы достать вам эту память. Перетрусит всех и каждого, загонит всех на винт и т.д., но даст вам её. Или убъёт кого-то если очень надо и от его трупа отдаст вам кусочек. Вот так дела делают в суровой реальности. Так что проверяй, что не проверяй всё едино, только картину core портить.

alx_me ★★☆
()

В отношении имён модулей тут есть тонкий момент, связанный с безопасностью. Имена модулей вместе с путём до рабочего каталога программы понадобятся нам в будущем для загрузки этих самых модулей в виде файлов динамических библиотек (*.so). Подсовывая нашей программе имя модуля, содержащее спецсимволы (например, "..", «/»), можно заставить её открыть файл с тем же именем, но из другого каталога, например, домашнего каталога злоумышленника и выполнить содержащийся в файле код. Нам это не нужно, поэтому для исключения имен модулей.

Это мягко говоря параноя! Пользователь который хочет запустить программу пытается её обмануть передавая её компрометирующие параметры! Это ж надо до такого дойти!

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

И когда наконец for(;;) strcmp() не заменят на красно/чёрное или ещё лучше на троичное дерево?

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

Напиши Эрику, может он согласится дать комментарии по наиболее сложным моментам.

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

> Или убъёт кого-то если очень надо и от его трупа отдаст вам кусочек. Вот так дела делают в суровой реальности.

В суровой реальности есть еще как минимум vm.overcommit_memory и vm.overcommit_ratio.

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

Sendmail писали педерасты :)

Низзя его как пример рекомендовать, лучше Postfix

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

> Это мягко говоря параноя! Пользователь который хочет запустить программу пытается её обмануть передавая её компрометирующие параметры! Это ж надо до такого дойти!

Если это серьезно, надеюсь ты ничего серьезного не пишешь и не собираешься.

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