请教你一下?为什么CGI程序无法输出页面呢?代码如下

半点竹节 发布于 2012/04/18 21:26
阅读 522
收藏 0
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<stdio.h>
int main(void){

printf ("Content type: text/plain\n\n");
char FIFO[]=".myfifo";
char msg[8]="hello!\n";
char buf[8]={0};
//char stdo[35];
unlink(FIFO);
mkfifo(FIFO,0666);
if(fork()>0){
while(1)
{
int fd=open(FIFO,O_WRONLY);
write(fd,msg,sizeof(msg));
close(fd);
sleep(1);
}
}else{//child
while(1)
{

int fd=open(FIFO,O_RDONLY);
read(fd,buf,sizeof(buf));
// write(STDOUT_FILENO,buf,sizeof(buf));
//if(strlen(buf)>0)
printf("<html>");
printf("<body>");
printf("%s",buf);
printf("</body>");
printf("</html>");
close(fd);
sleep(1);
}

}
return 0;

}

在终端可以正确输出。。

加载中
0
deleted
deleted

应该是有缓冲, 试下子进程每输出一轮在sleep前调用下fflush(stdout) ,另外,html和body最好写在while外面

0
半点竹节
半点竹节
这样写应该不会出错吧?能够正确使用管道吧??
deleted
deleted
根据信号或者自己做逻辑判断退出这些细节不说, 这段本身应该没问题. 但是需要关注三个地方的缓冲, cgi本身,需要调用fflush(stdout); webserver,这块得看具体文档了; 还有浏览器,小于一定大小(比如4kb),不显示,这个得自己填充一下吧.你的需求是典型的longpoll, 不是强制要求c写的cgi的话,其实像nodejs之类,有很好很高效的解决方案
返回顶部
顶部