嵌入式系统实验报告1.doc
《嵌入式系统实验报告1.doc》由会员分享,可在线阅读,更多相关《嵌入式系统实验报告1.doc(24页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、LINUX操作实验报告一 实验要求:1、程序设计思想要阐述清楚;2、要有流程图和源代码及注释;3、要有仿真结果及说明。【实验一】内容与目的:编写fork/vfork的测试程序,验证二者的区别1、程序设计思想fork/vfork为进程创建操作,为实现以上目的,可以在程序中设置等待,根据打印输出信息,验证父进程与子进程在执行顺序上的差别;在父进程中设置测试使用变量,分别在子进程中对变量进行修改,并打印输出,可以观察子进程对变量的修改是否会影响父进程中变量的取值,进而可以观察父进程与子进程是否数据空间及堆、栈等。2、流程图、源代码及注释Fork01bFork01aPid=vfork()Pid=for
2、k() =00 00进程错误等待等待进程错误等待等待父进程子进程父进程子进程变量自加变量自加退出返回退出Fork01a程序代码及注释如下:#include #include #include #include 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)
3、/如果处于子进程,显示所处进程,并修改各变量 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 #include #include #include int global=1; /设定参数初始值 int main(voi
4、d) 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
5、processn); printf(pid=%d,global=%d,var=%dn,getpid(),global,var); exit(0); 运行结果如下:Fork01b程序代码及注释如下:#include#include#include#includeint 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 er
6、rorn); 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+;
7、printf(pid=%d,global=%d,var=%dn,getpid(),global,var); printf(parent process endedn); exit(0); 运行结果如下:若变换等待时间如下:#include#include#include#includeint 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,报错 pr
8、intf(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); glo
9、bal+; 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,信号
10、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的进程号,然后通过ki
11、ll函数向此进程发送信号2,使fifo1建立管道,fifo2执行操作命名管道,最后向fifo1发送信号1使其退出,然后fifo2退出。3、流程图、源代码及注释Fifo02Fifo01获取1的进程号信号与子函数绑定发送信号2选择switch打开管道读取数据错误信号2信号1关闭管道返回结束结束删除管道关闭管道及打开文件向管道中写入文件打开管道及待读文件退出建立管道发送信号1打印输出Fifo01:#include#include#include#include#include#include#include#include void sighdlr(int signum); int main() s
12、ignal(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_WRONL
13、Y);/打开命名管道 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#include#include#include#include#include#include#include#def
14、ine MAX 150 int main(int argc,char* argv) if(argc2) 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);/打开命名管道 me
15、mset(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节
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 实验 报告
限制150内