Как я могу разместить программу на C в Apache? - PullRequest
4 голосов
/ 03 ноября 2010

У меня есть программа на C, которая вызывается с помощью системного вызова в Perl-скрипте. Мне было интересно: есть ли способ на самом деле разместить саму программу C внутри Apache, чтобы ею можно было управлять с помощью тех же правил, которые Apache установил, таких как время ожидания и память?

Ответы [ 4 ]

4 голосов
/ 03 ноября 2010

Что вы пробовали, а что не работает?

Если оно начинается с:

printf("Content-type: text/html\r\n\r\n"); /* Or whatever the content type is */

... и затем выдает какой-то вывод, и он находится в вашем cgi-bin, тогда он должен работать.

2 голосов
/ 03 ноября 2010

Если вы можете превратить вашу программу в библиотеку, вы можете использовать Inline :: C , чтобы подключить ее прямо к вашему Perl-коду.Это позволит вам заменить ваш system() вызов обычным вызовом функции perl.Возможно, вам придется решить некоторые проблемы с сортировкой данных, но с Inline :: C работать намного проще, чем с XS.

2 голосов
/ 03 ноября 2010

Я бы порекомендовал использовать протокол FastCGI между вашей C-программой и Apache.Пакет разработки fastcgi имеет простой в использовании C API.

Вот пример программы FastCGI C из документации:

#include "fcgi_stdio.h" /* fcgi library; put it first*/

#include <stdlib.h>

int count;

void initialize(void)
{
  count=0;
}

void main(void)
{
/* Initialization. */  
  initialize();

/* Response loop. */
  while (FCGI_Accept() >= 0)   {
    printf("Content-type: text/html\r\n"
           "\r\n"
           "<title>FastCGI Hello! (C, fcgi_stdio library)</title>"
           "<h1>FastCGI Hello! (C, fcgi_stdio library)</h1>"
           "Request number %d running on host <i>%s</i>\n",
            ++count, getenv("SERVER_HOSTNAME"));
  }
}
2 голосов
/ 03 ноября 2010

Я думаю, что вы ищете, как написать модуль Apache . Они ограничены настройками Apache, в то время как CGI может делать что угодно. Тем не менее, я думаю, что Apache фактически может ограничить использование памяти CGI, например.

(Не обязательно плохо, но вы хотели ограничить вещи внутри конфигурации Apache?)

...