Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Включение в PERL кода на C, Ввод и вывод данных в exe  
V
    Опции темы
Rigel
Дата 5.8.2008, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 24.7.2007
Где: Москва

Репутация: нет
Всего: нет



Задача у меня такая: поисковый механизм роется сначала в базе а потом, как окончательный поиск, в файлах (этот, окончательный, модуль, который должен пересмотреть несколько тысяч файлов, написан на С). Написан предварительный механизм, который передает данные из Перла в EXE-файл:
Код

my $ResultString = `../XPortal/pages/file21.exe $inString`;

В таком виде все работает: формируется строка с параметрами, которые потом, в С, вытаскиваются из argv[], переводятся в char и используются по назначению. На выходе результаты поиска через разделитель добавляются в string и сплитятся потом в perl по этому самому разделителю. Но вот в чем проблема: и входных и выходных данных много, может быть и мегабайты, то есть, командная строка не подходит. Я пытаюсь воспользоваться STDIN и STDOUT, но что-то у меня не получается: если вывод в С я примерно могу себе представить:
Код

my $SearchDatPath = "|../XPortal/pages/file21.exe";
open(SEARCHDAT, $SearchDatPath);
print SEARCHDAT "$inString\n";
close SEARCHDAT;

То чтение из входного потока хоть тут тресни не работает, хотя я С в этот потомк пишу вполне членораздельную статику:
Код

read STDIN, $ResultString, $ENV{CONTENT_LENGTH}; 

Что-то в этом роде не получается. Помогите, пожалуйста, с вводом и выводом. 
--------------------
С уважением. Rigel. http://www.smoliy.ru
PM MAIL WWW ICQ   Вверх
ginnie
Дата 5.8.2008, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 4
Всего: 49



Уважаемый Rigel, рекомендую почитать Bidirectional Communication with Another Process.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Rigel
Дата 5.8.2008, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 24.7.2007
Где: Москва

Репутация: нет
Всего: нет



Это я знаю, но я не хочу запускать независимый процесс - для моих целей это явное излишество. Мне нужно запустить программу, дождаться ее завершения и прочитать то, что она вывела в стандартный поток, не больше. Если бы не обилие параметров, вполне подошла бы командная строка.
--------------------
С уважением. Rigel. http://www.smoliy.ru
PM MAIL WWW ICQ   Вверх
ginnie
Дата 5.8.2008, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 4
Всего: 49



Уважаемый Rigel, я не понял Вашу фразу
Цитата

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

не могли бы Вы ее пояснить?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Rigel
Дата 6.8.2008, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 24.7.2007
Где: Москва

Репутация: нет
Всего: нет



Очень просто - мне нужно, чтобы программа на Си прошлась бы по файлам библиотеки в поисках ключевых слов. Файлы выбираются по другим признакам, отсюда громадный массив на входе. Если поисковик идет по ВСЕМ файлам, то работает такое его включение:
Код

my $ResultString = `../XPortal/pages/file21.exe $inString`;

но командная строка не может выдержать еще и имена файлов, кроме поисковых байтов. Я сейчас продумываю кеширующую схему - когда процессу передается имя сессионного файла, содержащего потребные данные, и в этот же файл Си пишет свой результат. Но, возможно, есть более простая схема, как я писал в первом письме, когда данные другой программе передаются через стандартный поток ввода, программа на Си пишет в стандартный поток вывода а Перл этот поток читает (и все это еще и с mod_perl работает).
--------------------
С уважением. Rigel. http://www.smoliy.ru
PM MAIL WWW ICQ   Вверх
ginnie
Дата 6.8.2008, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 4
Всего: 49



Уважаемый Rigel, если Вас устраивает

Код

my $ResultString = `../XPortal/pages/file21.exe $inString`;


почему не подходит Bidirectional Communication with Another Process? В первом и во втором случае запускается внешний процесс.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
shamber
Дата 6.8.2008, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: нет
Всего: 18



Уважаемый Rigel
вот и мне так кажется. Только Bidirectional Communication даст вам больше свободы действий
PM MAIL Jabber   Вверх
Rigel
Дата 6.8.2008, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 24.7.2007
Где: Москва

Репутация: нет
Всего: нет



