您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 嵌入式多进程课程设计
江西理工大学应用科学学院嵌入式系统开发技术课程设计专业:电子信息工程班级:083学号:21号25号姓名:熊冰宇陈志伟设计题目:多进程程序设计2011年11月课程设计评分表姓名班级学号课设题目指导教师评分项目满分分值得分设计文档(30分)文档格式封面2页面布局4目录格式3图表质量2页眉页脚2文档内容内容完整性6内容逻辑性5内容正确性6程序代码(30分)程序功能15编程规范7编程文档8答辩(20分)课题陈述7问题答辩10是否超时3考勤(20分)20总评成绩指导教师评语签名:年月日教研室意见签名:年月日目录1设计概述...........................................................41.1设计简介.....................................................41.2设计目的......................................................11.3设计要求......................................................12设计内容...........................................................22.1编写目的......................................................22.2需求概述......................................................22.3设计概述......................................................93编写代码..........................................................144实验分析报告......................................................154.1实验结果......................................................45实验总结..........................................................176附录..............................................................211设计概述1.1设计简介嵌入式系统软件的实时性是其非常重要的特性,采用多进程设计可以提高系统的效率,增强系统的实时性,因此,掌握多进程编程,是学习嵌入式Linux必须达到的目标1.2设计目的本课程设计通过设计多进程程序,掌握创建多进程的方法,掌握通过有名管道实现进程之间的通信,掌握进程中运行现有程序的方法。“生产者消费者”问题是一个著名的同时性编程问题的集合。通过学习经典的“生产者消费者”问题的实验,读者可以进一步熟悉Linux中的多线程编程,并且掌握用信号量处理处理线程间的同步和互斥问题。1.3设计要求本课题所设计的系统要求实现以下功能。创建子进程1及子进程2。子进程1创建子进程A、B,子进程1等待子进程A、B退出后退出。子进程A、B之间通过有名管道FIFO1进行通信,实现生产者-消费者功能。子进程2创建子进程C、D,子进程C运行“ls–l”命令,子进程D通过有名管道FIFO1作为消费者与进程A通信。2设计内容2.1编写目的通过编写多进程程序,使读者熟练掌握fork()、exec()、wait()和waitpid()等函数的实用,进一步理解在Linux中多进程编程的步骤。2.2需求概述创建子进程1及子进程2。子进程1创建子进程A、B,子进程1等待子进程A、B退出后退出。子进程A、B之间通过有名管道FIFO1进行通信,实现生产者-消费者功能。子进程2创建子进程C、D,子进程C运行“ls–l”命令,子进程D通过有名管道FIFO1作为消费者与进程A通信。2.3设计概述(1)画出设计的流程图该设计的流程图如图2.3所示开始Fork()创建两个进程Fork)创建两个子进程Fork()创建两个子进程子进程1子进程2建立有名通道建立有名通道子进程A子进程B运行(调用execlp()执行“Is-1”命令)子进程C阻塞式等待子进程1的结束父进程等待1秒子进程2是否结束结束是打开有名通道初始化三个信号量创建消费者和生产者两个进程P操作(avail)生产者线程P操作(mutex)读管着V操作(full)V操作(mutex)P操作(full)写管道P操作(mutex)V操作(avail)V操作(mutex)结束消费者线程建立有名通道打开有名通道创建消费者进程子进程D消费者线程图2.3多路进程流程图3编写代码/*multi_proc.c*/#includestdio.h#includestdlib.h#includesys/types.h#includeunistd.h#includesys/wait.hintmain(void){pid_tchild1,child2,child;/*创建两个子进程*/child1=fork();/*子进程1的出错处理*/if(child1==-1){printf(Child1forkerror\n);exit(1);}elseif(child1==0)/*在子进程1中调用execlp函数*/{printf(Inchild1:execute'ls-l'\n);if(execlp(ls,ls,-l,NULL)0){printf(Child1execlperror\n);}}else/*在父进程中等待子进程2的退出*/{child2=fork();if(child2==-1)/*子进程2的出错处理*/{printf(Child2forkerror\n);exit(1);}elseif(child2==0)/*在子进程2中使其暂停5s*/{printf(Inchild2:sleepfor5secondsandthenexit\n);sleep(5);exit(0);}printf(Infatherprocess:\n);child=waitpid(child1,NULL,0);if(child==child1){printf(Getchild1exitcode\n);}else{printf(Erroroccured!\n);}do{child=waitpid(child2,NULL,WNOHANG);if(child==0){printf(Thechild2processhasnotexited!\n);sleep(1);}}while(child==0);if(child==child2){printf(Getchild2exitcode\n);}else{printf(Erroroccured!\n);}}exit(0);}/*producer-customer.c*/#includestdio.h#includestdlib.h#includeunistd.h#includefcntl.h#includepthread.h#includeerrno.h#includesemaphore.h#includesys/ipc.h#defineMYFIFOmyfifo#defineBUFFER_SIZE3/*缓冲区的单元数*/#defineUNIT_SIZE5/*每个单元的大小*/#defineRUN_TIME30/*运行时间*/#defineDELAY_TIME_LEVELS5.0/*周期的最大值*/void*producer(void*arg);void*customer(void*arg);intfd;time_tend_time;sem_tmutex,full,avail;void*producer(void*arg){intreal_write;intdelay_time=0;while(time(NULL)end_time){delay_time=(int)(rand()*DELAY_TIME_LEVELS/(RAND_MAX)/2.0)+1;sleep(delay_time);/*P操作信号量avail和mutex*/sem_wait(&avail);sem_wait(&mutex);printf(\nProducer:delay=%d\n,delay_time);/*生产者写入数据*/if((real_write=write(fd,hello,UNIT_SIZE))==-1){if(errno==EAGAIN){printf(TheFIFOhasnotbeenreadyet.Pleasetrylater\n);}}else{printf(Write%dtotheFIFO\n,real_write);}/*V操作信号量full和mutex*/sem_post(&full);sem_post(&mutex);}pthread_exit(NULL);}void*customer(void*arg){unsignedcharread_buffer[UNIT_SIZE];intreal_read;intdelay_time;while(time(NULL)end_time){delay_time=(int)(rand()*DELAY_TIME_LEVELS/(RAND_MAX))+1;sleep(delay_time);/*P操作信号量full和mutex*/sem_wait(&full);sem_wait(&mutex);memset(read_buffer,0,UNIT_SIZE);printf(\nCustomer:delay=%d\n,delay_time);if((real_read=read(fd,read_buffer,UNIT_SIZE))==-1){if(errno==EAGAIN){printf(Nodatayet\n);}}printf(Read%sfromFIFO\n,read_buffer);/*V操作信号量avail和mutex*/sem_post(&avail);sem_post(&mutex);}pthread_exit(NULL);}intmain(){pthread_tthrd_prd_id,thrd_cst_id;pthread_tmon_th_id;intret;srand(time(NULL));end_time=time(NULL)+RUN_TIME;/*创建有名管道*/if((mkfifo(MYFIFO,O_CREAT|O_EXCL)0)&&(errno!=EEXIST)){printf(Cannotcreatefifo\n);returnerrno;}/*打开管道*/fd=open(MYFIFO,O_RDWR);if(fd==-1){printf(Openfifoerror\n);returnfd;}/*初始化互斥信号量为1*/ret=sem_init(&mutex,0,1);/*初始化avail信号量为N*/ret+=sem_init(&avail,0,BUFFER_SIZE);/*初始化full信号量为0*/ret+=sem_init(&full,0,0);if(ret!=0){printf(Anysemaphoreinitializationfailed\n);returnret;}/*创建两个线程*/ret=pthread_create(&thrd_prd_id,NULL,producer,NULL);if(ret!=0){printf(Createproducerthreaderror\n);returnret;}ret=pthread_create(&th
本文标题:嵌入式多进程课程设计
链接地址:https://www.777doc.com/doc-5563125 .html