linu操作系统课程设计报告书_第1页
linu操作系统课程设计报告书_第2页
linu操作系统课程设计报告书_第3页
linu操作系统课程设计报告书_第4页
linu操作系统课程设计报告书_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

题目]进程软中断通信1题目的主要研究内容及预期达到的目标实现进程的软中断通信:父进程发信号控制子程序的终止。1.21.2题目研究的工作基础或实验条件硬件环境:Linux平台。软件环境:标准C语言。1.3设计思想系统调用fork()创建两个子进程,再调用signal()让父进程捕捉键盘上的中断信号(即按Ctrl+C键);当捕捉到中断信号后,父进程调用KillO向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:ChildProcess1isKilledbyParent!ChildProcess2isKilledbyParent!父进程等待两个子进程终止后,输出如下的信息后终止:ParentProcessisKilled!1.4流程图

5主要程序代码5主要程序代码#mcludeHstdio.hH#mcludeHimistd.hn#includeMsignal.hM#iiichide”sys/types・h”#mcludeHstdlib.hMmtk=0;iiitpl,p2;//pid_tchild1=0,child2=0;voidfiinc_fatlier(intsig)//父进程信号处理函数;{〃传送参数sig指定的信号给参数pid指定的进程;返回值:0:成功;-1:岀错;〃信号宏名:SIGUSR1,用户定义信号1,信号值:10,默认动作:终止进程;kill(pl,SIGUSRl);kill(p2,SIGUSR2);}voidfiinc_p1(iiitsig)//子进程p1信号处理函数:{ k=l;//标志相应SIGUSR1消息结束;}voidhmc_p2(mtsig)//子进程p2信号处理函数:{ k=l;//标志相应SIGUSR2消息结束;}mtmain(){while((pl=forkQ)=-1);//fork()=-1创建子进程失败;if(pl>0)//父进程继续创建子进程p2:{while((p2=fork())==-1);if(p2>0)//父进程{//设置信号处理方式,依照参数signum指定的信号编号设置处理函数://指定信号到达时跳转到参数handler指定的函数执行;//返回值:成功:返回先前信号处理函数指针:出错:SIG_ERR(-1);signal(SIGINT,func_father);wait(0);〃等待子进程1结束wait(0);〃等待子进程2结束priiitf("Parentprocessiskilledexit(0);else//子进程p2{signal(SIGINT,SIG_IGN);//忽略本应给父进程的按键中断;signal(SIGUSR2.fiinc_p2);H接收父进程的消息后转到处理函数:k=0;wlule(k==0); //等待子进程2收到父进程的消息后置k=lpriiitf("ChildProcess2isKilledbyParentexit(0);}}else//子进程pl

signal(SIGINTSIG_IGN);//忽略本应给父进程的按键中断:signal(SIGUSR1,fiinc_pl);//接收父进程的消息后转到处理函数;k=0;while(k=0); //等待子进程1收到父进程的消息后置k=lpriiitf("ChildProcess1isKilledbyPaient!\iiH);exit(0);}return0;}1.6运行结果及分析root@localhost:~/Desktoproot@localhost:~/Desktop文件(E)编辑®查看也终端(D标签⑧[root^localhosl[root&localhost[root^localhostChiIdProcess1ChildProcess2文件(E)编辑®查看也终端(D标签⑧[root^localhosl[root&localhost[root^localhostChiIdProcess1ChildProcess2cdDesktopDesktop]#gcc1.c~oDesktop]??./IisKilledbyParent!isKilledbyParent!Parentprocessiskilied![root<&localhostDesktopjrr「当按下Cui十C后,产生消息响应。1.7心得体会通过本次实验,掌握了如何创建进程以及进程的软中断。目2目2进程的管道通信1题目的主要研究内容及预期达到的目标实现进程的管道通信。2.2题目研究的工作基础或实验条件硬件环境:Linux平台。软件环境:标准C语言。2.3设计思想使用系统调用pipe()建立一条管道线;两个子进程P1和P2分别向管道各写一句话:MessagefromChild1!MessagefromChild2!父进程从管道中读出來自于两个子进程的信息,显示在屏幕上。要求父进程先接收子进程P1的消息,再接收子进程P2的消息。2.4流程图2.5主要程序代码#include<uiiistd.h>#include<signal.h>#include<stdio.h>mtpidl,pid2;//pid_tpidl.pid2;niain(){mtfd[2];〃打开文件的文件描述符数组fd[O]读,fd⑴写;chai'outpipe[100],mpipe[100];pipe(fd);〃先创建管道,再创建子进程while((pidl=fork())=-1);//fork()=-1创建子进程失败if(pidl=0)//Cluldl{lockf(fd[l],l,0);〃建立互斥文件锁sprintf(outpipe."MessagefromCluld1!");H把串放入数组outpipe中write(f<d[l],outpipe,50);//把outpipe所指内存写入50个字节到闵[1]的文件:sleep(5); /*自我阻塞5秒*/lockf(fd[l],0,0);//解除互斥文件锁exit(0);}else//pidl>0

