10

この質問には答えられたと思いますが、正直なところ、検索で質問する方法はわかりません。ですから、コンピュータサイエンスの世界で私が本当に知識を欠いている唯一の場所のひとつであるため、私の知識の欠如を許してください。

どうすればよいですか/ホストサーバーでCプログラムを実行することは可能ですか。http://mysite.com/myspecialcprogram.cにアクセスすると、実行されますか?さらに良いことに、サーバーのプログラミングにCのような高級言語をどの程度使用できますか?

また、apacheを実行している専用のLinuxボックスがあることにも注意してください。だから私はフルアクセスできます。

4

2 に答える 2

9

@paddyがすでに述べたように、1つの方法はCGIとして実行することです。ただし、プログラムの実行時間は遅く、起動時間が長くなります。

もう1つの方法は、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
$ 

pothプログラムには、次のものがあります。

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

これにより、次のように出力されます。

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

これがないと、Apacheは500サーバーの内部エラーをスローします。

于 2013-01-30T05:22:34.350 に答える
7

Cプログラムをコンパイルする必要があります。LinuxはGNUCコンパイラ(gcc)とともに配布されます。ピンチでは、コマンドラインを使用してプログラムをコンパイルできます。

gcc -o myprog myprog.c

これは、シェルアクセスが必要であることを意味します。コメントの中で、人々はsystem関数を使ってPHP経由でシェルコマンドを実行することを提案しています。セキュリティ上の理由から、PHPインストールでこのコマンドが無効になっている可能性があります。

ホストがSSH経由でシェルアクセスを提供できるかどうかを実際にホストに確認する必要があります。

ホストがそれを実行できる場合は、ターミナルセッションを実行できます(ローカルにWindowsがある場合はPuTTYを使用し、他のほとんどのシステムではコマンドラインsshを使用します)。

したがって、ファイルを(FTP、SCPなどを介して)アップロードしてから、コンパイルします。これまでのところすべて良い。

次に、Webサーバーを実行できるようにする必要があります。通常、Webサーバーのドキュメントルートからバイナリファイルを実行することはできません。cgi-binバイナリを設定済みのディレクトリに配置する必要があります。これは通常、ドキュメントルートから1レベル上のディレクトリにあります。

私のシステムでは、私のドキュメントは次の場所にあります。

/srv/httpd/htdocs

そして、私のcgi-binは次の場所にあります。

/srv/httpd/cgi-bin

通常、cgi-binディレクトリはエイリアス化され、ドキュメントルートにあるように見えます。したがって、を介してスクリプトを実行できますhttp://mysite.com/cgi-bin/myprog。WebサーバーでCGIを有効にする必要があります。Linuxでは、WebサーバーはおそらくApacheになります。

また、サーバーにはファイルを実行するためのアクセス許可が必要です。これは、適切なユーザーの実行権限を意味します。ピンチで:

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

例は私の特定のシステム用です。

これはすべて、プログラムを実行してHTTP経由で出力を取得することを前提としています。そうでない場合は、シェルアクセスがあれば十分です。この答えのいずれかを理解していない場合は、Linux、ネットワーキング、およびHTTPについて真剣に読むことをお勧めします。

CGIを機能させるためのApacheガイドは次のとおりです。http://httpd.apache.org/docs/2.2/howto/cgi.html

于 2013-01-30T03:56:37.543 に答える