嵌入式linux python移植过程_嵌入式linux项目开发(一)——BOA移植

嵌入式linux项目开发(一)——BOA移植

项目目标:使用BOA、CGIC、SQLite搭建嵌入式web服务器

一、嵌入式web服务器BOA简介

在嵌入式设备的管理与交互中,基于Web方式的应用成为目前的主流,即在嵌入式设备上运行一个支持脚本或CGI功能的Web服务器,能够生成动态页面,在用户端只需要通过Web浏览器就可以对嵌入式设备进行管理和监控,使用极为方便。

目前嵌入式设备中所使用的web服务器主要有:boa、thttpd、mini_httpd、shttpd、lighttpd、goaheand、appweb和apache等。

BOA是Paul Philips在1991年开发的开源的嵌入式web服务器,BOA功能强大,支持认证,CGI等,应用广泛,特别适合于嵌入式设备。与传统的web服务器为每个访问连接开启一个进程不同,BOA是一个单任务的web服务器,不会为多个连接开启多个任务进程。BOA对所有的活动的http连接在内部进行处理,而且只为每个CGI连接(独立的进程)开启新的进程。因此,BOA在同等硬件条件下显示出更快的速度。测试表明boa在Pentium 300MHZ下能够每秒钟处理几千次点击,在20 MHz 386/SX下能够每秒钟处理几十次点击访问。

BOA与apache等高性能web服务器主要区别是,BOA是单进程的服务器,只有在完成一个用户请求后才能响应另一个用户的请求,无法并发响应,在嵌入式设备的应用场合里已经足够。

BOA是一个非常小巧的Web服务器,可执行代码只有约60KB,是一个单任务Web服务器,只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求;但BOA支持CGI,能够为CGI程序fork出一个进程来执行。

BOA的设计目标是速度和安全,是指不被恶意用户暗中破坏,而不是指它有很好的访问控制和通信加密。可以添加SSL来保证数据传输中的保密和安全。在其站点公布的性能测试中,BOA的性能要好于Apache服务器。

二、嵌入式BOA服务器编译

1、下载BOA源码

从www.boa.org下载boa-0.94.13.tar.gz源码

2、生成配置文件

在BOA顶层目录src下运行./configure

3、修改Makefile文件

修改Makefile文件中的交叉编译工具选项

CC = arm-linux-gcc

CPP = arm-linux-gcc–E

LDFLAGS = -static

4、修改boa.c文件

将boa.c文件中的一下内容注释

if ( setuid ( 0 ) != - 1 ) {

DIE ( "icky Linux kernel bug!" );

}

5、修改compat.h文件

#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff

修改成

#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff

6、修改config.c文件

将if(!server_name){..........}内容注释,位于266-286行

不注释会报错:gethostbyname:: Resource temporarily unavailable

7、修改log.c文件

注释掉以下内容

if (dup2(error_log, STDERR_FILENO) == -1) {

DIE("unable to dup2 the error log");

}

不注释会报错:unable to dup2 the error log:bad file descriptor

8、编译

make

9、去除调试信息

arm-linux-strip boa

10、修改执行权限

chmod 777 boa

三、BOA服务器配置

1、boa.conf文件解析

#监听的端口

Port 80

#服务器绑定的IP地址,注释掉表示绑定到INADDR_ANY,适配服务器所有的IP

#Listen 192.68.0.5

#服务器运行的用户和组

#User o

User 0

#Group o

Group 0

#当服务器发生问题时发送报警的email地址

#ServerAdmin root@localhost

#错误日志文件

ErrorLog /var/log/boa/error_log

#访问日志文件

AccessLog /var/log/boa/access_log

#是否使用本地时间。如果没注释掉,则使用本地时间。注释掉则使用UTC时间

#UseLocaltime

#是否记录CGI运行信息

#VerboseCGILogs

#服务器名字

#是否启动虚拟主机功能,即设备可以有多个网络接口,每个接口都可以拥有一个虚拟的Web服务器

#VirtualHost

#非常重要,HTML文档的主目录

DocumentRoot /var/www

#如果收到一个用户请求的话,在用户主目录后再增加的目录名

UserDir public_html

#HTML目录索引的文件名

DirectoryIndex index.html

#一个连接所允许的HTTP持续作用请求最大数目

KeepAliveMax 1000

#HTTP持续作用中服务器在两次请求之间等待的时间数,以秒为单位,超时将关闭连接

KeepAliveTimeout 10

#指明mime.types文件位置

MimeTypes /etc/mime.types

#文件扩展名没有或未知的话,使用的缺省MIME类型

DefaultType text/plain

#提供CGI程序的PATH环境变量值

CGIPath /bin:/usr/bin:/usr/local/bin

#为路径加上别名

Alias /doc /usr/doc

#指明CGI脚本的虚拟路径对应的实际路径

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

