Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» CGI-скрипты на языке C

Автор: olsufr
Дата сообщения: 25.06.2003 14:28
Предлагаю в этой теме писать все сообщения касающиеся создания CGI-скриптов на языке С, С++

Вот ссылка на другую тему, в которой обсуждается выбор компилятора:
http://forum.ru-board.com/topic.cgi?forum=33&bm=1&topic=0920#1

-----------------------------------------------
Сейчас начинаю пробовать создавать скрипты на С.

Если есть у кого-нибудь хорошие советы по написанию скриптов,
то хотелось бы их услышать.

Знаю, что в отличии от Perl в С вопрос обеспечения безопасности
скрипта решается гораздо сложнее. Какие здесь есть нюансы и
отличия от Perl ?

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

Код:
#include <stdio.h>
int main()
{
printf("Content-Type: text/html\n\n");
printf("<html><body><h1>Hello World!</h1></body></html>");
}
Автор: webdeveloper
Дата сообщения: 25.06.2003 14:52
olsufr

Цитата:
code][/code]

код ты похоже забыл....
Автор: djelektronik
Дата сообщения: 25.06.2003 17:09
там есть еще ключи оптимизации -О3 обычно идет
Автор: olsufr
Дата сообщения: 25.06.2003 17:24
webdeveloper

Цитата:
olsufr

Цитата:code][/code]

код ты похоже забыл....
Точно. Я его уже вставил на место.

djelektronik
Цитата:
там есть еще ключи оптимизации -О3 обычно идет

