как отправить сигнал на веб-страницу - PullRequest
1 голос
/ 16 марта 2009

Наша проектная платформа - Linux. В нашем проекте нам нужен веб-сервер и несколько веб-страниц.

Мы должны выполнить кодирование веб-страницы с помощью файлов .cgi, мне нужно динамически добавлять некоторые детали на веб-страницу всякий раз, когда я получаю эту информацию из другого процесса. Мы использовали очередь сообщений.

Другой процесс обновит очередь сообщений и отправит сигнал этому процессу. Этот процесс должен обработать сигнал и обновить эту информацию на веб-странице.

Так что я должен постоянно ждать сигнала. Для этого я использовал цикл while, поэтому, если я выполняю его нормально, поступает требуемый вывод ... но когда я пытался загрузить файл .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;
   }

}
}

1 Ответ

1 голос
/ 16 марта 2009

Я думаю, вы обнаружите, что это неправильный подход к обновлению веб-страницы. Если CGI никогда не завершал работу, браузер просто подождет, пока не истечет время ожидания.

Хотя я полагаю, что вы можете очистить ответ, и некоторые браузеры могут начать рендеринг страницы, для правильного отображения страницы CGI должен успешно завершить выполнение.

С бесконечным циклом браузер никогда не имеет полной страницы для отображения и не знает ожидаемой длины содержимого, и если по какой-либо причине произойдет сбой во время цикла, это приведет к внутренней ошибке сервера.

CGI или серверные сценарии для вывода веб-страниц на самом деле не предназначены для бесконечной работы.

Я бы расследовал использование AJAX на вашей странице, чтобы регулярно запрашивать обновления на сервере.

Я полагаю, что существуют некоторые серверные технологии «проталкивания» (я думаю, что кто-то, возможно, назывался Comet из памяти), но обычно люди используют AJAX для выполнения подобных задач.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...