2、其他文件移植

从linux的etc目录拷贝mime.types、passwd、group文件到开发板系统的etc目录

创建web服务器HTML文档的主目录/var/www

创建CGI脚本所在目录/var/www/cgi-bin/

四、BOA移植过程中错误的解决方案

1、gethostbyname:: No such file or directory

解决办法:修改boa.conf去掉ServerName www.your.org.here前的注释符号(#)

2、util.c:100:1: error: pasting "t" and "->"does not give a valid preprocessing token make: *** [util.o]

解决办法:

修改src/compat.h

#defineTIMEZONE_OFFSET(foo) foo##->tm_gmtoff

修改成

#defineTIMEZONE_OFFSET(foo) (foo)->tm_gmtoff

3、boa.c:211 - getpwuid: No such file or directory

解决办法:修改src/boa.c

注释掉下面这段程序:

if (passwdbuf == NULL) {

DIE(”getpwuid”);

}

if(initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {

DIE(”initgroups”);

}

即修改为:

#if 0

if (passwdbuf == NULL) {

DIE(”getpwuid”);

}

if(initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {

DIE(”initgroups”);

}

#endif

4、boa.c:228 - icky Linux kernel bug!: No such file or directory

解决办法:

修改src/boa.c,注释掉下面语句:

if(setuid(0) != -1) {

DIE(”icky Linux kernel bug!”);

}

即修改为:

#if 0

if(setuid(0) != -1) {

DIE(”icky Linux kernel bug!”);

}

#endif

5、log.c:73 unable to dup2 the error log:bad file descriptor

解决方法:

修改src/log.c

注释掉

if(dup2(error_log, STDERR_FILENO) == -1) {

DIE("unableto dup2 the error log");

}

即修改为:

#if 0

if (dup2(error_log, STDERR_FILENO) == -1) {

DIE("unable to dup2 the error log");

}

#endif

6、执行boa程序报错not found

解决方法:

修改Makefile

LDFLAGS = -static

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html课做一个网页,菜鸟自学建站 HTML 第三课 制作我的第一个网页_html/css_WEB-ITnose...

上一课我们了解了Dreamweaver的工作界面,从这节课开始,我们由浅入深的开始学习网页的制作。首先打开Dreamweaver,制作网页首先要新建一个文档,就像我们写文稿需要一张纸一样。只有有了载体,你才能在上面进行创作&#…

k8s 手动恢复redis 集群_高工面试之:redis的几种集群方式你都熟悉吗?

Redis三种集群方式:主从复制、哨兵模式和Cluster模式一、主从复制模式Redis配置成主从模式,主库(Master)只负责客户端的写数据,从库(Slave)只负责客户端的读数据。主从数据复制过程如图所示:主从复制原理:slave redis连…

mock模拟接口测试 vue_Easy Mock以及Vue+Mock.js模拟数据

Easy Mock以及VueMock.js模拟数据一、Mock.js简介Mock.js是一个可以模拟后端数据,也可以模拟增删改查操作的js库基础语法规范数据模板中的每个属性由 3 部分构成:属性名、生成规则、属性值:name|rule: value语法规则说明name|min-max: string…

excel转html中文乱码,英文系统中Excel中文乱码问题

我是先用Gridview导出,然后再转换格式,部分代码如下StringWriter sw new StringWriter();HtmlTextWriter htw new HtmlTextWriter(sw);GV.RenderControl(htw);File.WriteAllText(path"temp", sw,System.Text.Encoding.UTF7);Excel.Applicati…

jsbridge原理_React Hooks 原理与最佳实践

1. 前言React Hooks 是 React 16.8 引入的新特性,允许我们在不使用 Class 的前提下使用 state 和其他特性。React Hooks 要解决的问题是状态共享,是继 render-props 和 higher-order components 之后的第三种状态逻辑复用方案,不会产生 JSX 嵌…

html小圆图堆叠轮播,每次移一张图片的无缝轮播图

my动画轮播图*{list-style: none;margin: 0px;padding: 0px;}.carousel{width: 530px;height: 280px;overflow: hidden;position: relative;}.carousel .imgList{width: 9999px;position: absolute;}.carousel .imgList>li{float: left;}.carousel .imgList>li>img{wi…

mfc绘制bezier b样条三种曲线_生存曲线(二):SPSS和Origin绘图教程及相关问题

上期生存分析推送后,有粉丝在后台问:有发生率的情况,为什么要做生存曲线分析?举个例子:临床试验中,共招募30位胃腺癌患者,均分为3组,分别使用了A/B/C三套不同的治疗方案,…

8位可控加减法电路设计_高级工程师:相同的地线GND,却有不同的电路设计含义...

问一个简单而又很难回答的电路问题:电路中的地线GND,它的本质是什么?工程师,在研发设计一个电路项目时,一般会经历三个阶段:电路项目PCBA板1,项目方案论证项目方案论证,是在项目前期…

word刷子刷格式_Excel技巧—开始菜单之格式刷六大功能

点赞再看,养成习惯千里之行,始于足下今天我们主要学习的是“第一区块-剪贴板”中的“格式刷”。“格式刷”主要将一个对象的颜色、字体样式、字体大小、边框样式等所有格式复制到目标对象上,我们可以把它理解为格式的复制粘贴。说到“格式刷”…

html/css题库,DIV+CSS题库

CD2、在CSS语言中下列哪一项是"左边框"的语法?(C )A、border-left-width:B、border-top-width:C、border-left:D、border-top-width:3. 选出你认为最合理的定义标题的方法( C )A. 文章标题B.文章标题C.文章标题D. 文章标题4、在CSS语言中下列哪一项的适用…

紫金计算机网络,南京理工大学紫金学院《计算机网络技术》考试复习试题试题(含答案解析)2...

一、选择题:(每题2分,共40分)1.在TCP/IP参考模型中,TCP协议工作在()。A、应用层B、传输层C、互联网层D、网络接口层2.下列()是合法的E-mail地址。A、mnetworkhttp://www.doczj.com/doc/fe7e6e475ebfc77da26925c52cc58b…

go语言和python结合_Go+Python双语言混合开发-第1章 【阶段一:Go语言基础】

1-1 GoPython双语言混合开发-课程导学 (11:35)1-2 课程资源获取方式 - 非常重要!!! (06:07)1-3 课程中需要用到的开发环境介绍 (03:47)1-4 windows中安装centos7虚拟机 (19:16)1-5 xshell的安装和使用 (04:14)1-6 git的安装和配置 (06:22)1-7…

cwinthread*线程指针怎么销毁结束_最新版Web服务器项目详解 01 线程同步机制封装类...

点 击 关 注 上 方"两猿社"设 为"置 顶 或 星 标",干 货 第 一 时 间 送 达。互 联 网 猿 | 两 猿 社基础知识RAIIRAII全称是“Resource Acquisition is Initialization”,直译过来是“资源获取即初始化”.…

您的计算机无法访问dota2,解决win7系统DOTA2无法连接至Steam网络的设置方法

随着电脑的使用率越来越高,我们有时候可能会遇到win7系统DOTA2无法连接至Steam网络问题,如果我们遇到了win7系统DOTA2无法连接至Steam网络的问题,要怎么处理win7系统DOTA2无法连接至Steam网络呢?接下来给大家带来win7系统DOTA2无法…

根据经纬度计算范围_高中地理必修一二三思维导图+计算公式全汇总!能用3年...

必修一必修二必修三计算公式1.经纬度计算:经度差与地方时差算经度——地方时每相差1小时,经度相差1;纬差法与正午太阳高度算纬度——正午太阳相差多小,纬度相差多少;北极星的仰角即地平高度等于当地地理纬度;经纬线上长度算经纬度——1经线长…

linux 系统 可视化工具实时监控_Linux上的实时监控平台-你需要这样做

应朋友们要求,介绍上Linux系统下的实时监控平台,在上次提到了glances,它提供了较多的监控指标,那如果我们要看历史数据呢?某一时间段的回放呢?显然glances是做不到的。因此,实时监控平台就应运而…

职称类计算机论文,计算机类职称论文发表(2)

计算机类职称论文发表篇二基于计算机通信网络的采矿传输技术【摘 要】煤矿开采是人类合理开发自然资源的主要途径,对国民产业经营收益水平也有很大的影响。信息科技改革指导下,分析了基于计算机通信网络的采矿信息传输方案,指导了煤炭开采新模…

linux 普通用户touch权限不够_Linux 开启指令

简单指令1.1、 ls 指令语法1:# ls [路径]表示列出指定路径下的文件夹和文件 的名字,如果路径没有指定则列出当前路径下的(list)列如:在root用户的家目录中输入ls命令,则会看到以下的效果:要求列…

5、this调用语句必须是构造函数中的第一个可执行语句_ES6中的Promise和Generator详解...

简介ES6中除了上篇文章讲过的语法新特性和一些新的API之外,还有两个非常重要的新特性就是Promise和Generator,今天我们将会详细讲解一下这两个新特性。Promise什么是PromisePromise 是异步编程的一种解决方案,比传统的解决方案“回调函数和事件”更合理和…

华中师范大学本科生计算机课教师,华中师范大学第八届大学生计算机设计大赛的通知...

为了激发大学生学习计算机知识和技能的兴趣和潜能,培养其创新能力和团队合作意识,以及运用信息技术解决实际问题的综合实践能力,切实提高计算机教学质量,教育部高等学校计算机类专业教学指导委员会、软件工程专业教学指导委员会、…