欢迎来到得力文库 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
得力文库 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    嵌入式系统实验报告1.doc

    • 资源ID:70481932       资源大小:1.42MB        全文页数:24页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    嵌入式系统实验报告1.doc

    LINUX操作实验报告一 实验要求:1、程序设计思想要阐述清楚;2、要有流程图和源代码及注释;3、要有仿真结果及说明。【实验一】内容与目的:编写fork/vfork的测试程序,验证二者的区别1、程序设计思想fork/vfork为进程创建操作,为实现以上目的,可以在程序中设置等待,根据打印输出信息,验证父进程与子进程在执行顺序上的差别;在父进程中设置测试使用变量,分别在子进程中对变量进行修改,并打印输出,可以观察子进程对变量的修改是否会影响父进程中变量的取值,进而可以观察父进程与子进程是否数据空间及堆、栈等。2、流程图、源代码及注释Fork01bFork01aPid=vfork()Pid=fork() =0>0 <0 =0>0<0进程错误等待等待进程错误等待等待父进程子进程父进程子进程变量自加变量自加退出返回退出Fork01a程序代码及注释如下:#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> int global=1; /设定参数初始值 int main(void) int var=2; pid_t pid; /显示两个参数初始值 printf("The original values:global=%d,var=%dn",global,var); if(pid=fork()<0) /如果进程号小于0,显示出错 printf("for errorn"); else if(pid=0) /如果处于子进程,显示所处进程,并修改各变量 sleep(10); /(设置等待时间:S) global+; var+; printf("In child processn"); else /如果处于父进程,显示所处进程和各变量 sleep(5); printf("In parent processn"); printf("pid=%d,global=%d,var=%dn",getpid(),global,var); exit(0); 运行结果:若变换等待时间如下:#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> int global=1; /设定参数初始值 int main(void) int var=2; pid_t pid; /显示两个参数初始值 printf("The original values:global=%d,var=%dn",global,var); if(pid=fork()<0) /如果进程号小于0,显示出错 printf("for errorn"); else if(pid=0) /如果处于子进程,显示所处进程,并修改各变量 sleep(5); /(设置等待时间:S) global+; var+; printf("In child processn"); else /如果处于父进程,显示所处进程和各变量 sleep(10); printf("In parent processn"); printf("pid=%d,global=%d,var=%dn",getpid(),global,var); exit(0); 运行结果如下:Fork01b程序代码及注释如下:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>int global=1; /设定参数初始值int main(void) int var=2; pid_t pid; /显示各参数值 printf("The original values:global=%d,var=%dn",global,var); if(pid=vfork()<0) /如果进程号小于0,报错 printf("vfork errorn"); else if(pid=0) /如果处于子进程,设定等待时间,修改各参数值,显示进程状态和参数值,返回 sleep(3); global+; var+; printf("In child processn"); printf("pid=%d,global=%d,var=%dn",getpid(),global,var); printf("child process endedn"); _exit(0); /如果处于父进程,设定等待时间,修改各参数值,显示进程状态和参数值,返回 else sleep(1); printf("In parent processn"); global+; var+; printf("pid=%d,global=%d,var=%dn",getpid(),global,var); printf("parent process endedn"); exit(0); 运行结果如下:若变换等待时间如下:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>int global=1; /设定参数初始值int main(void) int var=2; pid_t pid; /显示各参数值 printf("The original values:global=%d,var=%dn",global,var); if(pid=vfork()<0) /如果进程号小于0,报错 printf("vfork errorn"); else if(pid=0) /如果处于子进程,设定等待时间,修改各参数值,显示进程状态和参数值,返回 sleep(1); global+; var+; printf("In child processn"); printf("pid=%d,global=%d,var=%dn",getpid(),global,var); printf("child process endedn"); _exit(0); /如果处于父进程,设定等待时间,修改各参数值,显示进程状态和参数值,返回 else sleep(3; printf("In parent processn"); global+; var+; printf("pid=%d,global=%d,var=%dn",getpid(),global,var); printf("parent process endedn"); exit(0); 运行结果如下:3、仿真结果及说明由fork01a和fork01b的两个等待时间情况下的打印结果可以看出,fork对于子进程与父进程执行的先后顺序没有要求,且在父进程先于子进程退出以后,程序无法正常退出,而vfork要求先执行子进程,后执行父进程。fork中子进程复制父进程的数据空间,而fork和vfork共享数据空间。【实验二】1、实验内容1)程序1:首先运行,等待信号1和信号2,信号1使它退出,信号2使它打开一个文件,并建立一个FIFO,把文件的内容写到FIFO中去;2)程序2:运行之后,向程序1发送信号1和信号2,先发信号2,然后循环读取FIFO内容,打印到标准输出,直到打印字符数超出最大限制,然后发送信号1,使程序1 退出,程序2也退出:3)FIFO的名称可事先约定好。2、设计思想Fifo1使用main函数和sighdlr函数,在main中建立两个信号和子函数的关系,完成信号与函数的绑定,sighdlr用来接受信号,接收到信号1时,退出程序,接收到信号2时,建立一个命名管道,并打开一个文件,循环读取,直至文件尽头。Fifo2通过参数传递获取程序1的进程号,然后通过kill函数向此进程发送信号2,使fifo1建立管道,fifo2执行操作命名管道,最后向fifo1发送信号1使其退出,然后fifo2退出。3、流程图、源代码及注释Fifo02Fifo01获取1的进程号信号与子函数绑定发送信号2选择switch打开管道读取数据错误信号2信号1关闭管道返回结束结束删除管道关闭管道及打开文件向管道中写入文件打开管道及待读文件退出建立管道发送信号1打印输出Fifo01:#include<stdio.h>#include<signal.h>#include<string.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<stdlib.h> void sighdlr(int signum); int main() signal(SIGUSR1,sighdlr); /梆定信号和子函数 signal(SIGUSR2,sighdlr); while(1); return 0; void sighdlr(int signum) /信号处理子函数 char s128; int fd1; FILE* fd2; switch(signum) case SIGUSR1: /处理信号1 printf("quit!n"); exit(0); break; case SIGUSR2: /处理信号2 mkfifo("/home/fifo.tst",0666);/建立命名管道 fd1=open("/home/fifo.tst",O_WRONLY);/打开命名管道 fd2=fopen("/home/test.txt","r");/打开待读文件test.txt while(fgets(s,128,fd2)!=NULL) /向管道写入文件内容 write(fd1,s,strlen(s); close(fd1); /关闭命名管道 fclose(fd2); /关闭打开的文件 unlink("/home/fifo.tst"); /删除命名管道 pause(); break; default: break; Fifo02:#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<signal.h>#include<stdlib.h>#include<string.h>#define MAX 150 int main(int argc,char* argv) if(argc<2) printf("USEAGE:signal2 PIDn"); exit(0); int ipid; ipid=atoi(argv1); /获取传入fifo01的进程号 if(ipid<=0) printf("pid error!n"); exit(1); kill(ipid,SIGUSR2); /发送信号2到fifo01 char s128; char cMAX; int num=0; int sum=0; int fd=open("/home/fifo.tst",O_RDONLY);/打开命名管道 memset(s,0,128); num=read(fd,s,128);/从管道读取数据 sum+=num; while(sum<=MAX) /打印数据到标准输出 printf("%s",s); sum+=num; close(fd); /关闭命名管道 kill(ipid,SIGUSR1);/发送信号1到fifo01,结束 运行结果如下:4、仿真结果说明:Fifo01运行以后,等待fifo02发送信号,fifo02发送信号2时,读取文件并打印,发送信号1时,fifo01退出。【实验三】1、实验内容编写网络通信程序1)根据2.3节的内容,完善一个客户端数据接收程序(TCP),并测试正确性;2)根据2.3节的内容,尝试完成一个服务器程序的编写,练习使用Listen()和accept()函数。服务器程序可以发送一个字符串,供写好的接收程序接收。2、程序设计思想服务器首先运行,等待连接。运行服务器程序,并把服务器的ip地址作为第一个参数输入,连接成功以后,接受服务器发送的数据,并打印显示。3、流程图及代码客户端程序 开始服务器程序开始socket()获得服务器ip地址bind()socket()listen()accept()connect()等待用户结束结束Close()Printf()read()write()Write()Close()Read()请求数据应答数据服务器程序:/*服务器端程序*/ #include<stdlib.h>#include<errno.h>#include<string.h>#include<netdb.h>#include<sys/types.h>#include<netinet/in.h>#include<sys/socket.h>#include<sys/wait.h>#define MYPORT 4000#define BACKLOG 10int main(void) int sock_fd,new_fd; struct sockaddr_in my_addr; struct sockaddr_in their_addr; int sin_size; if(sock_fd=socket(AF_INET,SOCK_STREAM,0)=-1) perror("socket error!n"); return 0; /当前服务器程序运行的网络信息结构体 my_addr.sin_family=AF_INET; my_addr.sin_port=htons(MYPORT); my_addr.sin_addr.s_addr=INADDR_ANY; bzero(&(my_addr.sin_zero),8); /绑定当前的主机信息与主机套接字 if(bind(sock_fd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr)=-1) perror("bind error!"); return 0; /侦听来自客户程序的连接请求 if(listen(sock_fd,BACKLOG)=-1) perror("listen"); return 0; while(1) sin_size=sizeof(struct sockaddr_in); /接受来自客户程序的连接请求 if(new_fd=accept(sock_fd,(struct sockaddr*)&their_addr,&sin_size)=-1) perror("accept"); continue; printf("server:got connection from %sn",inet_ntoa(their_addr.sin_addr); /建立新的进程,发送数据到客户端程序 if(!fork() if(send(new_fd,"Hello,world!n",14,0)=-1) perror("send"); close(new_fd); exit(0); close(new_fd); while(waitpid(-1,NULL,WNOHANG)>0); 用户端/*客户端程序*/#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#define PORT 4000#define MAXDATASIZE 100int main(int argc,char *argv) int sockfd,numbytes; char bufMAXDATASIZE; struct hostent *he; struct sockaddr_in their_addr; if(argc != 2) fprintf(stderr,"usage:client hostnamen"); return 0; /通过第一个参数获取服务端程序运行人IP地址 if(he = gethostbyname(argv1) = NULL) herror("gethostbyname"); return 0; /获取一个套结字描述符 if(sockfd = socket(AF_INET,SOCK_STREAM,0) = -1) perror("socket"); return 0; /填写与服务器程序相关的信息结构体 their_addr.sin_family = AF_INET; their_addr.sin_port = htons(PORT); their_addr.sin_addr = *(struct in_addr *)he -> h_addr); bzero(&(their_addr.sin_zero),8); /将申请到的套结字描述符与服务器程序建立联系 if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr) = -1) perror("connect"); return 0; /通过套结字描述符从服务器程序读取数据 if(numbytes = recv(sockfd,buf, MAXDATASIZE,0) = -1) perror("recv"); return 0; bufnumbytes = "0" printf("received:%s",buf); /打印读取的数据close(sockfd); return 0; 4、运行结果为: 服务器: 客户端:5、仿真结果说明:从运行结果可以看出,首先服务器程序运行,然后用户端获取服务器的ip地址,并运行用户端程序,取得与服务器的连接,然后从服务器读取数据并打印了读取的结果。 【实验四】 1、实验内容编写针对上述三个文件的Makefile文件,完成编译过程的自动化,要求提供all、clean、rebuild、test等编译命令。2、程序代码及编译结果以toxun01、toxun01程序为例makefile:.PHONY:allall:toxun01 toxun02toxun01:toxun01.cgcc $ -o $toxun02:toxun02.cgcc $ -o $.PHONY:testtest:gcc -o test toxun01 toxun02.PHONY:cleanclean:rm toxun01 toxun02.PHONY:rebuildrebuild:make clean && make all编译结果:结论:makefile实现了多程序共同编译,为用户对程序的编译提供了方便。【实验五】 实验内容:练习各种调试工具的使用。 1、size & nm Size:显示可执行文件或目标文件的section大小。 nm:显示文件的所有符号 2、readelf:显示ELF可执行文件的详细信息。3、ldd & strip ldd:查看可执行程序依赖的库。 strip:删除可执行程序中的调试信息。4、strings:查看可执行程序中的字符串。5、objdump:显示目标文件的详细信息。 【实验六】 (提高题目) 实验内容:1、尝试实现基于TCP通信的远程程序调用,使得主机传送过去的命令,如test IP Is/home/命令,在远程主机上得到执行,并正确显示结果。(1)程序设计思想:在实验三的基础上进行修改,远程主机运行客户端程序,开始侦听等待,在接收到本地主机发送的命令之后,通过execlp()函数执行该命令。本地主机运行客户端程序,需要将服务器端程序所在主机的主机名或者IP地址作为第一个参数传递进去,连接上服务器端程序之后,向其使用者发送数据,然后退出。 (2)程序流程图如下图所示:(3)源代码及注释: /*服务器端程序,文件名aserver1.c */#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/socket.h> #include <sys/wait.h> #define MYPORT 4000 /端口号 #define BACKLOG 10#define MAXDATASIZE 100 int main(void) int sock_fd, new_fd, numbytes=123456; /sock_fd用于侦听, new_fd用于新的连接 struct sockaddr_in my_addr; /Server地址信息 struct sockaddr_in their_addr; /Client地址信息 socklen_t sin_size; char bufMAXDATASIZE+1; if (sock_fd = socket(AF_INET,SOCK_STREAM,0)=-1) perror("socket error!n"); return(0); ; /填写与服务器端有关的信息结构体 my_addr.sin_family=AF_INET; my_addr.sin_port=htons(MYPORT); my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(my_addr.sin_zero),8); /进行绑定 if (bind(sock_fd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr)=-1) perror("bind error!"); return(0); ; /侦听 if (listen(sock_fd,BACKLOG)=-1) perror("listen"); return(0); ; while(1) sin_size = sizeof(struct sockaddr_in); /接受来自客户端的连接请求 if (new_fd=accept(sock_fd,(struct sockaddr*)&their_addr,&sin_size)=-1) perror("accept"); continue; ; printf("Server: Connection from %sn",inet_ntoa(their_addr.sin_addr); if (!fork() /通过套接字描述符从客户端程序读取数据 if (numbytes=recv(new_fd,buf,MAXDATASIZE,0)=-1) perror("recv"); return(0); ; bufnumbytes+1='0'printf("Received order: %sn",buf); /执行命令 execlp(buf,buf,(char *)0); ; /关闭套接字 close(new_fd); ; while(waitpid(-1,NULL,WNOHANG)>0); return(0); /*客户端程序,文件名aclient1.c */#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #define PORT 4000 /端口号 #define MAXDATASIZE 100 int ma

    注意事项

    本文(嵌入式系统实验报告1.doc)为本站会员(asd****56)主动上传,得力文库 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知得力文库 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于得利文库 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

    © 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

    黑龙江省互联网违法和不良信息举报
    举报电话:0468-3380021 邮箱:hgswwxb@163.com  

    收起
    展开