Запустите программу C на сервере Linux

На этот вопрос я уверен, что на него дан ответ, я, честно говоря, не знаю, как задать его через поиск, хотя. Поэтому, пожалуйста, извините за недостаток знаний, так как это единственное место, где у меня действительно недостаток знаний в мире компьютерных наук.

Как я могу / возможно ли запустить программу на C на хостинговом сервере? Куда я мог пойти на http://mysite.com/myspecialcprogram.c и он будет работать? Или еще лучше: в какой степени я могу использовать язык высокого уровня, такой как C, для программирования на моем сервере?

Также следует отметить, что у меня есть Dedicated Linux box, работающий под Apache. Так что у меня полный доступ.

2 ответа

Решение

Один из способов - запустить его как CGI, как уже упоминалось @paddy. Тем не менее, программа будет работать медленно, долгое время запуска.

Другой способ - запустить его с помощью FastCGI. Это будет намного быстрее, вам просто нужно внести несколько изменений в ваш код, чтобы он работал, например, как CGI:

#include <stdio.h>
#include <time.h>

int main(int argc, char **argv)
{
    time_t timer;
    char time_str[25];
    struct tm* tm_info;

    time(&timer);
    tm_info = localtime(&timer);
    strftime(time_str, sizeof(time_str), "%Y/%m/%d %H:%M:%S", tm_info);

    /* Without this line, you will get 500 error */
    puts("Content-type: text/html\n");

    puts("<!DOCTYPE html>");
    puts("<head>");
    puts("  <meta charset=\"utf-8\">");
    puts("</head>");
    puts("<body>");
    puts("   <h3>Hello world!</h3>");
    printf("   <p>%s</p>\n", time_str);
    puts("</body>");
    puts("</html>");

    return 0;
}

Скомпилируйте это:

$ # 'cgi-bin' path may be different than yours
$ sudo gcc example.c -o /usr/lib/cgi-bin/example
$ wget -q -O - http://localhost/cgi-bin/example
<!DOCTYPE html>
<head>
  <meta charset="utf-8">
</head>
<body>
   <h3>Hello world!</h3>
   <p>2013/01/30 08:07:29</p>
</body>
</html>
$ 

Использование FastCGI:

#include <fcgi_stdio.h>
#include <stdio.h>
#include <time.h>

int main(int argc, char **argv)
{
    time_t timer;
    char time_str[25];
    struct tm* tm_info;

    while(FCGI_Accept() >= 0)   {
        time(&timer);
        tm_info = localtime(&timer);
        strftime(time_str, sizeof(time_str), "%Y/%m/%d %H:%M:%S", tm_info);

        /* Without this line, you will get 500 error */
        puts("Content-type: text/html\n");

        puts("<!DOCTYPE html>");
        puts("<head>");
        puts("  <meta charset=\"utf-8\">");
        puts("</head>");
        puts("<body>");
        puts("   <h3>Hello world!</h3>");
        printf("   <p>%s</p>\n", time_str);
        puts("</body>");
        puts("</html>");
    }

    return 0;
}

Скомпилируйте это:

$ # Install the development fastcgi package, I'm running Debian
$ sudo apt-get install libfcgi-dev 
 ...
$ 
$ # Install Apache mod_fcgid (not mod_fastcgi)
$ sudo apt-get install libapache2-mod-fcgid
 ...
$ 
$ # Compile the fastcgi version with .fcgi extension
$ sudo gcc example.c -lfcgi -o /usr/lib/cgi-bin/example.fcgi
$ # Restart Apache
$ sudo /etc/init.d/apache2 restart
Restarting web server: apache2 ... waiting .
$
$ # You will notice how fast it is
$ wget -q -O - http://localhost/cgi-bin/example.fcgi
<!DOCTYPE html>
<head>
  <meta charset="utf-8">
</head>
<body>
   <h3>Hello world!</h3>
   <p>2013/01/30 08:15:23</p>
</body>
</html>
$
$ # Our fastcgi script process
$ ps aux | grep \.fcgi
www-data  2552  0.0  0.1   1900   668 ?        S    08:15   0:00 /usr/lib/cgi-bin/example.fcgi
$ 

В обеих программах есть:

puts("Content-type: text/html\n");

Это будет печатать:

Content-type: text/html[new line]
[new line]

Без этого Apache скинет 500 внутреннюю ошибку сервера.

Вам нужно скомпилировать вашу программу на Си. Linux распространяется с компилятором GNU C (gcc). В крайнем случае, вы можете скомпилировать вашу программу из командной строки:

gcc -o myprog myprog.c

Это означает, что вам нужен доступ к оболочке. В комментариях люди предложили запускать команды оболочки через PHP с system функция. Возможно, ваша установка PHP отключила эту команду по соображениям безопасности.

Вы должны спросить своего хоста, могут ли они предоставить доступ к оболочке через SSH.

Если ваш хост может это сделать, вы можете запустить терминальную сессию (используя PuTTY, если у вас локальная Windows, или командную строку ssh на большинстве других систем).

Таким образом, вы загружаете свой файл (через FTP, SCP или любой другой), а затем компилируете его. Пока все хорошо.

Теперь вам нужен ваш веб-сервер, чтобы он мог работать. Как правило, вы не можете выполнять двоичные файлы из корня документа вашего веб-сервера. Вам нужно положить бинарный файл в настроенный cgi-bin каталог. Обычно он находится на один уровень выше корневого каталога вашего документа.

В моей системе мои документы находятся в:

/srv/httpd/htdocs

И мой cgi-bin находится в:

/srv/httpd/cgi-bin

Обычно каталог cgi-bin будет псевдонимом, так что он будет находиться в корневом каталоге вашего документа. Таким образом, вы можете запустить свой скрипт через http://mysite.com/cgi-bin/myprog, Вам необходимо включить CGI на вашем веб-сервере. В Linux ваш веб-сервер, вероятно, будет Apache.

Кроме того, серверу необходимо разрешение для запуска файла. Это означает выполнение прав доступа для соответствующего пользователя. В крайнем случае:

chmod 0770 /srv/httpd/cgi-bin/myprog
chown apache:apache /srv/httpd/cgi-bin/myprog

Пример для моей конкретной системы.

Все это предполагает, что вы хотите запустить вашу программу и получить вывод через HTTP. Если это не так, достаточно иметь доступ к оболочке. Если вы не поняли ни одного из этих ответов, то я рекомендую вам серьезно ознакомиться с Linux, сетями и HTTP.

Вот руководство по Apache для работы CGI: http://httpd.apache.org/docs/2.2/howto/cgi.html

Другие вопросы по тегам