Я пользовался компилятором Bloodshed Dev-C++
( http://www.bloodshed.net/ )
Может знаешь какие в нем особенности надо учитывать?
Автор: quesejodan
Дата сообщения: 25.06.2003 20:18
olsufr
Неужели скрипты на С имеют такие огромные размеры (в сравнении с Perl) ?

Имеет место неверное сравнение размеров...
скрипт написаный на языке перл он скрипт и есть, то бишь его запуск эквивалентен
запуску интерпретатора perl (обычно около 4,5 мегов) который собственно и процессит скрипт.

В случае C++ экзешника мы имеем дело с законченым продуктом...он запустится и память будет занимать только сам...
Так что 23К против perl + размер скрипта - вполне хорошо....

А вообще я например используя просто 2 свитча : -O3 -s довёл размер до 2796 байт, но и это далеко не предел...
Автор: olsufr
Дата сообщения: 25.06.2003 20:33
quesejodan
Цитата:
Имеет место неверное сравнение размеров...
Конечно ты прав.



Цитата:
А вообще я например используя просто 2 свитча : -O3 -s довёл размер до 2796 байт, но и это далеко не предел...
Вот как бы мне поподробнее узнать о подобных параметрах для моего компилятора Bloodshed Dev-C++ ?
Автор: quesejodan
Дата сообщения: 25.06.2003 20:36
Обычно вместе с компиляторами приходат мануалы к ним, в коих и объясняется какие опции есть а каких нет, поищи в инете мануал к твоему компилятору...
Автор: olsufr
Дата сообщения: 25.06.2003 20:43
А при компилировании с GCC в Unix какие опции есть?
Автор: arto
Дата сообщения: 25.06.2003 20:51

Цитата:
скрипт написаный на языке перл он скрипт и есть, то бишь его запуск эквивалентен
запуску интерпретатора perl (обычно около 4,5 мегов)

# ls -alF =perl
-rwxr-xr-x 2 root root 13671 Mar 19 14:19 /usr/bin/perl*
#

всего 13к. у меня неправильный perl?
Автор: quesejodan
Дата сообщения: 25.06.2003 21:01
arto
эхх Арто, Арто ....

Ну ктож это дело ls ом мерЯет

сделай скажем ldd от перла и увидишь все динамические либы которые к нему прилинкованы

Ежели перл слинковать статически, то и получатся те самые 4,5 мега...


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

Добавлено
скажем в самом простейшем примере который был показан, там где перл может оптимизировать своё существование, перл занимает в памяти 1,3 Кб
А с - 268 байт
Автор: arto
Дата сообщения: 25.06.2003 23:28

Цитата:
увидишь все динамические либы которые к нему прилинкованы


т.е. все они будут разделяться?
и если у меня уже запущен perl, то второй запуск не заставит их заново подгружаться?

Автор: quesejodan
Дата сообщения: 26.06.2003 11:24
несомненно, разделяться будут.

Но по любому перловый скрипт в сумме съест больше памяти чем Си-шная программа.

Другое дело, что написать многие вещи на С также грамотно как перл выполняет свой скрипт - очень сложно, и занимает гораздо больше времени..
Автор: olsufr
Дата сообщения: 26.06.2003 14:52
quesejodan
Цитата:
написать многие вещи на С также грамотно как перл выполняет свой скрипт - очень сложно, и занимает гораздо больше времени..

А какие вещи стоит писать на С,
а какие - нет и их тогда лучше на Перле писать?
Может какие есть примеры из практики?
Автор: DStream
Дата сообщения: 26.06.2003 15:25
olsufr

Цитата:
А какие вещи стоит писать на С,
а какие - нет и их тогда лучше на Перле писать?
Может какие есть примеры из практики?

Ну, к примеру, ежели у тебя сложнейшая какая-то обработка изображения производится. Хотя собственно в таких случаях достаточно сделать библиотеку и вызывать нужные обработки из того же перла.
Аналогично - если дело касается не скорости, а например сокрытия исходного кода (алгоритмики).
Где-то мне попадалось такое: "...наш чат переписан на С и стал работать быстрее..."

Хотя возможность быстрой "поправки" скриптов и "генеральная линия" серьезно перевешивают в сторону перла. Особенно когда дело касается арендованного хостинга, где может быть недоступен компилятор, да и вообще точной информации о операционке нет и не факт, что завтра ее не сменят без предупреждения.
Автор: quesejodan
Дата сообщения: 26.06.2003 15:52
olsufr,



DStream полностью прав.
Несмотря на то, что "C" работает быстрее, писать на нём CGI мягко говоря неразумно..
Для перла, ПХП и Java есть всякие суровые опции кэширования и тд и тп, что очень помогает в скорости, а разработка на них по сравнению с "C" чуть-ли не в 10-ки раз легче.

Один из случаев когда таки С лучше, это когда делаешь что-то для сервера который не твой (то есть никаких глобальных опций веб сервера поменять не можешь), очень загружен, и неоптимизирован под perl/php/.... . Тогда С-шные CGI очень кстати...
Автор: DStream
Дата сообщения: 26.06.2003 16:12
quesejodan

Цитата:
Один из случаев когда таки С лучше, это когда делаешь что-то для сервера который не твой (то есть никаких глобальных опций веб сервера поменять не можешь), очень загружен, и неоптимизирован под perl/php/.... . Тогда С-шные CGI очень кстати...

Я бы даже сформулировал так: когда производительность/нагрузка настолько критичны, что пишется своя узкоспециализированная штуковина вместо apache. Так как по-моему выигрыш по производительности при переписывании perl-скриптов на с-программы не будет настолько уж заметен по сравнению с заменой универсального апача на что-то узкозаточенное, что естественно будет писаться на С и тогда сам бог велел остальное писать как составную часть этой проги.

Кстати писать:
Код: printf("Content-Type: text/html\n\n");
printf("<html><body><h1>Hello World!</h1></body></html>");
Автор: quesejodan
Дата сообщения: 26.06.2003 16:42
DStream, я не о том...
Такие случаи тоже конечно же есть .. только скажем в вебе они редко встречаются,
обычно всё таки на сам веб нагрузку по процессингу чего-либо не кладут..

А, например, если хостишься у какого-нить провайдера, который имеет свои настройки апача, и при том офигенную нагрузку (куча клиентов).
И скажем твои перловые скрипты не кэшируются, долго пускаются и тд и тп, а тебе нужно чтоб всё-таки тормоза помене были...
Тогда помогает писать на С.
Автор: olsufr
Дата сообщения: 26.06.2003 17:44
DStream, quesejodan, спасибо.


DStream
Цитата:
Кстати писать:

Код: printf("Content-Type: text/html\n\n");
printf("<html><body><h1>Hello World!</h1></body></html>");

не есть хорошо, т.к. printf тащит за собой столько всего...
Автор: olsufr
Дата сообщения: 27.06.2003 14:52
DStream
Цитата:
по-моему выигрыш по производительности при переписывании perl-скриптов на с-программы не будет настолько уж заметен
Неужели? Получается, что высокая скорость работы CGI-скриптов написанных на С это миф?


quesejodan
Цитата:
Несмотря на то, что "C" работает быстрее, писать на нём CGI мягко говоря неразумно..
Для перла, ПХП и Java есть всякие суровые опции кэширования и тд и тп, что очень помогает в скорости, а разработка на них по сравнению с "C" чуть-ли не в 10-ки раз легче.
А возможно ли, из исходников Перла и ПХП стянуть нужные функции и применить (естественно обработать ручками перед этим) в собственной С-программе ?
Автор: quesejodan
Дата сообщения: 27.06.2003 15:16
olsufr,
отвечу сразу на 2 вопроса.

1) высокая скорость запуска отдельной программы это не миф.
Другой вопрос, что если пишешь на С без какой-либо инфраструктуры, то есть без каких-нить C-Server Pages и тд итп, то самому придётся писать и механизм кэширования скрипта в памяти и тд. Ну или сервер как-нить долго и геморно подстраивать.

