




免费预览已结束,剩余58页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计 算 机 学 院嵌 入 式 程 序 设 计实验报告 班级: * 学号:* 姓名:王增祥 实验分组: B 实验一、开发环境的搭建与配置1、 实验目的1、熟悉嵌入式Linux开发平台。2、掌握嵌入式Linux开发平台的开发环境搭建与配置。3、了解minicon配置过程。4、了解嵌入式系统启动过程5、掌握程序交叉编译过程和调试方式。2、 实验内容1、连接实验板和宿主机2、查看虚拟机配置是否正确3、查看minicom配置是否正确4、在宿主机上编写C语言程序,并且进行交叉编译,然后传输到目标机上进行运行。5、在宿主机上编写C语言程序,进行交叉编译,然后采用gdbserver进行远程调试。3、 实验过程1、打开实验板,用网线和串口线连接宿主机,边切连接电源。2、在桌面打开vmware,进去虚拟机3、检查虚拟机配置是否正确4、进入交叉编译工具5、用vi编辑器打开/etc/profile文件6、在/etc/profile文件中添加一行,保存文件退出。 使用source命令使路径生效。 7、使用which命令来查看路径是否生效,便查看arm-linux-gcc命令的基本信息,验证是否可用 8、在终端输入minicom -s 进入,查看配置是否正确。 9、启动目标版10、启动停止按enter进入系统11、用ifconfig命令把目标机的IP设置为,然后ping命令测试目标机与宿主机的网络连通性。 12、在宿主机的/root/Work目录下用vi命令创建一个文件helloworld.c,编辑后退出并保存。 13、用arm-linux-gcc命令对helloworld.c进行编译。采用file命令查看新生成的文件helloworld的信息。最后产看helloworld能否正确运行。 14、用scp命令把文件helloworld拷贝到目标机/root目录下,然后运行改文件。 15、在宿主机的/root/Work目录下用vi命令创建文件arm_error.c编辑后保存后并退出。 16、使用arm-linux-gcc命令编译arm_error.c 17、用scp命令把arm_error拷贝到目标机的/root目录下。 18、在目标机的/root目录下运行arm_error,查看运行结果。 19、在目标机上启动gdbserver。 20、在宿主机上启动arm-linux-gdb 21、对arm_error进行调试,用list命令列出源程序,用break,命令添加断点,然后用continue命令继续运行程序。 22、用next命令进行单步调试 在调试的过程中,发现问题出在“p0 = e;”语句上。因对一个字符串常量进行修改而发生了段错误。 23、查看目标机的显示信息4、 实验心得 通过这次实验,了解了实验的基本环境,加深了交叉编译的理解。学会了在目标版运行和调试程序的步骤,掌握了基本的调试方法。对Linux操作系统的操作得到了加强,为后面的实验打下了基础。实验二、并发web服务器的实现1、 实验目的1、 熟悉Linux网络编程2、 了解Web服务器原理3、 掌握嵌入式Linux多线程、多进程、I/O多路复用三种并发服务器的实现2、 实验内容1、用多进程实现Web服务器2、用多线程实现Web服务器3、采用I/O多路复用实现Web服务器3、 实验步骤1、打开实验板,进入minicom.2、ifconfig命令把目标机的IP设置为。采用ping命令检测目标机和宿主机的网络连通性。3、把程序源代码拷贝到宿主机的mnt/nfs/web目录下4、用arm-linux-gcc命令编译源程序,得到可执行程序web_server_process5、 用vi文本编辑器创建文件index.html,用于测试Web服务 6、建立文件hello.c,用于测试Web服务器。 7、用命令server启动宿主机上的nfs服务,采用export命令查看nfs的共享目录。8、在宿主机的浏览器中输入:/file查看结果。 9、在宿主机的浏览器中输入查看结果 10、在宿主机的浏览器中输入/index.html,查看执行结果。 11、在宿主机的浏览器中输入/cgi-bin/hello.cgi,查看执行结果。12、 在宿主机的浏览器中输/web_server_process.c,查看执行结果。13、用arm-linux-gcc命令编译源程序,得到可执行程序web_server_thread。14、在目标机中运行web_server_thread。15、在宿主机的浏览器中输入,查看执行结果。16、 在宿主机的浏览器中输入/cgi-bin/hello.cgi查看行结果。17、在宿主机的浏览器中输入/web_server_thread.c,查看执行结果。 18、用arm-linux-gcc命令编译源程序,得到可执行程序web_server_select。 19、在目标机中运行web_server_select。 20、在宿主机的浏览器中输入,查看执行结果。 21、在宿主机的浏览器中输入/cgo-bin/hello.cgi,查看执行结果。 22、在宿主机的浏览器中输入/web_server_select.c4、 实验代码/* web_server_process.c */#include #include #include #include #include #include #include #include #include #include #define BUFSIZE 1024#define MAX_QUE_CONN_NM 5int start_server(int portnum);void sigchld_handler(int sig);int process_request(char *rq, int fd);int resp_cannot_do(int fd);int not_exist(char *f);int resp_do_404(char *item, int fd);int is_a_dir(char *f);int resp_do_ls(char *dir, int fd);int is_a_cgi_file(char *f);int resp_do_exec(char *prog, int fd);int resp_do_cat(char *f, int fd);void pack_header(FILE *fp, char *extension);char *get_filename_extension(char *f);void ignore_others(FILE *fp);int main(int argc, char *argv)int sock;int portnum;int fd;pid_t pid;FILE *fpin;char requestBUFSIZE;if (argc != 2) fprintf(stderr, usage: %s n, argv0);exit(-1);portnum = atoi(argv1);sock = start_server(portnum);signal(SIGCHLD, sigchld_handler);while(1) fd = accept(sock, NULL, NULL);while (pid = fork() = -1);if (pid = 0) fpin = fdopen(fd, r);memset(request, 0, sizeof(request);fgets(request, BUFSIZE, fpin);ignore_others(fpin);process_request(request, fd);fclose(fpin);exit(0);close(fd);close(sock);exit(0);int start_server(int portnum)struct sockaddr_in server_sockaddr, client_sockaddr;int sin_size, recvbytes;int sockfd, client_fd;/* create socket link */if (sockfd = socket(AF_INET, SOCK_STREAM, 0) = -1) perror(socket);exit(-1);server_sockaddr.sin_family = AF_INET;server_sockaddr.sin_port = htons(portnum);server_sockaddr.sin_addr.s_addr = INADDR_ANY;bzero(server_sockaddr.sin_zero, 8);int i = 1;setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i);if (bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr) = -1) perror(bind);exit(-1);if (listen(sockfd, MAX_QUE_CONN_NM) = -1)perror(listen);exit(-1);return sockfd;void sigchld_handler(int sig)while (waitpid(-1, 0, WNOHANG) 0);return;int process_request(char *rq, int fd)char cmdBUFSIZE;char argBUFSIZE;strcpy(arg, ./);if (sscanf(rq, %s %s, cmd, arg + 2) != 2) return 1;if (strcmp(cmd, GET) != 0)resp_cannot_do(fd); else if (not_exist(arg) resp_do_404(arg, fd); else if (is_a_dir(arg) resp_do_ls(arg, fd); else if (is_a_cgi_file(arg) resp_do_exec(arg, fd); else resp_do_cat(arg, fd);return 0;int resp_cannot_do(int fd)FILE *fp = fdopen(fd, w);fprintf(fp, HTTP/1.1 501 Not Implementedrn);fprintf(fp, Content-type: text/plainrn);fprintf(fp, rn);fprintf(fp, That command is not yet implementedrn);fclose(fp);return 0;int not_exist(char *f)struct stat info;return (stat(f, &info) = -1);int resp_do_404(char *item, int fd)FILE *fp = fdopen(fd, w);fprintf(fp, HTTP/1.1 404 Not Foundrn);fprintf(fp, Content-type: text/plainrn);fprintf(fp, rn);fprintf(fp, The item you requested: %srnis not foundrn, item);fclose(fp);return 0;int is_a_dir(char *f)struct stat info;return (stat(f, &info) != -1 & S_ISDIR(info.st_mode);int resp_do_ls(char *dir, int fd)FILE *fp = fdopen(fd, w);pack_header(fp, text/plain);fprintf(fp, rn);fflush(fp);dup2(fd, 1);dup2(fd, 2);close(fd);execlp(ls, ls, -l, dir, NULL);perror(dir);return 0;int is_a_cgi_file(char *f)return(strcmp(get_filename_extension(f), cgi) = 0);int resp_do_exec(char *prog, int fd)FILE *fp = fdopen(fd, w);pack_header(fp, NULL);fflush(fp);dup2(fd, 1);dup2(fd, 2);close(fd);execl(prog, prog, NULL);perror(prog);return 0;int resp_do_cat(char *f, int fd)char *extension = get_filename_extension(f);char *content = text/plain;FILE *fpsock, *fpfile;int c;if (strcmp(extension, html) = 0) content = text/html; else if (strcmp(extension, gif) = 0) content = text/gif; else if (strcmp(extension, jpg) = 0) content = text/jpg; else if (strcmp(extension, jpeg) = 0) content = text/jpeg;fpsock = fdopen(fd, w);fpfile = fopen(f, r);if (fpsock != NULL & fpfile != NULL) pack_header(fpsock, content);fprintf(fpsock, rn);while (c = getc(fpfile) != EOF) putc(c, fpsock);fclose(fpfile);fclose(fpsock);return 0;return 1;void pack_header(FILE *fp, char *extension)fprintf(fp, HTTP/1.1 200 OKrn);if (extension)fprintf(fp, Content-type: %srn, extension);char *get_filename_extension(char *f)return strrchr(f, .) + 1; void ignore_others(FILE *fp)char bufBUFSIZE;fgets(buf, BUFSIZE, fp);while(strcmp(buf, rn) fgets(buf, BUFSIZE, fp);return; 1. 多进程Web服务器 2、 多线程Web服务器/* web_server_thread.c */#include #include #include #include #include #include #include #include #include #include #include #define BUFSIZE 1024#define MAX_QUE_CONN_NM 10void *thread(void *vargp);int start_server(int portnum);int process_request(int fd);int resp_cannot_do(int fd);int not_exist(char *f);int resp_do_404(char *item, int fd);int is_a_dir(char *f);int resp_do_ls(char *dir, int fd);int is_a_cgi_file(char *f);int resp_do_exec(char *prog, int fd);int resp_do_cat(char *f, int fd);void pack_header(FILE *fp, char *extension);char *get_filename_extension(char *f);void ignore_others(FILE *fp);int main(int argc, char *argv)int sock;int portnum;int *fd;pthread_t tid;if (argc != 2) fprintf(stderr, usage: %s n, argv0);exit(-1);portnum = atoi(argv1);sock = start_server(portnum);while(1) fd = malloc(sizeof(int);*fd = accept(sock, NULL, NULL);pthread_create(&tid, NULL, thread, fd);close(sock);exit(0);int start_server(int portnum)struct sockaddr_in server_sockaddr;int sockfd;/* create socket link */if (sockfd = socket(AF_INET, SOCK_STREAM, 0) = -1) perror(socket);exit(-1);server_sockaddr.sin_family = AF_INET;server_sockaddr.sin_port = htons(portnum);server_sockaddr.sin_addr.s_addr = INADDR_ANY;bzero(server_sockaddr.sin_zero, 8);int i = 1;setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i);if (bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr) = -1) perror(bind);exit(-1);if (listen(sockfd, MAX_QUE_CONN_NM) = -1)perror(listen);exit(-1);return sockfd;void *thread(void *vargp)int fd = *(int *)vargp);pthread_detach(pthread_self();free(vargp);process_request(fd);close(fd);return;int process_request(int fd)char requestBUFSIZE, cmdBUFSIZE, argBUFSIZE;FILE *fpin;fpin = fdopen(fd, r);fgets(request, BUFSIZE, fpin);ignore_others(fpin);strcpy(arg, ./);if (sscanf(request, %s %s, cmd, arg + 2) != 2) return 1;if (strcmp(cmd, GET) != 0)resp_cannot_do(fd); else if (not_exist(arg) resp_do_404(arg, fd); else if (is_a_dir(arg) resp_do_ls(arg, fd); else if (is_a_cgi_file(arg) resp_do_exec(arg, fd); else resp_do_cat(arg, fd);fclose(fpin);return 0;int resp_cannot_do(int fd)FILE *fp = fdopen(fd, w);fprintf(fp, HTTP/1.1 501 Not Implementedrn);fprintf(fp, Content-type: text/plainrn);fprintf(fp, rn);fprintf(fp, That command is not yet implementedrn);fclose(fp);return 0;int not_exist(char *f)struct stat info;return (stat(f, &info) = -1);int resp_do_404(char *item, int fd)FILE *fp = fdopen(fd, w);fprintf(fp, HTTP/1.1 404 Not Foundrn);fprintf(fp, Content-type: text/plainrn);fprintf(fp, rn);fprintf(fp, The item you requested: %srnis not foundrn, item);fclose(fp);return 0;int is_a_dir(char *f)struct stat info;return (stat(f, &info) != -1 & S_ISDIR(info.st_mode);int resp_do_ls(char *dir, int fd)pid_t pid;FILE *fp = fdopen(fd, w);pack_header(fp, text/plain);fprintf(fp, rn);fflush(fp);while (pid = fork() = -1);if (pid = 0) dup2(fd, 1);dup2(fd, 2);close(fd);execlp(ls, ls, -l, dir, NULL);perror(dir);waitpid(pid, NULL, 0);return 0;int is_a_cgi_file(char *f)return(strcmp(get_filename_extension(f), cgi) = 0);int resp_do_exec(char *prog, int fd)pid_t pid;FILE *fp = fdopen(fd, w);pack_header(fp, NULL);fflush(fp);while (pid = fork() = -1);if (pid = 0) dup2(fd, 1);dup2(fd, 2);close(fd);execl(prog, prog, NULL);perror(prog);waitpid(pid, NULL, 0);return 0;int resp_do_cat(char *f, int fd)int flag = 1;char *extension = get_filename_extension(f);char *content = text/plain;FILE *fpsock, *fpfile;int c;if (strcmp(extension, html) = 0) content = text/html; else if (strcmp(extension, gif) = 0) content = text/gif; else if (strcmp(extension, jpg) = 0) content = text/jpg; else if (strcmp(extension, jpeg) = 0) content = text/jpeg;fpsock = fdopen(fd, w);fpfile = fopen(f, r);if (fpsock != NULL & fpfile != NULL) pack_header(fpsock, content);fprintf(fpsock, rn);while (c = getc(fpfile) != EOF) putc(c, fpsock);fclose(fpfile);fclose(fpsock);flag = 0;return flag;void pack_header(FILE *fp, char *extension)fprintf(fp, HTTP/1.1 200 OKrn);if (extension)fprintf(fp, Content-type: %srn, extension);char *get_filename_extension(char *f)return strrchr(f, .) + 1; void ignore_others(FILE *fp)char bufBUFSIZE;fgets(buf, BUFSIZE, fp);while(strcmp(buf, rn) fgets(buf, BUFSIZE, fp);return; 3. I/O多路复用方式的Web服务器/* web_server_select.c */#include #include #include #include #include #include #include #include #include #include #include #define BUFSIZE 1024#define MAX_QUE_CONN_NM 5typedef struct int maxfd;fd_set read_set;fd_set ready_set;int nready;int maxi;int clientfdFD_SETSIZE;char requestFD_SETSIZEBUFSIZE;int lenFD_SETSIZE; pool;int start_server(int portnum);void init_pool(int sockfd, pool *p);void add_client(int connfd, pool *p);void check_clients(pool *p);int process_request(char *rq, int fd);int resp_cannot_do(int fd);int not_exist(char *f);int resp_do_404(char *item, int fd);int is_a_dir(char *f);int resp_do_ls(char *dir, int fd);int is_a_cgi_file(char *f);int resp_do_exec(char *prog, int fd);int resp_do_cat(char *f, int fd);void pack_header(FILE *fp, char *extension);char *get_filename_extension(char *f);int main(int argc, char *argv)int sock;int fd;int portnum;static pool pool;FILE *fpin;int i = 1;if (argc != 2) fprintf(stderr, usage: %s n, argv0);exit(-1);portnum = atoi(argv1);sock = start_server(portnum);init_pool(sock, &pool);while(1) pool.ready_set = pool.read_set;pool.nready = select(pool.maxfd + 1, &pool.ready_set, NULL, NULL, NULL);if ( pool.nready= -1) perror(select);exit(-1);if (FD_ISSET(sock, &pool.ready_set) if (fd = accept(sock, NULL, NULL) = -1) perror(accept);close(sock);exit(-1);add_client(fd, &pool);check_clients(&pool);int start_server(int portnum)struct sockaddr_in server_sockaddr, client_sockaddr;int sin_size, recvbytes;int sockfd, client_fd;/* create socket link */if (sockfd = socket(AF_INET, SOCK_STREAM, 0) = -1) perror(socket);exit(-1);server_sockaddr.sin_family = AF_INET;server_sockaddr.sin_port = htons(portnum);server_sockaddr.sin_addr.s_addr = INADDR_ANY;bzero(server_sockaddr.sin_zero, 8);int i = 1;setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i);if (bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr) = -1) perror(bind);exit(-1);if (listen(sockfd, MAX_QUE_CONN_NM) = -1)perror(listen);exit(-1);return sockfd;void init_pool(int sockfd, pool *p)int i;p-maxi = -1;for(i = 0; i clientfdi = -1;p-maxfd = sockfd;FD_ZERO(&p-read_set);FD_SET(sockfd, &p-read_set);void add_client(int connfd, pool *p)int i;p-nready-;for (i = 0; i clientfdi clientfdi = connfd;memset(p-requesti, 0, BUFSIZE);p-leni = 0;FD_SET(connfd, &p-read_set);if (connfd p-maxfd)p-maxfd = connfd;if (i p-maxi)p-maxi = i;break;if (i = FD_SETSIZE)printf(add_client error: Too many clientsn);void check_clients(pool *p)int i;int connfd;int n;int ret;char bufBUFSIZE;char *q;for (i=0; (imaxi)&(p-nready0); i+) connfd = p-clientfdi;if (connfd 0) & (FD_ISSET(connfd, &p-ready_set) p-nready-;ret = read(connfd, p-requesti+p-leni, BUFSIZE);if (ret = -1)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 采钢围挡租赁合同范本
- 甲方地质勘探合同范本
- 酒水代理招商合同范本
- 装修模板出租合同范本
- 食品加工协议合同范本
- 游轮店面出租合同范本
- 甲方建筑劳务合同范本
- 装修独家销售合同范本
- 活动板房施工合同范本
- 设计合同技术合同范本
- 法律职业资格考试客观题(试卷一)试题与参考答案(2025年)
- 狂犬疫苗使用培训课件
- 2025新疆伊犁州伊宁市中小学招聘各学科编外教师备考考试题库附答案解析
- 2023-2025年高考化学试题分类汇编:有机化合物(原卷版)
- 【2025年】郴州社区专职工作人员招聘考试笔试试卷【附答案】
- 2025发展对象考试题库附含答案
- 2025-2026学年第一学期学校教导处工作计划:扎根常规提质效稳中求进促提升
- 主体结构劳务分包工程(八标段)施工组织设计
- 营养与慢性伤口愈合的关系
- (正式版)JBT 9229-2024 剪叉式升降工作平台
- 车辆赠与协议模板
评论
0/150
提交评论