版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统课程设计Linux系统管理实践与进程通信实现班 级 网络10学 号 31006100姓 名 YHD指导老师詹永照二零一三年一月八号一、 设计内容1、 Linux系统的熟悉与常用操作命令的掌握。2、 Linux环境下进程通信的实现。(实现父母子女放水果吃水果的同步互斥问题,爸爸放苹果,女儿专等吃苹果,妈妈放橘子,儿子专等吃橘子,盘子即为缓冲区,大小为5。)二、 Linux环境介绍1、 Linux的由来与发展Linux是一种可以在PC机上执行的类似UNIX的操作系统,是一个完全免费的操作系统。1991年,芬兰学生LinuxTorvalds开发了这个操作系统的核心部分,因为是Linux改良的minix系统,故称之为Linux。2、 Linux的优点(1) Linux具备UNIX系统的全部优点Linux是一套PC版的UNIX系统,相对于Windows是一个十分稳定的系统,安全性好。(2) 良好的网络环境Linux与UNIX一样,是以网络环境为基础的操作系统,具备完整的网络功能,提供在Internet或Intranet的邮件,FTP,www等各种服务。(3) 免费的资源Linux免费的资源和公开的源代码方便了对操作系统的深入了解,给编程爱好者提供更大的发挥空间。3、 Linux的特点1) 全面的多任务,多用户和真正的32位操作系统2) 支持多种硬件,多种硬件平台3) 对应用程序使用的内存进行保护4) 按需取盘5) 共享内存页面6) 使用分页技术的虚拟内存7) 优秀的磁盘缓冲调度功能8) 动态链接共享库9) 支持伪终端设备10) 支持多个虚拟控制台11) 支持多种CPU12) 支持数字协处理器387的软件模拟13) 支持多种文件系统14) 支持POSIX的任务控制15) 软件移植性好16) 与其它UNIX系统的兼容性17) 强大的网络功能三、常用命令介绍1、目录操作和DOS相似,Linux采用树型目录管理结构,由根目录(/)开始一层层将子目录建下去,各子目录以/隔开。用户login后,工作目录的位置称为homedirectory,由系统管理员设定。‘~’符号代表自己的homedirectory,例如~/myfile是指自己home目录下myfile这个文件。Linux的通配符有三种:’*’和’?’用法与DOS相同,'-'代表区间内的任一字符,如test[0-5]即代表test0,test1, ,test5的集合。(1)显示目录文件 ls执行格式:ls[-atFlgR][name] (name可为文件或目录名称)例:ls显示出当前目录下的文件ls-a显示出包含隐藏文件的所有文件ls-t按照文件最后修改时间显示文件ls-F显示出当前目录下的文件及其类型ls-l显示目录下所有文件的许可权、拥有者、文件大小、修改时间及名称ls-lg同上ls-R显示出该目录及其子目录下的文件注:ls与其它命令搭配使用可以生出很多技巧(最简单的如〃ls-l|more"),更多用法请输入囱--help查看,其它命令的更多用法请输入命令名--help
查看。(2)建新目录mkdir执行格式:mkdirdirectory-name例:mkdirdirl (新建一名为dirl的目录)(3)删除目录rmdir执行格式: rmdir例:rmdirdirl删除目录dirl,但它必须是空目录,否则无法删除rm-rdirl删除目录dirl及其下所有文件及子目录rm-rfdirl不管是否空目录,统统删除,而且不给出提示,使用(4)改变工作目录位置时要小心cd执行格式: cd[name]例:cd改变目录位置全用户login时的workingdirectorycddirl改变目录位置,至dir1目录cd~user改变目录位置,全用户的workingdirectory执行格式: rmdir例:rmdirdirl删除目录dirl,但它必须是空目录,否则无法删除rm-rdirl删除目录dirl及其下所有文件及子目录rm-rfdirl不管是否空目录,统统删除,而且不给出提示,使用(4)改变工作目录位置时要小心cd执行格式: cd[name]例:cd改变目录位置全用户login时的workingdirectorycddirl改变目录位置,至dir1目录cd~user改变目录位置,全用户的workingdirectorycd改变目录位置,至当前目录的上层目录cd/user改变目录位置,至上一级目录下的user目录cd/dir-name1/dir-name2改变目录位置,至绝对路径(Fullpath)cd(5)显示当前所在目录回到进入当前目录前的上一个目录pwd执行格式: pwd(6)查看目录大小du执行格式:du[-s]directory例:dudirl显示目录执行格式:du[-s]directory例:dudirl显示目录dirl及其子目录容量(以kb为单位)du-sdirl显示目录dirl的总容量(7)显示环境变量echo$HOME显示家目录echo$HOME显示家目录echo$PATH显示可执行文件搜索路径echo$PATH显示可执行文件搜索路径env显示所有环境变量(可能很多,最好用"env|more”,"env|grepenvPATH〃等)(8)修改环境变量,在bash下用export,如:exportPATH=$PATH:/usr/local/bin想知道export的具体用法,可以用shell的help命令:helpexport2、文件操作(1)查看文件(可以是二进制的)内容 cat执行格式:catfilename或morefilename或catfilename|more例:catfile1 以连续显示方式,查看文件file1的内容morefile1或catfile1|more以分页方式查看文件的内容(2)删除文件rm执行格式:rmfilename例:rm file?rmf*(3)复制文件cp执行格式:cp[-r]sourcedestination例: cpfile1file2将file1复制成file2cpfile1dir1将file1复制到目录dir1cp/tmp/file1将file1复制到当前目录cp/tmp/file1file2将file1复制到当前目录名为file2cp-rdir1dir2(recursivecopy)复制整个目录。(4)移动或更改文件、目录名称 mv执行格式:mvsourcedestination例: mvfile1file2将文件file1,更名为file2mvfile1dir1将文件file1,移到目录dir1下mvdir1dir2(5)比较文件(可以是二进制的)或目录的内容 diff执行格式:diff[-r]name1name2(name1、name2同为文件或目录)例:difffile1file2 比较file1与file2的不同处diff-rdir1dir2比较dir1与dir2的不同处(6) 文件中字符串的查找grep
执行格式:grepstringfile执行格式:grepstringfile例:grepabcfilel 查找并列出串abc所在的整行文字文件或命令的路径寻找执行格式一:whereiscommand显示命令的路径执行格式二:whichcommand 显示路径及使用者所定义的别名执行格式三:whatiscommand显示命令的功能摘要执行格式四:findsearch-path-namefilename-print搜寻指定路径下某文件的路径执行格式五:locatefilename根据系统预先生成的文件/目录数据库(/var/lib/slocate/slocate.db)查找匹配的文件/目录,查找速度很快,如果有刚进行的文件改变而系统未到执行定时更新数据库的时间,可以打入updatedb命令手动更新。建立文件或目录的链接 ln例:lnsourcetarget1建立source文件(已存在)的硬链接,命名为target1ln-ssourcetarget2建立source文件的符号链接,命名为target2以下是几个常用命令操作的截图:
四、设计思想当计算机中两个或多个进程在执行时需要使用公用缓冲区,并且对该缓冲区采取了互斥措施。这时如果并发执行这些进程就会造成CPU的极大浪费,这是操作系统设计要求不允许的。而这种现象在操作系统和用户进程中大量存在。因此为了解决这一问题,提出了同步的概念,即把异步环境下的一组并发进程,因直接制约而互相发送消息、互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步。在本次设计中,爸爸与妈妈、儿子与女儿的进程操作是互斥的,但是爸爸与女儿、妈妈与儿子进程之间的操作是同步的。因此要利用进程同步的方法来实现这几者之间的操作,当然其中也包含着互斥进程,因为盘子每次只能放入或取出一个水果。程序设计中有如下四个进程:father(),mother(),daughter。,son()。五、数据结构1、 信号量semid_mutex作为进程的公有信号量,其初始值为1,可以实现进程间的互斥,同时可以表示当前状态下盘子里可以放几个水果,实现进程间的同步。2、 信号量semid_full1为进程father()与daughter。的私有信号量,初值为0,表示当前盘子里苹果的数目。3、 信号量semid_full2为进程mother()与son()的私有信号量,初值为0,表示当前盘子里橘子的数目。六、设计流程爸爸放苹果流程图:妈妈放橘子流程图:儿子吃橘子流程图:女儿吃苹果流程图:七、源代码#include<unistd.h>#include<stdlib.h>#include<stdio.h>#include<time.h>#include<sys/wait.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>#include<sys/sem.h>#include<errno.h>#include<signal.h>#include<string.h>#defineSHMKEY9090/*共享存储区的键*/#defineSEMKEY_EMPTY9091#defineSEMKEY_MUTEX9092#defineSEMKEY_FULL19093#defineSEMKEY_FULL29094/*信号量数组的键*//*注意:上面的键在系统中必须唯一*/#defineBUFF_LEN早*缓冲区可以存放10个产品*/#definePRODUCT_LEN1/*每个产品是一个字符串:<=32字符*/voidset_sembuf_struct(structsembuf*sem,intsemnum,intsemop,intsemflg)/*设置信号量结构*/sem->sem_num=semnum;sem->sem_op=semop;sem->sem_flg=semflg;}intbegin(){char*addr,end;intshmid;intsemid_empty,semid_full1,semid_full2,semid_mutex;structsembufsem_tmp;/*开辟共享存储区*/if((shmid=shmget(SHMKEYBUFF_LEN*PRODUCT_LEN+3,0777|IPC_CREAT|IPC_EXCL))==-1){if(errno==EEXIST){printf("TheBufferHasExisted!\n");printf("DoYouWantToDeleteTheBuffer(Y=yes)?\n====:");scanf("%c",&end);if(end=='y'||end=='Y'){/*共享存储区、信号量并不随程序的结束而被删除如果我们没删除的话,可以用ipcs命令查看,用ipcrm删除*//*释放缓冲区*/shmid=shmget(SHMKEYBUFF_LEN*PRODUCT_LEN+3,0777);if(shmctl(shmid,IPC_RMID,0)<0)perror("shmctl:falsed");/*同时释放信号量*/semid_mutex=semget(SEMKEY_MUTEX,1,0777);/*获取全局信号量id*/semid_empty=semget(SEMKEY_EMPTY1,0777);semid_full1=semget(SEMKEY_FULL1,1,0777);semid_full2=semget(SEMKEY_FULL2,1,0777);semctl(semid_mutex,0,IPC_RMID);semctl(semid_empty,0,IPC_RMID);semctl(semid_full1,0,IPC_RMID);semctl(semid_full2,0,IPC_RMID);}}elseprintf("FailToCreateBuffer!\n");return-1;}addr=(char*)shmat(shmid,0,0);/*连接缓冲区*/memset(addr,0,BUFF_LEN*PRODUCT_LEN+3); 〃初始化存储区为0shmdt(addr);/*离开缓冲区*//*创建3个信号量:1个用于对缓冲区互斥,2个用于生产者、消费者同步*/if((semid_mutex=semget(SEMKEY_MUTEX,1,0777|IPC_CREAT|IPC_EXCL))==-1){if(errno==EEXIST)printf("TheSEMKEY_MUTEXHasExisted!\n");elseprintf("FailToCreateSEMKEY_MUTEX!\n");return-1;}if((semid_empty=semget(SEMKEY_EMPTY1,0777|IPC_CREAT|IPC_EXCL))==-1){if(errno==EEXIST)printf("TheSEMKEY_EMPTYHasExisted!\n");elseprintf("FailToCreateSEMKEY_EMPTY!\n");return-1;}if((semid_full1=semget(SEMKEY_FULL1,1,0777|IPC_CREAT|IPC_EXCL))==-1){if(errno==EEXIST)printf("TheSEM_FULL1HasExisted!\n");elseprintf("FailToCreateSEM_FULL1!\n");return-1;}if((semid_full2=semget(SEMKEY_FULL2,1,0777|IPC_CREAT|IPC_EXCL))==-1){if(errno==EEXIST)printf("TheSEM_FULL2HasExisted!\n");elseprintf("FailToCreateSEM_FULL2!\n");return-1;}/*给信号量赋初值*/set_sembuf_struct(&sem_tmp,0,BUFF_LEN,0);/*BUFF_LEN*/semop(semid_empty,&sem_tmp,1);set_sembuf_struct(&sem_tmp,0,0,0);/*0*/semop(semid_full1,&sem_tmp,1);set_sembuf_struct(&sem_tmp,0,0,0);/*0*/semop(semid_full2,&sem_tmp,1);set_sembuf_struct(&sem_tmp,0,1,0);/*1*/semop(semid_mutex,&sem_tmp,1);return0;}/*下面的P,V是对系统调用的简单封装*/intP(intsemid){structsembufp_buf;p_buf.sem_num=0;p_buf.sem_op=-1;p_buf.sem_flg=0;if(semop(semid,&p_buf,1)==-1)/*semop参见课件ppt*/{perror("p(semid)falsed");exit(1);}elsereturn0;}intV(intsemid){structsembufv_buf;/*struct参见课件ppt*/v_buf.sem_num=0;v_buf.sem_op=1;v_buf.sem_flg=0;if(semop(semid,&v_buf,1)==-1){perror("v(semid)failed");exit(1);}elsereturn0;}intfather()intsemid_empty,semid_full1,semid_full2,semid_mutex;/*信号量集合id*/intrc1,rc2,rc3;semid_mutex=semget(SEMKEY_MUTEX,1,0777);/*获取全局信号量id*/semid_empty=semget(SEMKEY_EMPTY1,0777);semid_full1=semget(SEMKEY_FULL1,1,0777);semid_full2=semget(SEMKEY_FULL2,1,0777);rc1=semctl(semid_empty,0,GETVAL);rc2=semctl(semid_mutex,0,GETVAL);if(rc1==0){return1; 〃不能放具U等待}if(rc2==0){return1;}P(semid_empty);/*对私有信号量作P操作*/P(semid_mutex);printf("thereis%dplacestoputapples\n",rc1);printf("PUTANAPLLE\n");V(semid_mutex);V(semid_full1);rc3=semctl(semid_full1,0,GETVAL);printf("daughtercanget%dapples\n",rc3);return0;}intmother(){intsemid_empty,semid_full1,semid_full2,semid_mutex;/*信号量集合id*/intrc1,rc2,rc3;semid_mutex=semget(SEMKEY_MUTEX,1,0777);/*获取全局信号量id*/semid_empty=semget(SEMKEY_EMPTY1,0777);semid_full1=semget(SEMKEY_FULL1,1,0777);semid_full2=semget(SEMKEY_FULL2,1,0777);rc1=semctl(semid_empty,0,GETVAL);rc2=semctl(semid_mutex,0,GETVAL);if(rc1==0){return1;//不能放U等待return1;}elseif(rc2==0){return1;}P(semid_empty);/*对私有信号量作P操作*/P(semid_mutex);printf("thereis%dplacestoputoranges\n",rc1);printf("PUTANORANGE!!!\n");V(semid_mutex);V(semid_full2);rc3=semctl(semid_full2,0,GETVAL);printf("soncanget%doranges\n",rc3);return0;}intson(){intsemid_empty,semid_full1,semid_full2,semid_mutex;/*信号量集合id*/intrc1,rc2;semid_mutex=semget(SEMKEY_MUTEX,1,0777);/*获取全局信号量id*/semid_empty=semget(SEMKEY_EMPTY1,0777);semid_full1=semget(SEMKEY_FULL1,1,0777);semid_full2=semget(SEMKEY_FULL2,1,0777);rc2=semctl(semid_full1,0,GETVAL);rc1=semctl(semid_full2,0,GETVAL);if(rc1==0){return1; 〃不能放具U等待}P(semid_full2);/*对私有信号量作P操作*/P(semid_mutex);printf("SUM:%dapplesand%doranges\n",rc2,rc1);printf("thereis%dorangestoget\n",rc1);printf("GETANORANGE!!!\n");V(semid_empty);V(semid_mutex);return0;}intdaughter(){intsemid_empty,semid_full1,semid_full2,semid_mutex;/*信号量集合id*/intrc1,rc2,rc3;semid_mutex=semget(SEMKEY_MUTEX,1,0777);/*获取全局信号量id*/semid_empty=semget(SEMKEY_EMPTY1,0777);semid_full1=semget(SEMKEY_FULL1,1,0777);semid_full2=semget(SEMKEY_FULL2,1,0777);rc2=semctl(semid_full1,0,GETVAL);rc1=semctl(semid_full2,0,GETVAL);if(rc2==0){return1; 〃不能放具U等待}P(semid_full1);P(semid_mutex);printf("SUM:%dapplesand%doranges\n",rc2,rc1);printf("thereis%dapplestoget\n",rc2);printf("GETANAPPLE\n");V(semid_empty);V(semid_mutex);return0;}intmain(){intpid;inti=0,x;begin();pid=fork();if(fork()==0){father();}if(fork()==0){mother();}if(fork()==0){daughter();}if(fork()==0){son();return0;}八、调试与运行首先,利用g++ks.cpp编译一次,若有错误,则根据错误提示对程序进行修改。其次,编译通过后执行./a.out,若原先已有共享缓冲区,则删除原先缓冲区,再创建新的共享缓冲区.,然后再次执行./a.out,观察系统进程调度。运行结果如下:.nyhd^yhd:*yhd^yhd:-*S./a.outTheBufferHasExisted!DoYouwantToDeleteTheBuffer(Y=yes)?p(sentd)falsed:Invalidargunentp(senid)falsed:Invalidargunentyhdgyhd:-$p{semtd}falsed:Invalidargumentp(sentd)falsed:invalidargumentp(semtd)falsed:Invalidargumentp(senld)falsed:Invalidargumentp(semid)falsed:Invalidargumentp(sentd)falsed:Invaltdargumentyhd§yhd:-5.ya.outfather:thereLs5placestoputappletfather:PUTANAPLLEfatheridaughtercanget1applesmother:thereIs4placestoputorangesmother:PUTANORANGEHImother:$ancanget1orangesyhd^yhd:-5daughter:thereIs1applestogetdaughter:GETANAPPLEson:thereis1orangestogetson:GETAMORAFIGEI!1yhd^yhd:-$./a.outfather:thereisSplacestoputapplesfathertPUTANAPLLEfather:daughtercanget1applesmother:therets4placestoputmother:PUTANORANGE111mother:soncanget1orangesyhd@yhd:~$daughterrthereis1daughteryhd^yhd:-$./a.outfather:thereisSplacestoputapplesfathertPUTANAPLLEfather:daughtercanget1applesmother:therets4placestoputmother:PUTANORANGE111mother:soncanget1orangesyhd@yhd:~$daughterrthereis1daughter:CETMAPPLEson:thereis1orangestogetson:CETANORANGEJ!Imother:theretsSplacestoputrtQther:PUTANORANGE!t1nother:sontenget1orangesson:thereis1orangestogetson:CETANORANGEJ!Imother:theretsSplacestoputmother:PUTANQRANCEl!1mot
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 磨面机产品供应链分析
- 2024年黄山市屯溪区人民医院招聘专业技术人员4人笔试模拟试题及答案解析
- 行业内保安服务标准的探索与制定计划
- 行业发展战略开展技术交流合作计划
- 旅游地产开发合作协议三篇
- 水务行业的数字经济应用计划
- 新学年教学工作目标计划
- 第三方财产保护协议书范文
- 传统电能质量分析与改善措施
- 离婚协议书范文无财产2022标准版
- 医疗设备维保服务售后服务方案
- 护理人体美第四章
- 专业技术职务任职资格评审表
- 中国天眼完整版本
- 小班故事活动《龟兔赛跑》课件
- 税务会计学(第14版)课件:出口货物免退税会计
- 机器人社团考试试卷附有答案
- 高速铁路客运服务职业生涯规划
- T-CHAS 10-1-4-2022 中国医院质量安全管理 第1-4部分:总则标准通用术语
- 医疗器械培训试题及答案
- 第七章 水利工程管理法规讲解
评论
0/150
提交评论