Далее, например перл силён немеряно своими regexp ами и тд. Я сумлеваюсь, что на C так же эфективно напишешь многие функции.

Ещё далее. Смотри всегда не только на performance, но на price/performance.
Сделать что-либо на perl, в разы легче чем на C. Если ты пишешь что-либо объёмное, то тебе гораздо дешевле написать это на перле скажем и купить машину помощнее...

Просто в тему, вчера был на Оракловском семинаре, там обсуждалось много всяких вещей и в какой-то момент возник вопрос об оптимизации, на что оракловец сказал:
"можно достаточно беспроблемно оптимизировать это на 90-95%, а вот чтобы оптимизировать на 98% нужно потратить кучу времени и ещё часто поддерживать и следить...а можно просто потратить лишние $2000 и купить чуть помощнее железо..
Получится гораздо ДЕШЕВЛЕ."
Так что не увлекайся написанием CGI на С....

2) Из перла - точно можно, из ПХП - наверно можно, только вот - нужно ли?
Автор: olsufr
Дата сообщения: 27.06.2003 16:23
quesejodan, понятно. Все аргументы вне спора.


Цитата:
Другой вопрос, что если пишешь на С без какой-либо инфраструктуры, то есть без каких-нить C-Server Pages и тд итп, то самому придётся писать и механизм кэширования скрипта в памяти и тд. Ну или сервер как-нить долго и геморно подстраивать.
А вот про это мог бы поподробнее расказать, очень интересно? Т.е. кроме самого скрипта на С мне надо еще написать и "механизм кэширования" ?

Вообще то говоря, язык Перл мне очень нравится, я просто в восторге от него (на фоне Перла ПХП как-то коряво выглядит).


Цитата:
тебе гораздо дешевле написать это на перле скажем и купить машину помощнее...

Это понятно, но а если я нахожусь на чужой тормозной (или перегруженной) машине,
тогда ... взгляд обращен на С.



Цитата:
Далее, например перл силён немеряно своими regexp ами и тд. Я сумлеваюсь, что на C так же эфективно напишешь многие функции.
У меня тоже такие сомнения.



Цитата:
Из перла - точно можно
Как я понимаю, для этого надо в исходниках Перла искать функции или классы с соответствующим нужной Перловской функции названием ?


Автор: quesejodan
Дата сообщения: 27.06.2003 16:50
olsufr
>> Т.е. кроме самого скрипта на С мне надо еще написать и "механизм кэширования" ?
не, ну как тебе скать, если у тебя нет контроля над сервером, то это очень геморно всё, то есть даже думать об этом страшно.
Если ты реально хочешь повысить скорость, то конечно лучше кэшировать всё что не попади и всё такое...и самому это всё делать очень и очень непросто.

>>Как я понимаю, для этого надо в исходниках Перла искать функции или классы с соответствующим нужной Перловской функции названием ?
Ну тут есть много разных способов, хоть из перла либы выбирай, хоть делай perlcc на перловые скрипты, хоть p-code из памяти дампь и потом обрабатывай....
Автор: olsufr
Дата сообщения: 27.06.2003 16:56
quesejodan, а без кэширования скрипт на С работать будет медленнее?


Цитата:
>>Как я понимаю, для этого надо в исходниках Перла искать функции или классы с соответствующим нужной Перловской функции названием ?
Ну тут есть много разных способов, хоть из перла либы выбирай, хоть делай perlcc на перловые скрипты, хоть p-code из памяти дампь и потом обрабатывай....
Понятно.


Добавлено
quesejodan, как ты думаешь,
существует ли такая вещь на свете как компилируемый Перл ?
Т.е. чтобы написав листинг программы на Перле затем можно было бы его откомпилировать в исполняемую программу? Или я хочу невозможного?
Автор: quesejodan
Дата сообщения: 27.06.2003 17:48
olsufr
нет, единичная C программа будет очевидно работать быстрее, чем единичная перловая, но! при массивном запуске перл (если грамотно настроен) кэширует скрипты
и при следующем запуске программа уже в памяти, в то время как твой экзешник еще надо запускать...

