![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Rigel |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 24.7.2007 Где: Москва Репутация: нет Всего: нет |
Задача у меня такая: поисковый механизм роется сначала в базе а потом, как окончательный поиск, в файлах (этот, окончательный, модуль, который должен пересмотреть несколько тысяч файлов, написан на С). Написан предварительный механизм, который передает данные из Перла в EXE-файл:
В таком виде все работает: формируется строка с параметрами, которые потом, в С, вытаскиваются из argv[], переводятся в char и используются по назначению. На выходе результаты поиска через разделитель добавляются в string и сплитятся потом в perl по этому самому разделителю. Но вот в чем проблема: и входных и выходных данных много, может быть и мегабайты, то есть, командная строка не подходит. Я пытаюсь воспользоваться STDIN и STDOUT, но что-то у меня не получается: если вывод в С я примерно могу себе представить:
То чтение из входного потока хоть тут тресни не работает, хотя я С в этот потомк пишу вполне членораздельную статику:
Что-то в этом роде не получается. Помогите, пожалуйста, с вводом и выводом. --------------------
С уважением. Rigel. http://www.smoliy.ru |
||||||
|
|||||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 4 Всего: 49 |
Уважаемый Rigel, рекомендую почитать Bidirectional Communication with Another Process.
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Rigel |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 24.7.2007 Где: Москва Репутация: нет Всего: нет |
Это я знаю, но я не хочу запускать независимый процесс - для моих целей это явное излишество. Мне нужно запустить программу, дождаться ее завершения и прочитать то, что она вывела в стандартный поток, не больше. Если бы не обилие параметров, вполне подошла бы командная строка.
--------------------
С уважением. Rigel. http://www.smoliy.ru |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 4 Всего: 49 |
Уважаемый Rigel, я не понял Вашу фразу
не могли бы Вы ее пояснить? -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Rigel |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 24.7.2007 Где: Москва Репутация: нет Всего: нет |
Очень просто - мне нужно, чтобы программа на Си прошлась бы по файлам библиотеки в поисках ключевых слов. Файлы выбираются по другим признакам, отсюда громадный массив на входе. Если поисковик идет по ВСЕМ файлам, то работает такое его включение:
но командная строка не может выдержать еще и имена файлов, кроме поисковых байтов. Я сейчас продумываю кеширующую схему - когда процессу передается имя сессионного файла, содержащего потребные данные, и в этот же файл Си пишет свой результат. Но, возможно, есть более простая схема, как я писал в первом письме, когда данные другой программе передаются через стандартный поток ввода, программа на Си пишет в стандартный поток вывода а Перл этот поток читает (и все это еще и с mod_perl работает). --------------------
С уважением. Rigel. http://www.smoliy.ru |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 4 Всего: 49 |
Уважаемый Rigel, если Вас устраивает
почему не подходит Bidirectional Communication with Another Process? В первом и во втором случае запускается внешний процесс. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: нет Всего: 18 |
Уважаемый Rigel,
вот и мне так кажется. Только Bidirectional Communication даст вам больше свободы действий |
|||
|
||||
| Rigel |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 24.7.2007 Где: Москва Репутация: нет Всего: нет |
Увы, не нужна не свобода а кроссплатформенность...
--------------------
С уважением. Rigel. http://www.smoliy.ru |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
В этом случае придётся вообще отказаться от C и переписать всё на Perl. Так же можно посмотреть в сторону модулей Inline::... . Вот здесь я приводил пример того, как можно втсроить встроить Java код, в программу Perl, после чего Perl воспринимает методы Java класса, как свои собственные. В данном случае речь шла о модуле Inline::Java, в нашем же случае следует обратьтиться к модулю Inline::C или Inline::CPP. Это сообщение отредактировал(а) korob2001 - 7.8.2008, 17:08 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Rigel |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 24.7.2007 Где: Москва Репутация: нет Всего: нет |
Спасибо, это уже ближе - но не совсем то: мне нужен не код С а его скорость
Inline позволяет выполнять код С, но не обеспечивает его быстродействие - из за количества данных здесь годится только С или ассемблер, причем последний нежелателен ради кроссплатформенности. Может быть, кто-нибудь знает, нельзя ли оформить программу в кодах как .pm модуль? --------------------
С уважением. Rigel. http://www.smoliy.ru |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
Помоему C такой же кроссплатформенный, как и Asm. В любом случае нужно будет компилировать заново, при каждом переносе. Потому я и сказал, что для кроссплатформенности придётся писать на Perl или Java. С другой стороны, когда используешь Inline, то все эти компиляции при переносе происходят совершенно прозрачно, лишь бы там был компилятор. Если честно, я не понял почему вы считаете, что код скомпилированный Inline будет работать медленнее, чем код, который будет скомпилен вручную? Честно говоря, мне никогда не приходилось использовать Inline::C, но зато приходилось использовать Inline::Java. При первом запуске Perl компилирует Inline код и сохраняет его в специальном каталоге, в итоге я получил уже скомпилированные классы Java например из кода, ссылку на который я вам давал выше, у меня получился полноценный Java класс Person.class . При следующем запуске, код выполняется намного быстрее, потому как нет необходимости компилировать Inline код повторно, разумеется если не изменялся код программы на Perl, который использует Inline. Так что думаю код скомпиленный Inline, будет работать с той же скоростью, что и код скомпиленный вручную, к тому же Inline компилирует этот модуль тем компилятором, который вы сами ему укажете. Пробовал я написать программу на Java, которая использует сгенерированный Inline модулем, класс. Работает он так же, как если бы я писал его на чистом Java. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 2 Всего: 17 |
получаеться, что perl на ходу компилирует C и Java !!?
а можно написать демона который будет слушать запросы из perl скрипт... быстродействие будет? писали где-то, что perl работает с opengl не медленее чем С++ еще видел так используеться php c C кстате, а где про это можно почитать? если кто-то интересовался? Это сообщение отредактировал(а) gcc - 19.8.2008, 23:41 |
|||
|
||||
| GreenFactory |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 20.8.2008 Репутация: нет Всего: нет |
Уверен, что вам подойдёт
IPC::Open Правда это достаточно опасно из-за взаимных блокировок, но т.к. обе программы пишете вы, проблем не должно быть |
|||
|
||||
![]()
|
| Правила форума "Perl: CGI программирование" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: разработка для Web | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |