2016-05-04 31 views
0

問題の根拠。私は大学の課題を持って、電話帳のPerl/CGIベースのウェブサイトを書くように要求しています。この部分は問題なく、私はそれに満足していますが、私はcgiファイルをラップする際に問題があります。私は一度もそれをやったことがありませんでしたが、今度は同じことを繰り返すことができませんでした。Perl CGI with C Wrapper

#!/usr/bin/perl -w 

use English; 

print "Content-type: text/html"; 

print "\n"; 
print "\n"; 
print "\n"; 

print "<html>\n"; 
print "<head><title>IDS.CGI</title></head>\n"; 
print "<body>\n"; 
print "<p>\nMy User ID is $UID\n</p>"; 
print "<p>\nMy effective User ID is $EUID\n</p>"; 
print "<p>\nMy Group ID is $GID\n</p>"; 
print "<p>\nMy effective Group ID is $EGID\n</p>"; 
print "\n</body>\n"; 
print "</html>\n"; 

Wrapper.C:

#include <stdio.h> 
#include <unistd.h> 

#define REAL_PATH "ids.pl" 

int 
main() 
{ 
    execl(REAL_PATH, REAL_PATH, 0); 
    printf("You should never see this message!\n"); 
} 

これは私がスペースを含む、それをデバッグするために全力を試してみた内部サーバーエラー500を投げている

基本PerlはユーザーIDのを示すために、ファイルヘッダーなどのためにそれは端末でうまく動作しますが、Webブラウザーではうまく動作しません。サーバーのhttpdエラーログには、 "Premature end of headers"というエラーが表示されます。しかし、私は早すぎる終わりがどのようにあるか見ることができません。

ご迷惑をおかけして申し訳ございません。

+0

この種のことは、通常、CGIプログラムが死んでいるためであり、「ヘッダーの早期終了」*は何も印刷していないことを意味します。 C実行可能ファイルとPerlスクリプトの両方がシステムによって実行可能であることを確認しましたか? CGI用にCプログラムを実行している理由が分かりません。あなたのサーバーはPerlコードを直接処理しませんか? text/plain \ n \ nあなたのPerlプログラムを実行しようとするのではなく、成功した\ n ";'をテストしてください。それが成功した場合は、Cコードを削除します – Borodin

+0

ここで解決策をチェックしてくださいhttp://stackoverflow.com/questions/17583341/error-500-premature-end-of-script-headers、 CGIプログラムの許可ビットは正しくありましたか? – fluter

+1

あなたはそのラッパーが必要だと思いますか? – duskwuff

答えて

0

実際のサーバーでCラッパーをコンパイルしていないため、互換性のない別のマシンコードが表示されていました。残念なことに、サーバーは元々それをコンパイルすることを拒否し、そのマシンでコンパイルする必要があることを忘れました。 Doh私!

1

システムコールと同様、常にエラー番号execl()をチェックする必要があります。通常は戻り値を調べますが、成功すればプログラムが終了するため、必ずしも必要ではありません。

execl(REAL_PATH, REAL_PATH, 0); 
perror("exec of '"REAL_PATH"' failed"); 

これは、人間が読めるエラー文字列にerrnoを回すとstderrへの印刷を処理するためにperrorを使用しています。

また、文字列定数として#defineを使用することも避けたいと思いますが、扱いにくいです。代わりにthis answerで提案されているようにstatic const char REAL_PATH[] = "ids.pl"を使用してください。

なぜ、Cラッパーが必要なのか分かりません。解釈されたコードを実行しているあなたのWebサーバーに何らかの異常な制限がありますか?