xvliile((pid2=fork())=-1);if(pid2==0)//Cluld2{lockf(fd[l]丄0);产互斥*/sprintf(outpipe/*MessagefiomChild2!”);write(fd[l],outpipe,50);sleep(5);lockf(fd[l],0,0);exit(0);}else//pidl>0&&pid2>0,父进程{wait(0); /*同步*/read(fd[O].inpipe,50); /*从管道中读长为50字节的串*/prmtf("%s\n”,iiipipe);wait(0);read(fd[O],mpipe,50);prmtf("%s\n”,iiipipe);exit(0);}}}1.6运行结果及分析root@localhost:M/DeslctopTUjfp"1>T'文件(E)编辑©查看也终端(D标签⑧帮助®|root^localhost[roolocalhost[root^localhostChiIdProcess1ChildProcess|root^localhost[roolocalhost[root^localhostChiIdProcess1ChildProcess2cdDesktopDesktop]#Desktop]1?isKilledisKilledgcc1.c~o1./IbyParent!byParent!Parentprocessiskilled![root^localhostDesktop]寻2.C2In2.c:21:Parentprocessiskilled![root^localhostDesktop]寻2.C2In2.c:21:2.c:33:2.c:43:g:cc2.cfunctionmail/:警告;隐式声明与内建函数警告:隐式声明与内建函数警告:隐式声明与内建画数-O2exit'不靠容exit^不叢容不兼容[roolocalhostDesktop]#./2MessagefromChild1!MessagefromChiId2![roota-localhostDesktop]#[父进程先接收子进程1的消息再接受子进程2的消息,并打印。1.7心得体会通过本次实验,掌握了如何创建管道以及利用管道方式进程间通信。【目3进程间通信设计3.1目的主要研究内容及预期达到的目标3.1目的主要研究内容及预期达到的目标利用消息队列实现进程间的通信。3・2题目研究的工作基础或实验条件硬件环境:Linux平台。软件环境:标准C语言。3・3设计思想使用系统调用msgget(),msgsnd(),msgrev()及msgct1()编制一长度为512B的消息的发送和接收程序。3・4流程图

向缓冲区中输入1K的字符串消息 清空接收缓冲区Vr用msgsnd函数发送消息到消息队列用msgrcv函数接收消息队列中消息用ftok函数建立IPC通信需要的ID值用ftok函数建立IPC通信需要的ID值用msgget函队列并返数创建消息回标识符发送端接收端用ftok函数返回IPC通信

