2009-03-16 21 views
1

私たちのプロジェクトプラットフォームはLinuxです。私たちのプロジェクトでは、WebサーバーといくつかのWebページが必要です。ウェブページへの信号の送信方法

ウェブページを.cgiファイルでコーディングする必要があるため、他のプロセスからその情報を取得するたびに、ウェブページにいくつかの詳細を動的に追加する必要があります。メッセージキューを使用しました。

他のプロセスはメッセージキューを更新し、このプロセスに信号を送ります。このプロセスは、シグナルを処理し、その情報をWebページで更新する必要があります。

私は信号を待つ必要があります。それは私がループ中に使用していたので、もし私が正常に実行すると、必要な出力が来ています。しかし、Webブラウザから.cgiファイルを読み込もうとしたとき、フリーズしています。ここ

は私のコードです...

#include <libxml/xmlmemory.h> 
#include <libxml/parser.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <errno.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/msg.h> 
#include<signal.h> 

struct my_msg_st { 
long int my_msg_type; 
char some_text[BUFSIZ]; 
}; 


sig_atomic_t flag = 0; 

void sigint_handler(int sig) 
{ 
    printf("signal handled\n"); 
    flag = 1; 
} 

int main() 
{ 

    int msgid; 
    struct my_msg_st some_data; 
    long int msg_to_receive = 0; 
    struct sigaction sa; 
    sigset_t waitset; 
    int sig; 
    int result; 

    sigemptyset(&waitset); 
    sigaddset(&waitset, SIGUSR1); 


    memset (&sa, 0, sizeof (sa)); 
    sa.sa_flags = 0; 
    sa.sa_handler = &sigint_handler; 
    sigaction (SIGUSR1, &sa, NULL); 

    printf 
      ("Content-type: text/html\nPRAGMA:NO-CACHE\nCACHE-CONTROL:NO-CACHE\n\n"); 
     printf("<HTML>\n"); 

     printf("<head><META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\"> <META HTTP-EQUIV=\"Expires\" CONTENT=\"-1\"><title>COOPER BUSSMANN MONITORING DATA</title>\n"); 
     printf("<style type=\"text/css\">\n" 
     "body {background-color: #00ffff}\n" 

     "</style>\n" 


     "</head>\n"); 


     printf("<body>\n"); 

     printf("<table ID=\"_Table\" ALIGN=\"CENTER\" BORDER=\"0\" COLS=\"6\" WIDTH=\"650\">\n"); 
     printf("<TR><TD COLSPAN=\"6\">&nbsp;</TD></TR>\n"); 
     printf("<TR><TD COLSPAN=\"6\" ALIGN=\"CENTER\"><h1>MONITORING DATA</h1></TD></TR>\n"); 
     printf("<TR><TD COLSPAN=\"6\" ALIGN=\"CENTER\"><HR></TD></TR>\n"); 
     printf("<TR><TD COLSPAN=\"6\">&nbsp;</TD></TR>\n"); 
     printf("</table>\n"); 

     printf("<table ID=\"_Table\" ALIGN=\"CENTER\" BORDER=\"1\" COLS=\"6\" WIDTH=\"650\">\n"); 
     printf("<TR>\n"); 
     printf("<TH>ESN</TH><TH>IsStatic</TH><TH>Alarm Type</TH><TH>TimeStamp</TH><TH>PartNumber</TH><TH>Location</TH><TH>PPE</TH></TR>\n"); 


    while(1) 
{ 

    printf("entered waiting for signal\n"); 
    sleep(10); 

     if(flag == 1) 
    { 

     printf("From siguser just got a sigint signal\n"); 
     msgid = msgget((key_t)1234, 0666 | IPC_CREAT); 

     if(msgid==-1) 
     printf("error in opening msg queue\n"); 

     if (msgrcv(msgid, (void *)&some_data, BUFSIZ,msg_to_receive, 0) == -1) 
     { 

     fprintf(stderr, ".msgrcv failed with error: %d\n.", errno); 
     exit(EXIT_FAILURE); 

     } 

     printf(".You wrote: %s.", some_data.some_text); 

     printf("<TR><TD align = \"center\">%s\n</TD></TR>",some_data.some_text); 

     if (msgctl(msgid, IPC_RMID, 0) == -1) 
     { 

     fprintf(stderr, ".msgctl(IPC_RMID) failed\n."); 
     exit(EXIT_FAILURE); 

     } 

     flag = 0; 
    } 

} 
} 
+0

あなたの投稿を再フォーマットできますか?あなたの説明の最初の行はコードブロックにあり(行が始まる前にスペースを削除する必要があります)、残りのコードは整形されていません(再ペーストして選択し、コードアイコンを押してください)。無関係なコードも削除してください。 –

答えて

1

私はあなたがこのウェブページを更新するために適切なアプローチではないでしょうと思います。 CGIが実行を終了しない場合、ブラウザはタイムアウトするまで待機します。

私はあなたが応答をフラッシュすることができると信じていますが、一部のブラウザがページのレンダリングを開始する可能性があります。ページが正しく表示されるためには、CGIは正常に実行を完了する必要があります。

エンドレスループでは、ブラウザは完全なページをレンダリングすることはなく、予想されるコンテンツの長さも知りません。何らかの理由でループ中にクラッシュが発生すると、内部サーバーエラーが発生します。

ウェブページを出力するためのCGIまたはサーバー側のスクリプトは、実際に無期限に実行するようには設計されていません。

あなたのページでAJAXを使用して定期的にサーバーに更新プログラムを問い合わせることを検討します。

サーバの「プッシュ」技術があると思いますが(メモリから彗星と呼ばれるかもしれないと思いますが)、通常、このタイプのものを達成するためにAJAXを使用しています。

関連する問題