2009-03-16 8 views
1

Unsere Projektplattform ist Linux. In unserem Projekt benötigen wir einen Webserver und wenige Webseiten.So senden Sie ein Signal an die Webseite

Wir haben die Homepage Codierung durch .cgi Dateien zu tun, ich dynamisch einige Details auf der Webseite hinzufügen müssen, wenn ich von anderen Verfahren, dass die Informationen bekommt. Wir haben die Nachrichtenwarteschlange verwendet.

Das andere Verfahren wird die Nachrichtenwarteschlange und Signale aktualisiert diese process.this Prozesssignal zu handhaben ist und zu aktualisieren, dass die Informationen in der Webseite.

Also ich muss ständig auf das Signal warten. Dafür verwendete ich while-Schleife, also wenn ich normal ausführe, kommt die erforderliche Ausgabe .. aber wenn ich versuchte, die .cgi Datei durch Web-Browser zu laden, ist es einfrieren.

hier ist mein Code ...

#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

Können Sie Ihren Beitrag neu formatieren? Die erste Zeile Ihrer Erklärung befindet sich in einem Codeblock (Sie müssen die Leerzeichen entfernen, bevor die Zeile beginnt) und der Rest des Codes ist nicht gut formatiert (versuchen Sie es erneut, indem Sie es auswählen und das Codesymbol drücken). Bitte entfernen Sie auch nicht verwandten Code. –

Antwort

1

Ich glaube, Sie werden feststellen, das nicht der richtige Ansatz ist eine Web-Seite zu aktualisieren. Wenn das CGI nie ausgeführt wird, wartet der Browser nur bis zum Timeout.

Obwohl ich glaube, dass Sie die Antwort spülen kann und einige Browser starten kann die Seite dargestellt wird, für die Seite richtig die CGI zum Anzeigen erfolgreich beenden muss ausgeführt werden.

Mit der Endlosschleife hat der Browser nie eine vollständige Seite zu rendern und kennt nicht die erwartete Inhaltslänge, und wenn aus irgendeinem Grund während der Schleife ein Absturz auftritt, wird dies zu einem internen Serverfehler führen.

CGI oder serverseitige Skripte für die Ausgabe Web-Seiten sind nicht wirklich auf unbestimmte Zeit laufen konzipiert.

würde ich mit AJAX in Ihrer Seite untersucht den Server nach Updates regelmäßig abzufragen.

Ich glaube, es gibt einige Server „Push“ -Technologien (ich glaube, ein Komet genannt wurden aus dem Gedächtnis könnte), aber in der Regel Menschen AJAX nutzen diese Art der Sache zu erreichen.

Verwandte Themen