Увы, не нужна не свобода а кроссплатформенность...
--------------------
С уважением. Rigel. http://www.smoliy.ru
PM MAIL WWW ICQ   Вверх
korob2001
Дата 7.8.2008, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Цитата(Rigel @  6.8.2008,  17:05 Найти цитируемый пост)
Увы, не нужна не свобода а кроссплатформенность... 

В этом случае придётся вообще отказаться от C и переписать всё на Perl.  Так же можно посмотреть в сторону модулей Inline::... . Вот здесь я приводил пример того, как можно втсроить встроить Java код, в программу Perl, после чего Perl воспринимает методы Java класса, как свои собственные. В данном случае речь шла о модуле Inline::Java, в нашем же случае следует обратьтиться к модулю Inline::C или Inline::CPP.

Это сообщение отредактировал(а) korob2001 - 7.8.2008, 17:08


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Rigel
Дата 8.8.2008, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 24.7.2007
Где: Москва

Репутация: нет
Всего: нет



Спасибо, это уже ближе - но не совсем то: мне нужен не код С а его скорость  smile  . Сначала я написал код на PERL, естественно - он обрабатывал 200 файлов за 37 секунд. Написанный на C он проходит те же 200 файлов меньше чем за секунду - точнее не смог измерить. По техзаданию, поисковка должна обслуживать сто тысяч файлов - поэтому приходиться делать предварительный поиск, чтобы уменьшить число непосредственно просматриваемых файлов до нескольких тысяч. Вот отсюда и появился массив на входе, который не умещается в командной строке.
Inline позволяет выполнять код С, но не обеспечивает его быстродействие - из за количества данных здесь годится только С или ассемблер, причем последний нежелателен ради кроссплатформенности.
Может быть, кто-нибудь знает, нельзя ли оформить программу в кодах как .pm модуль?
--------------------
С уважением. Rigel. http://www.smoliy.ru
PM MAIL WWW ICQ   Вверх
korob2001
Дата 8.8.2008, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Цитата(Rigel @  8.8.2008,  05:38 Найти цитируемый пост)
Inline позволяет выполнять код С, но не обеспечивает его быстродействие - из за количества данных здесь годится только С или ассемблер, причем последний нежелателен ради кроссплатформенности.

Помоему C такой же кроссплатформенный, как и Asm. В любом случае нужно будет компилировать заново, при каждом переносе. Потому я и сказал, что для кроссплатформенности придётся писать на Perl или Java.

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

Если честно, я не понял почему вы считаете, что код скомпилированный Inline будет работать медленнее, чем код, который будет скомпилен вручную? Честно говоря, мне никогда не приходилось использовать Inline::C, но зато приходилось использовать Inline::Java. При первом запуске Perl компилирует Inline код и сохраняет его в специальном каталоге, в итоге я получил уже скомпилированные классы Java например из кода, ссылку на который я вам давал выше,  у меня получился полноценный Java класс Person.class . При следующем запуске, код выполняется намного быстрее, потому как нет необходимости компилировать Inline код повторно, разумеется если не изменялся код программы на Perl, который использует Inline. Так что думаю код скомпиленный Inline, будет работать с той же скоростью, что и код скомпиленный вручную, к тому же Inline компилирует этот модуль тем компилятором, который вы сами ему укажете.
Пробовал я написать программу на Java, которая использует сгенерированный Inline модулем, класс. Работает он так же, как если бы я писал его на чистом Java.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
gcc
Дата 19.8.2008, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 2
Всего: 17



получаеться, что perl на ходу компилирует C и Java !!?

а можно написать демона который будет слушать запросы из perl скрипт...
быстродействие будет? писали где-то, что perl работает с opengl не медленее чем С++
еще видел так используеться php c C

кстате, а где про это можно почитать? если кто-то интересовался?  smile 

Это сообщение отредактировал(а) gcc - 19.8.2008, 23:41
PM WWW ICQ Skype GTalk Jabber   Вверх
GreenFactory
Дата 20.8.2008, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 20.8.2008

Репутация: нет
Всего: нет



Уверен, что вам подойдёт
IPC::Open
Правда это достаточно опасно из-за взаимных блокировок, но т.к. обе программы пишете вы, проблем не должно быть


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.