gpt4 book ai didi

linux - 如何向网页发送信号

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:13:04 25 4
gpt4 key购买 nike

我们的项目平台是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;
}

}
}

最佳答案

我想您会发现这不是更新网页的正确方法。如果 CGI 从未完成运行,浏览器将等待直到超时。

虽然我相信您可以刷新响应并且某些浏览器可能会开始呈现页面,但要使页面正确显示,CGI 需要成功完成执行。

在死循环中,浏览器永远不会呈现完整的页面,也不知道预期的内容长度,如果由于某种原因在循环期间发生崩溃,则会导致内部服务器错误。

用于输出网页的 CGI 或服务器端脚本并非真正设计为无限期运行。

我会调查在您的页面中使用 AJAX 以定期查询服务器更新。

我相信有一些服务器“推送”技术(我想其中一个可能从内存中被称为 cometd )但通常人们使用 AJAX 来完成这类事情。

关于linux - 如何向网页发送信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/649702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com