嵌入式Linux上通过boa服务器实现cgi/html的web上网(3)

第三步boa的执行

这一步的工作也在电脑主机上完成。但是操作到的目录跟嵌入式板子上的目录有关。

1.将根文系统ramdisk在电脑主机上mount –o loop ramdisk 目标 目录进行展开

进入展开后ramdisk的根文件夹,然后执行下面:

# mkdir /var/log

# mkdir /var/log/boa(创建日志文件目录)

# mkdir /var/www (创建HTML文档的主目录)

# mkdir /etc/boa

将第二步中修改过的boa.conf文件从电脑主机上别的目录拷贝到ramdsik的相关目录下

# cp /电脑主机目录/ boa-0.94.13/boa.conf /etc/boa/

将mime.types文件复制到嵌入式板子ramdsik的/etc目录下,通常mime.types可以从linux电脑主机的 /etc目录下直接复制即可。

# cp / etc/mime.type /etc/

上面第一步骤中编译生成的boa可执行文件,将其复制到展开后ramdsik的bin目录里面。

# cp /电脑主机目录/ boa-0.94.13/src/boa /bin/

2.测试操作

可以将主机 /usr/share/doc/HTML/目录下的index.html(这个是静态的html网页显示文件,是RedHat9的欢迎主页,当在局域网的 PC的IE上输入嵌入式板子的IP地址时会显示这个默认的静态网页)文件和img目录复制到嵌入式ramdsik的/var/www目录下

# cp /usr/share/doc/HTML/index.html /var/www/

# cp /usr/share/doc/HTML/img /var/www/

# cp /usr/share/doc/HTML/index-ZH_CH.html /var/www/

3.将ramdisk文件重新打包压缩下载到嵌入式板子上。

Ramdisk重新大包压缩下载到板子上后,在板子的超级终端的根目录下输入./boa,看boa是否可以执行。

可能提示错误如:libso.0.6 GLIB2.2版本问题,这个一般是boa执行时需要动态共享库,解决的办法是,在编译boa的时候用静态的方式进行编译,即

进入:/电脑主机目录/boa-0.94.13/src目录下,修改makefile文件中:

LDFLAGS = -g

修改为:LDFLAGS = -static 就可以了。

执行boa时,可能出现其他的错误,则可以在开发板的/var/log/boa/error_log文件中找原因。大部分是跟boa.conf配置文件的正确与否有关。如:

问题:在执行./boa时出现错误:boa执行时,出错 log.c:73 unable to dup2 the error log:bad file descriptor

解决方法:在log.c里注释掉那个if语句。

又出现了另个问题:unable to dup2 the error log: Bad file descriptor

解决方法:在boa.conf里注释掉#AccessLog /var/log/boa/access_log

4.CGI脚本测试

书写下面的test.c测试程序,

#include <stdio.h>

#include <string.h>

int main(void)

{

printf("Contenttype:text/html\n\n");

printf("<html>\n");

printf("<head><title>An HTML Page From a CGI</title></head>\n");

printf("<body><br>\n");

printf("<h2> This is an HTML page generated from with in a CGI program..</h2>\n");

printf("<hr><p>\n");

printf("<a href=https://www.linuxidc.com/Linux/2011-01/\"output.html#two\"><b> Go back to out put.html page </b></a>\n");

printf("</body>\n");

printf("</html>\n");

fflush(stdout);

}

交叉编译生成test.cgi

# /usr/local/arm/2.95.3/bin/arm-linux-gcc -o test.cgi test.c

将test.cgi拷贝至嵌入式板子的/var/www/cgi-bin/下,当在局域网PC的IE上输入 嵌入式板子的IP地址/cgi-bin/test.cgi

可以显示出test.cgi的网页。

有关CGI的知识可以学习:用C语言实现CGI相关资料。

注意:上面代码执行时,可能会出现错误提示:

502 Bad Gateway

The CGI was not CGI/1.1 compliant.

可能出现的原因:

1.测试下看是否能浏览静态网页,以保证网络是正确的。

在上面“第三步的 2.测试操作”后局域网的PC的IE上输入嵌入式板子的IP地址,如果能显示redhat9的欢迎主页,说明静态访问是正确的了。

2.将.cgi文件拷贝至目标板上后,必须改变其权限

chmod 755 test.cgi

否则,上位机浏览时会提示上面错误

3.最有可能是CGI程序本身的问题。

我们已经看到test.c的打印开头有使用MIME头信息″Content type :text/html\n\n″来表示输出HTML源代码给Web服务器。请注意任何MIME头信息后必须有一个空行,就是加了\n\n,

所以这点必须保证。

4.Test.c的原文件是在文本模式下编辑的,在linux下不能执行

可以改动:dos2unix test.c 改动后再进行编译

5.还有一种可能,test.cgi被编译成了动态形式,然而程序执行时在嵌入式中找不到动态库文件,所以在编译程序时加上-static,编译成静态的形式,但是这样编译出来的文件很大,在嵌入式中不适宜采用这种方式。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wygyjz.html