《Linux操作系统》期末作业学生学号:20124678学生姓名:莫显桃所在班级:12信管1班实验1Shell编程【实验内容】1、在/home目录中创建10个目录,目录名称依次为cat1……cat10;2、编写一个shell脚本,从键盘读入10个数,显示最大值和最小值;3、编写一个脚本,输入自己的生日(yyyymmdd),计算还有多少天多少个小时是自己的生日。【实验原理】1、在编写Shell时,第一行一定要指明系统需要哪种Shell解释用户的shell程序,如#!bin/sh,#!bin/bash。2、Shell里有特殊字符,如程序中的“$”和引号。“$”表示变量替换,即用其后指定的变量的值来代替变量。双引号括起来的字符除$、倒引号(`)和反斜线(\)仍保留其特殊功能外,其余字符均作为普通字符对待。倒引号括起来的字符串被Shell解释为命令行,在执行时,Shell会先执行该命令行,并以它的标准输出结果取代整个倒引号部分。3、如果要在屏幕上显示字符、字符串或变量的内容,使用echo或print命令。4、mkdir命令用来创建指定的名称的目录,gt是数字之间的比较【程序清单】1、在/home目录中创建10个目录,目录名称依次为cat1……cat10。[root@localhostroot]#geditFtest1#!bin/bashforiin`seq10`;domkdir/home/cat$i;done[root@localhostroot]#bashFtest1【运行结果】【程序清单】2、编写一个shell脚本,从键盘读入10个数,显示最大值和最小值。[root@localhostroot]#geditFtest2.sh#!/bin/bashprintfEnter10number:foriin`seq09`;doreadvalue[$i]doneforiin`seq19`;doforjin`seq0$[9-$i]`;doif[$[value[$j]]-gt$[value[$[$j+1]]]];thent=$[value[$j]]value[$j]=$[value[$[$j+1]]]value[$j+1]=$[t]fidonedoneechoBiggestnumber:$[value[9]]echoSmallestnumber:$[value[0]][root@localhostroot]#bashFtest2.sh【运行结果】Enter10number:11121314151617181920Biggestnumber:20Smallestnumber:11【程序清单】3、编写一个脚本,输入自己的生日(yyyymmdd),计算还有多少天多少个小时是自己的生日。[root@localhostroot]#geditFtest3.sh#!bin/bashread-pInputyourbirthday(YYYYmmdd):Datem=`date--date=$Date+%m`#得到生日的月d=`date--date=$Date+%d`#得到生日的日date_now=`date+%s`#得到当前时间的秒值y=`date+%Y`#得到当前时间的年birth=`date--date=$y$m$d+%s`#得到今年的生日日期的秒值internal=$(($birth-$date_now))#计算今日到生日日期的间隔时间if[$internal-lt0];#判断今天的生日是否已过thenbirth=`date--date=$(($y+1))$m$d+%s`internal=$(($birth-$date_now))#计算今天到下一个生日的间隔时间fiAwk-vinternal=$internal'BEGIN{d=int(internal/60/60/24);h=int((internal-24*60*60*d)/3600);printThereis:ddayshhours.}'[root@localhostroot]#bashFtest3.sh【运行结果】Inputyourbirthday(YYYYmmdd):19951127Thereis:338days4hours.实验2Linux进程间通信【实验内容】1、编写一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill()分别向两个子进程发出数值为16和17的软中断信号,子进程捕捉到相应软中断信号后,分别输出下列信息后终止:Childprocess1iskilledbyparent!Childprocess2iskilledbyparent!父进程等待两个子进程终止后,输出以下信息后终止:Parentprocessiskilled!2、使用系统调用pipe()建立一条管道线,两个子进程分别向管道各写一句话:Childprocess1issendingamessage!Childprocess2issendingamessage!而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上;要求:父进程先接收子进程1发来的消息,然后在接收子进程2发来的消息。【实验原理】1、创建一个进程的系统调用是fork()函数,创建进程采用的方法是克隆,即用父进程复制一个子进程。2、进程的终止的方式有两种,以下程序中调用exit()函数来结束程序,我们称其为正常终止。3、kill()系统调用,向一个进程发信号,常用于终止进程的运行。4、wait()系统调用,用来控制父进程和子进程的同步,在父进程调用wait()函数来阻塞父进程,进入等待队列,等待子进程结束。5、程序中的getpid()是一个系统调用,它返回本进程的进程标识号PID。6、signal()函数,调用进程控制软中断信号的处理。7、lockf函数,在进程同步控制中为进程加锁。8、sleep()函数,让进程进入睡眠状态。9、write()函数将数据写入已打开的文件内;read()函数把参数fd所指的文件传送50个字节到指针inpipe指向的内存中。第1小题:【程序清单】[root@localhostroot]#geditStest1.c#includestdio.h#includesignal.h#includeunistd.hvoidwaiting(),stop(),alarming();intwait_mark;main(){intp1,p2;if(p1=fork())/*创建子进程p1*/{if(p2=fork())/*创建子进程p1*/{wait_mark=1;signal(SIGINT,stop);/*创建子进程p1*/signal(SIGALRM,alarming);/*创建子进程p1*/waiting();kill(p1,16);/*向p1发软中断信号16*/kill(p2,17);/*向p2发软中断信号17*/wait(0);/*同步*/wait(0);printf(parentprocessiskilled!\n);exit(0);}else{wait_mark=1;signal(17,stop);signal(SIGINT,SIG_IGN);/*忽略^c信号*/while(wait_mark!=0);lockf(1,1,0);printf(child2processiskilledbyparent!\n);lockf(1,0,0);exit(0);}}else{wait_mark=1;signal(16,stop);signal(SIGINT,SIG_IGN);/*忽略^c信号*/while(wait_mark!=0)lockf(1,1,0);printf(child1processiskilledbyparent!\n);lockf(1,0,0);exit(0);}}voidwaiting(){sleep(5);if(wait_mark!=0)kill(getpid(),SIGALRM);}voidalarming(){wait_mark=0;}voidstop(){wait_mark=0;}[root@localhostroot]#gcc-oStest1Stest1.c[root@localhostroot]#./Stest1【运行结果】child1processiskilledbyparent!child2processiskilledyparent!parentprocessiskilled!第2小题:【程序清单】[root@localhostroot]#geditStest2.c#includestdio.h#includesignal.h#includeunistd.hintpid1,pid2;intmain(){intfd[2];charoutpipe[100],inpipe[100];pipe(fd);while((pid1=fork())==-1);if(pid1==0){lockf(fd[1],1,0);sprintf(outpipe,child1processissendingmessage!);write(fd[1],outpipe,50);sleep(5);lockf(fd[1],0,0);exit(0);}else{while((pid2=fork())==-1);if(pid2==0){lockf(fd[1],1,0);sprintf(outpipe,child2processissendingmessage!);write(fd[1],outpipe,50);sleep(5);lockf(fd[1],0,0);exit(0);}else{wait(0);read(fd[0],inpipe,50);printf(%s\n,inpipe);wait(0);read(fd[0],inpipe,50);printf(%s\n,inpipe);exit(0);}}}[root@localhostroot]#gcc-oStest2Stest2.c[root@localhostroot]#./Stest2【运行结果】(大约过30秒后)child1processissendingmessage!child2processissendingmessage!实验3内存管理【实验内容】问题描述:设计程序模拟最近最久未使用LRU页面置换算法的工作过程。假设内存中分配给每个进程的最小物理块数为M,在进程运行过程中要访问的页面个数为N,页面访问序列为P1,…,Pn,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,计算每种算法缺页次数和缺页率。程序要求如下:1)利用LRU页面置换算法模拟页面访问过程。2)模拟两种算法的页面置换过程,给出每个页面访问时的内存分配情况。3)输入:最小物理块数M,页面个数N,页面访问序列P1,…,Pn,算法选择1-LRU。4)输出:每种算法的缺页次数和缺页率。【实验原理】1、最近最少使用法(LeastRecentlyUsed,LRU)不是简单地以页面进入内存的先后顺序为依据,而是根据页面调入内存后的使用情况进行决策的。2、LRU算法的基本思想是在页表中设置一个访问字段,记录页面在最近时间段内被访问的次数或自上次访问以来所经历的时间,当须淘汰一个页面时,选择现有页面中访问时间值最早的予以淘汰。【程序清单】#includeiostream.hconstintmaxdata=100;constintmaxblock=10;intdatashow[maxblock][maxdata];//用于存储要显示的数组boolenableshow[maxblock][maxdata];//用于存储数组中的数据是否需要显示intdata[maxdata]={4,3,2,1,4,3,5,4,3,2,1,5,6,2,3,7,1,2,6,