私たちのプロジェクトプラットフォームは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\"> </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\"> </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;
}
}
}
あなたの投稿を再フォーマットできますか?あなたの説明の最初の行はコードブロックにあり(行が始まる前にスペースを削除する必要があります)、残りのコードは整形されていません(再ペーストして選択し、コードアイコンを押してください)。無関係なコードも削除してください。 –