Прошу помощи у специалистов в области многопоточного программирования.
Задача состоит в следующем: требуется в многопоточной программе вызывать внешнюю программу, а именно, интерпретатор php-скриптов (/usr/bin/php), передать ему имя скрипта и получить результаты. Какие функции нужны для реализации этой задачи? Есть ли тут какие-нибудь особенности использования пары fork/exec? Ведь теоретически в многопоточном процессе одновременно имеется несколько точек исполнения кода, какое поведение будет у дочернего процесса? Хотелость бы увидеть примеры реализации таких задач.
Еще интересует такой вопрос. Для большей эффективности было бы неплохо оставить интерпретатор в памяти и вызывать его как фукнцию. Возможно ли такое реализовать?
pthread используешь?
1. $ info libs
там написано что после fork в дочернем процессе живёт только один поток, тот который сказал форк.>Еще интересует такой вопрос. Для большей эффективности было бы неплохо оставить интерпретатор
>в памяти и вызывать его как фукнцию. Возможно ли такое реализовать?
>А это не знаю. Но ежели часто вызываешь то беспокоится (на мой взгляд) на этот счёт не надо, *nix всё равно кэширует все обращения к файлам
>>Еще интересует такой вопрос. Для большей эффективности было бы
>>неплохо оставить интерпретатор в памяти и вызывать его как фукнцию.
>>Возможно ли такое реализовать?
>>
>
>А это не знаю. Но ежели часто вызываешь то беспокоится (на мой
>взгляд) на этот счёт не надо, *nix всё равно кэширует все
>обращения к файламМнда, зато инициализация самого интерпретатора будет происходить
столько раз, сколько запусков будет выполнено.IMHO можно посмотреть, как реализован Апачёвый mod_php4.
>pthread используешь?
>1. $ info libs
> там написано что после fork в дочернем процессе живёт только один
>поток, тот который сказал форк.
>
>>Еще интересует такой вопрос. Для большей эффективности было бы неплохо оставить интерпретатор
>>в памяти и вызывать его как фукнцию. Возможно ли такое реализовать?
>>
>
>А это не знаю. Но ежели часто вызываешь то беспокоится (на мой
>взгляд) на этот счёт не надо, *nix всё равно кэширует все
>обращения к файламГы... изврат конечно... но теоритически скорее всего можно =) (я не проверял... так... теория)
Скомпилировать PHP (при сборке всего указать -shared -fPIC)
а потомvoid *handle;
int (*php)(int, char **); // main () в php
char *error;
handle = dlopen ("php.so", RTLD_LAZY);
if (!handle) {
fputs (dlerror(), stderr);
exit(1);
}
php = dlsym(handle, "main");
if ((error = dlerror()) != NULL) {
fprintf (stderr, "%s\n", error);
exit(1);
}
(*php)(...,..); // тут сэмулировать запуск майн =)
dlclose(handle);
О! использовать как библиотеку хорошая идея! Буду копать в этом направлении.
Спастбо за ответы!