需要的ID值用msgget函数返回队列标识符3・5主要程序代码发送方主要代码:mtmain(bitargc,char**argx-){iiitnisqid;stmctnisgbufbuf;mtflag;〃发送消息返回值0:成功;mtkey;//创建IPC通讯ftok出的键值;mtsendlength;//发送消息的大小,不含消息类型long占用的4个字节;key=ftok(”msg.tmp",0x01);H返回系统建立IPC通讯时需要的ID值;if(key<0){penor(nftokkeyenorH);return-1;}nisqid=msgget(key,0600|IPC_CREAT);〃创建队列对象并返回标识符:if(msqid<0){penor(ncreatemessagequeueenorH);return-1;}buf.mtype=1;strcpy(buf.mtext,HThisisatestofInter-ProgressComiumationwinchmadebyShiZhongvuwhomajorsillComputingScienceandTechnology,InformationScienceandEngmeermgSchool,ShenYangUiiiveisityofTechnology.");sendlength=sizeof(stiuctmsgbuf)-sizeof(long);flag=nisgsnd(nisqid,&buf,sendlength.0);//将消息写入到消息列队:if(flag<0)penor(nsendmessageeirorH);return-1;}system("ipcs-q");//创建子进程执行命令:显示消息队列:return0;}接收方主要代码:mtmain(mtargc,char**arg\-){iiitnisqid;structnisqid_dsinfo;sti-uctnisgbufbufl;iiitflag;mtrecvlength;iiitkey;mtmtype;key=ftok(”msg.tmp”.0x01);〃返回系统建立IPC通讯时需要的ID值;if(key<0){penor(HftokkeyenoiH);return-1;}nisqid=msgget(key,0);//返回队列标识符:if(msqid<0){penor("getipc_idenorH);return-1;}recvlengtli=sizeof(stmctmsgbuf)-sizeof(long);//接收消息的人小;memset(&bufl,0x00.sizeof(stiuctmsgbuf));〃清空bufl结构体;mtype=1;//mtype>0:接收类型等于发送消息类型的第一个消息;//从标识符msqid的队列读取消息存于msgp,再删除队列中消息:flag=msgicv(nisqid,&bufl,recvlengthjutvpe,0);if(flag<0){penor(Hiecvmessageerror\iiH);return-1;}prmtfmessage:%s\n",bufl.mtext);system("ipcs-q");〃创建子进程执行命令:显示消息队列;return0;}3・6运行结果及分析

文件(E)编辑的査看切粪端①标签®帮助®[root^localhostDesktop]^?gcc31.c-o31[root&loca1hostDesktop]??./31MessageQueuesused-bytes512messages1key msqid0x0100f20c0ownerrootE>ernis600[rootwlocalhostDesktop]??gcc32.c-o32[rootfrloca1hostDesktop]??./32iwessage页ThisisatestofInter-ProgressConnumationwhichmadebyShiZhongyuwhomajorsinComputingScienceandTechnology.InformatiomScienceandEngineeringSchool<ShenYangLniversityofTechnology・ MessageQueues—key msqidoimerpermsused-bytesmessages三0^0100f20c0root60000先发送消息到已存在的文件msg.tmp,读取消息后自动删除消息。再利用ipcrm-q294912(msqid)删除该消息队列。3.7心得体会通过本次实验,掌握了如何创建消息队列进行进程间通信。题目4利用多进程实现生产者消费者问题4.1题目的主要研究内容及预期达到的目标利用多进程实现生产者消费者问题。4.24.2题目研究的工作基础或实验条件硬件环境:Linux平台。软件环境:标准C语言。4.3设计思想创建两个子进程;一个子进程(生产者进程)依次向缓冲区写入整数0,1,2,...,9;另一个子进程(消费者进程)暂停5s后,从缓冲区读数,每次读一个,并将读出的数字从缓冲区删除,然后将数字显示出来;父进程等待子进程2(消费者进程)的退出信息,待收集到该信息后,父进程就返回。4.4流程图3・5主要程序代码mtniain(void){iiiti=0;iiit*nCount;mtfd[2];H打开文件描述符数组fd[O]读fd[l]写;chaiszBuff[ll]={0};iiitstatus;pipe(pfd);//先创建管道,再创建子进程while((pidl=fork())=-1);//folkQ=-1创建子进程失败;if(pidl==0)//Cluldl,生产者进程{nCount=(iiit*)(inalloc(sizeof(int)*10));//分配40个字节的内存块;for(i=0;i<10;++i)nCountfi]=i;spriiitf(szEuff,”%s%cT,szBuff,nCount[i]);//向szBuff中写入“Oi”;

write(fti[l],szBuff,strlen(szBuff));//把szBuff所指的内存到fd[l]的文件;free(nCount); //释放内存块:close(fd[O]); close(fd[lj);}else//pidl>0{wliile((pid2=fork())==」);if(pid2==0)〃Child2,消费者进程{sleep(5);read(fd[O],szBuff,10);//把闵[0]的文件传送到szBuff指向的内存中;pnntfC%sM;szBuff);close(fd[O]); close(fd[l]);}else//pidl>0&&pid2>0,父进程{pid1=wait(&stams);//wait(0);/*同步*7i=WEXITSTATUS(status);priiitf("child1is%d,exitstatus=%d\n”,pidl,i);pid2=wait(&status);i=WEXITSTATUS(status);priiitf(Hchild2is%d.exitstaais=%d\n”,pid2.i);}}close(fd[O]);close(fd[lj);leturn0;}4.6运行结果及分析文件®编辑©查看也终端①様签⑧;root^localhost'root^localhostchild!is1905401234567S9child?is19055[root^localhostDesktopJ1root^localhost'root^localhostchild!is1905401234567S9child?is19055[root^localhostDesktopJ1?gcc4・c-o4Desktoptstatus=0tstatus=0Desktop]^[生产者进程依次想缓冲区写入o〜9,消费者进程暂停5秒后从缓冲区读数,读一个删一个。然后将数字显示出来,并打印子进程号。4・7心得体会通过本次实验,掌握了如何创建消息队列进行模拟生产者消费者问题。总结通过本次操作系统课程设计,掌握了Linux平台下的相关进程通信的知识。以下是自己通过查阅相关文献整理的Linux系统编程的部分学习笔记。进程间通信类型有:管道、信号、消息队列等。进程间通信的目的:数据传输、共享数据、通知事件、资源共享、进程控制。管道是将两个file结构指向同一临时VFS索引节点,VFS索引节点指向同一物理页的一种通信方式;适用于输入、输出数据量特别大时的父子进程间通信IPC机制;所有进程完成管道操作后,索引节点被丢弃,共享数据页被释放。通常先用pipe函数创建一个管道,再通过fork函数创建一个子进程。信号的发生由两类事件引起:硬件原因,如在终端上按DELETE键产生中断信号SIGINT:软件原因,如kill、raise、alarm、setitmier等系统函数,除0的非法运算也会引起信号发送。进程能对每个信号设置独立的处理方式:能忽略信号;也能设置其处理程序(称捕捉),或对信号不做处理,执行系统默认动作;进程能通过信号集操作函数设置对信号的阻塞(block)标志;信号被设置为阻塞后发生时,和正常的信号一样被传送(delwei)给进程,但只有进程解除其的阻塞才会被处理。即信号被阻塞后,进程不能阻止其的发生,仅阻止其不能被处理;从信号被传递给进程到其得到处理的时间间隔称信号挂起、未决或被搁置。SIGSTOP和SIGKILL信号不能被捕捉、忽略、阻塞,保证了系统管理员在任何时候都能暂停信号和杀死信号接收某个进程。信号分为可靠(信号值在32〜63,支持排队)和不可靠信号(信号值小于32,不支持排队)。信号的操作方式有:忽略信号、捕捉信号和系统默认动作。消息是在内核地址空间的一个内部链表,每个队列都有唯一的标识号。创建消息队列时,内核创建、存储及维护着msqid_ds结构的一个实例。消息队列函数:msgget、msgctRmsgsnd、msgicvo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论