Компилируемый перл существует несомненно, но он не так уж и хорошо компилирует..
экзешники здоровые получаются и тд...
perlcc - оно и есть.
Автор: olsufr
Дата сообщения: 27.06.2003 17:58

Цитата:
нет, единичная C программа будет очевидно работать быстрее, чем единичная перловая, но! при массивном запуске перл (если грамотно настроен) кэширует скрипты
и при следующем запуске программа уже в памяти, в то время как твой экзешник еще надо запускать...
Т.е. можно сказать, что при активном массовом использовании CGI-скрипта (например, на часто посещаемом форуме) преимущества С по скорости теряются и сравниваются с Перловскими (ну и тем более с PHP'ными). Так?
Автор: quesejodan
Дата сообщения: 27.06.2003 18:06
olsufr
зависит, от очень многого...
Честно говоря очень долго выяснять, но недолго проверить
напиши несколько скриптиков на перле
1) простенький
2) читающий из бд
3) читающий + пишущий в бд + какойнить процессинг данных

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

Сравни результат.
Автор: olsufr
Дата сообщения: 27.06.2003 18:11

Цитата:
а затем воспользуйся каким-нить софтом для бенчмаркинга и тестинга веб-приложений и проверь скорость.
Вопрос чайника: а какой это софт например? Ты имеешь ввиду тестить вэб-приложение на сервере?
Автор: quesejodan
Дата сообщения: 27.06.2003 18:19
Сходи по этим 2 ссылкам, но несомненно есть и множество других..

http://freshmeat.net/search/?q=stress+test+web&section=projects
http://freshmeat.net/search/?q=web+bench&section=projects
Автор: DStream
Дата сообщения: 28.06.2003 00:19
quesejodan

Цитата:
А, например, если хостишься у какого-нить провайдера, который имеет свои настройки апача, и при том офигенную нагрузку (куча клиентов).
И скажем твои перловые скрипты не кэшируются, долго пускаются и тд и тп, а тебе нужно чтоб всё-таки тормоза помене были...
Тогда помогает писать на С.
В таком случае IMHO ничего уже особо не поможет - это уже у хостера машина свопится серьезно и тормоза будут у всех. Хотя, видимо все же старт перлового скрипта поболее памяти потребует. olsufr

Цитата:
А каким спосбом эффективнее всего организовать вывод
многострочного текста?
Просто более низкоуровневыми функциями (write/_write) например.
Цитата:
Неужели? Получается, что высокая скорость работы CGI-скриптов написанных на С это миф?
Скорее я бы сказал, что CGI-скрипты, написанные на perl практически не уступают в производительности С-программам. За что отдельное спасибо Ларри . С учетом того как сегодня пишут на С (огромнейшие либы на все случаи жизни) может даже оказаться, что исполняемый код окажется медленнее и неоптимальнее из-за кучи лишних проверок, чем интерпретированый скрипт - все-таки Ларри из тех, кто юзал машинки с несколькими килобайтами оперативки.

Цитата:
А возможно ли, из исходников Перла и ПХП стянуть нужные функции и применить (естественно обработать ручками перед этим) в собственной С-программе ?

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

Цитата:
Далее, например перл силён немеряно своими regexp ами и тд. Я сумлеваюсь, что на C так же эфективно напишешь многие функции.
Собственно перл написан на С - т.е. как бы по определению это можно сделать, но сколько лет уже perl развивается. Кстати есть библиотеки regex для С.
Автор: m31
Дата сообщения: 22.01.2006 17:28
Добрый день могу я узнать почему у меня не работает скрипт на с выводящий картинку:
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
    FILE* fr=fopen("smile.gif","rb");
    char ch;
    printf("Content-type: image/gif\n\n");
    int i=0;
    while (!feof(fr))
    {
        fread(&ch,sizeof(char),1,fr);
        if (feof(fr)) break;
        fwrite(&ch,sizeof(char),1,stdout);
    }
    fclose(fr);
}
Картинка выводится частично, самое начало. Если сначала полностью считать, а потом вывести в поток - происходит тоже самое.
Очень надеюсь на вашу помощь.

Страницы: 12

Предыдущая тема: TShellTreeView (Делфи)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.