| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: разработка для Web > Включение в PERL кода на C |
| Автор: Rigel 5.8.2008, 15:46 | ||||||
Задача у меня такая: поисковый механизм роется сначала в базе а потом, как окончательный поиск, в файлах (этот, окончательный, модуль, который должен пересмотреть несколько тысяч файлов, написан на С). Написан предварительный механизм, который передает данные из Перла в EXE-файл:
В таком виде все работает: формируется строка с параметрами, которые потом, в С, вытаскиваются из argv[], переводятся в char и используются по назначению. На выходе результаты поиска через разделитель добавляются в string и сплитятся потом в perl по этому самому разделителю. Но вот в чем проблема: и входных и выходных данных много, может быть и мегабайты, то есть, командная строка не подходит. Я пытаюсь воспользоваться STDIN и STDOUT, но что-то у меня не получается: если вывод в С я примерно могу себе представить:
То чтение из входного потока хоть тут тресни не работает, хотя я С в этот потомк пишу вполне членораздельную статику:
Что-то в этом роде не получается. Помогите, пожалуйста, с вводом и выводом. |
| Автор: ginnie 5.8.2008, 16:43 |
| Уважаемый Rigel, рекомендую почитать http://perldoc.perl.org/perlipc.html#Bidirectional-Communication-with-Another-Process. |
| Автор: Rigel 5.8.2008, 16:55 |
| Это я знаю, но я не хочу запускать независимый процесс - для моих целей это явное излишество. Мне нужно запустить программу, дождаться ее завершения и прочитать то, что она вывела в стандартный поток, не больше. Если бы не обилие параметров, вполне подошла бы командная строка. |
| Автор: ginnie 5.8.2008, 18:42 | ||
Уважаемый Rigel, я не понял Вашу фразу
не могли бы Вы ее пояснить? |
| Автор: Rigel 6.8.2008, 08:22 | ||
Очень просто - мне нужно, чтобы программа на Си прошлась бы по файлам библиотеки в поисках ключевых слов. Файлы выбираются по другим признакам, отсюда громадный массив на входе. Если поисковик идет по ВСЕМ файлам, то работает такое его включение:
но командная строка не может выдержать еще и имена файлов, кроме поисковых байтов. Я сейчас продумываю кеширующую схему - когда процессу передается имя сессионного файла, содержащего потребные данные, и в этот же файл Си пишет свой результат. Но, возможно, есть более простая схема, как я писал в первом письме, когда данные другой программе передаются через стандартный поток ввода, программа на Си пишет в стандартный поток вывода а Перл этот поток читает (и все это еще и с mod_perl работает). |
| Автор: ginnie 6.8.2008, 11:14 | ||
Уважаемый Rigel, если Вас устраивает
почему не подходит Bidirectional Communication with Another Process? В первом и во втором случае запускается внешний процесс. |
| Автор: shamber 6.8.2008, 13:27 |
| Уважаемый Rigel, вот и мне так кажется. Только Bidirectional Communication даст вам больше свободы действий |
| Автор: Rigel 6.8.2008, 20:05 |
| Увы, не нужна не свобода а кроссплатформенность... |
| Автор: korob2001 7.8.2008, 16:59 |
В этом случае придётся вообще отказаться от C и переписать всё на Perl. Так же можно посмотреть в сторону модулей Inline::... . Вот http://forum.vingrad.ru/forum/topic-124314/hl/inline/index.html# я приводил пример того, как можно втсроить встроить Java код, в программу Perl, после чего Perl воспринимает методы Java класса, как свои собственные. В данном случае речь шла о модуле Inline::Java, в нашем же случае следует обратьтиться к модулю Inline::C или Inline::CPP. |
| Автор: Rigel 8.8.2008, 08:38 |
| Спасибо, это уже ближе - но не совсем то: мне нужен не код С а его скорость Inline позволяет выполнять код С, но не обеспечивает его быстродействие - из за количества данных здесь годится только С или ассемблер, причем последний нежелателен ради кроссплатформенности. Может быть, кто-нибудь знает, нельзя ли оформить программу в кодах как .pm модуль? |
| Автор: gcc 19.8.2008, 23:29 |
| получаеться, что perl на ходу компилирует C и Java !!? а можно написать демона который будет слушать запросы из perl скрипт... быстродействие будет? писали где-то, что perl работает с opengl не медленее чем С++ еще видел так используеться php c C кстате, а где про это можно почитать? если кто-то интересовался? |
| Автор: GreenFactory 20.8.2008, 17:52 |
| Уверен, что вам подойдёт http://search.cpan.org/search?query=IPC%3A%3AOpen&mode=module Правда это достаточно опасно из-за взаимных блокировок, но т.к. обе программы пишете вы, проблем не должно быть |