2016-03-23 11 views
1

私はいくつかの古いサーバ(ubuntu 9 - > ubuntu 14)をアップグレードすることを任されています。私はCGIスクリプトにこれをコンパイルして、私たちの古いサーバ上でウェブからそれを実行した場合、私が見る、今システム( 'cat')の出力をApache Webページに表示する方法は?

#include "stdio.h" 
#include <strings.h> 
#include "stdlib.h" 

main(argc, argv) 
    int argc; 
    int argv; 
{ 
    printf("content-type: text/plain\n\n"); 
    printf("Normal Output...\n"); 
    system("cat /path/to/file"); 
    printf("Done...\n"); 
} 

:私たちの古いサーバーでは、我々は、出力ファイルの内容には、このフォーマットを使用する一部のCスクリプトを持っています/ path/to /ファイルの内容。しかし、より新しいApacheサーバーでは、cat出力を表示しません。私はそれがコマンドラインで実行されていることを示していることを知っています。私はcat出力をリダイレクトするために "> log"を使うことができるので、コマンドは実際にWebから実行されます。誰も私がこれらのシステムのcat出力をApacheで動作させるために何ができるかを知っていますか?

EDIT: 私は非常に似たような方法でそれを行うことができ、私が探しているものを得ることができるので、それはC固有の問題であり、Apacheではないと思います。

#!/usr/bin/perl 
use strict; 
use warnings; 

print "Content-type: text/plain\n\n"; 
print "Normal Output...\n"; 
system("cat /path/to/file"); 
print "Done...\n"; 

EDIT 2:私は、ファイルを読み取る別の方法を利用せず、予想通り、元のコードが動作するように取得する方法を考え出し

ここで私は期待して何んperlスクリプトです。私はテキストファイルの内容を読む方法を探していませんでしたが、このスクリプトを作成するためには何をしなければならないか、そしてそれを好きな人は動作します。 fflushを追加すると、上記のコードが期待どおりに動作することがわかりました。申し訳ありませんが、私の質問があいまいだった場合、別の時間に他の人が処理する問題のための迅速な解決策を探していました。 system() man pageから

#include "stdio.h" 
#include <strings.h> 
#include "stdlib.h" 

main(argc, argv) 
    int argc; 
    int argv; 
{ 
    printf("content-type: text/plain\n\n"); 
    fflush(stdout); 
    printf("Normal Output...\n"); 
    system("cat /path/to/file"); 
    printf("Done...\n"); 
} 
+0

なぜ、 'system'の代わりに' fopen'などを使用しないのですか? –

+0

@EdHeal、私はこれらのスクリプトを書いているのではなく、よりよい方法を見つける意味があります。私はすでに他のサーバーでこの構文を使用しているかなりの数のスクリプトを用意しており、数十のスクリプトを探して書き直したくないと言っています。 – archlyfe

+0

Apache設定ファイルには、実行可能なファイルタイプのリスト(.php .cgiなど)があります。設定ファイルを編集するか、cgiスクリプトのファイル拡張子を変更してください。 –

答えて

0

:「システム()は、/ binに/ shの-cコマンドを呼び出すことにより、コマンドで指定されたコマンドを実行し、コマンドの後に戻りが完了しました。」

それはすべてです。 popenのようなものが必要です。これは別のプロセスを開始し、IOストリームを返してプロセスから読み書きできるようにします。

BUT!あなたが望むのは、テキストファイルの内容を表示するCプログラムであれば、を使ってcatを実行すると少し余計です。あなたのファイルは改行で区切ってテキストが含まれています知っていると、一度に全体のラインを読みたい場合にも、代わりにfgetcfgets()man page here)を使用することができ

#include <stdio.h> 
#include <stdlib.h> 

int main (void) 
{ 
    FILE *fp; 
    char c; 

    /* Open the file */ 
    if ((fp = fopen("/path/to/file", "r")) == NULL) { 
     printf("failed to open file\n"); 
     return 1; 
    } 

    printf("content-type: text/plain\n\n"); 
    printf("Normal Output...\n"); 

    /* Print each character in the file */ 
    while ((c = fgetc(fp)) != EOF) { 
     printf("%c", c); 
    } 
    printf("\n"); 

    fclose(fp); /* close the file */ 
    printf("Done...\n"); 
    return 0; 
} 

:ちょうどCを使用しています。

+0

ありがとうございます。私はこれがコンテンツを入手して印刷するための適切な方法であることを認識しています。過去に私のサンプルスクリプトを書いた人は誰でも、それは非常に奇妙な方法でした。私はCプログラマではなく、ちょっと変わった量のスクリプトを書き直すことなく、それを解決しようとしている管理者だけです。実際に私のプログラムに最小限の作業で欲しいものをやり遂げる方法を見つけました。strcopyの前に "fflush(stdout)"を追加するだけで、魔法のように動作します。 – archlyfe

+0

strcpy?上記のコードにstrcpyはありません –

0

システムの代わりにpopenを使用できます。ここで

はpopenのコードで、

#include "stdio.h" 
#include <strings.h> 
#include "stdlib.h" 

int main() 
{ 
     printf("content-type: text/plain\n\n"); 
     printf("Normal Output...\n"); 
     FILE *fp; 
     char buffer[1024]; 
     if((fp = popen("cat /path/to/file", "r")) != NULL) 
     { 
       while(fgets(buffer, 1024, fp) != NULL) 
       { 
         printf("%s", buffer); 
       } 
       printf("\n"); 
       printf("Done...\n"); 
     } 
} 

のpopen関数は、そのコマンドを実行し、一時ファイルに出力を格納します。そして、その一時ファイルにファイルポインタを返します。

UPDATE: -

第2の方法は、これを行うためにそこにもあるがあります。

システム出力をファイルに格納し、そのファイルを読み取ります。

次は第2の方法のコードです。

#include "stdio.h" 
#include <strings.h> 
#include "stdlib.h" 

int main() 
{ 
     printf("content-type: text/plain\n\n"); 
     printf("Normal Output...\n"); 
     FILE *fp; 
     char buffer[1024]; 
     system("cat file.txt > output.txt"); 
     if((fp = fopen("output.txt", "r")) != NULL) 
     { 
       while(fgets(buffer, 1024, fp) != NULL) 
       { 
         printf("%s", buffer); 
       } 
       printf("\n"); 
       printf("Done...\n"); 
     } 
} 
関連する問題