天津理工大学《Linux操作系统》实验三
linux实验报告64534
Linux技术上机实验指导实验一Linux系统安装与简单配置一、实验目的1.掌握Linux系统安装的分区准备。
2.掌握Linux系统的安装步骤。
3.掌握Linux系统分区的挂载和卸载。
4.掌握Linux系统的启动和关闭操作。
二、实验内容1.安装VMware虚拟机,设置光盘驱动器,为Linux系统安装做准备。
2.在虚拟机下安装Linux操作系统(如Ubuntu桌面版本)。
3.配置Linux系统运行环境。
4.利用空闲分区创建新的Linux系统分区。
5.将新的Linux系统分区挂载到系统中;卸载新挂载的分区,重新挂载到目录树中的其他位置。
三、主要的实验步骤1.制定安装系统的分区计划。
2.配置光驱引导镜像文件iso,启动系统,开始安装过程。
3.根据安装计划,对磁盘空间进行分区设置。
4.根据系统安装指导,完成Linux系统的安装过程。
5.安装成功后,退出系统,重新启动虚拟机,登陆Linux操作系统。
6.对Linux系统进行配置,如网络设备等。
7.利用磁盘使用工具和mount,将新创建的Linux系统分区挂载到系统中。
将新挂载的分区卸载,并重新挂载到目录树的其他位置。
实验二Linux常用命令使用一、实验目的1.掌握Linux一般命令格式。
2.掌握有关文件和目录操作的常用命令。
3.熟练使用man命令。
二、实验内容1.熟悉cd、date、pwd、cal、who、echo、clear、passwd等常用命令。
2.在用户主目录下对文件进行操作:复制一个文件、显示文件内容、查找指定内容、排序、文件比较、文件删除等。
3.对目录进行管理:创建和删除子目录、改变和显示工作目录、列出和更改文件权限、链接文件等。
4.利用man命令显示date、echo等命令的手册页。
5.显示系统中的进程信息。
三、主要实验步骤1.登陆进入系统,修改个人密码。
2.使用简单命令:date、cal、who、echo、clear等,了解Linux命令格式。
操作系统原理实验3-进程管理
《操作系统原理》实验报告
实验序号:3 实验项目名称:进程管理
一、实验目的及要求
1. 加深对进程概念的理解,明确进程和程序的区别。
2. 进一步认识并发执行的实质。
3. 掌握Linux操作系统下的进程的创建与撤销。
二、实验设备(环境)及要求
1.虚拟机VMware Workstation、Ubuntu操作系统和C语言编程。
2.创建多个父进程与子进程,并撤销这些进程。
3.编写一段程序,使用系统调用fork()创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程显示字符a;子进程分别显示字符b和字符c。
试观察记录屏幕上的显示结果并分析原因。
三、实验内容与步骤
1.创建多个父进程与子进程
2.撤销这些进程
kill命令
3.编写程序
4.运行
四、实验结果与数据处理
分析:从进程并发执行来看,输出bca或abc的任意排列
原因:fork()创建进程所需要的时间要多于输出一个字符的时间,因此在主进程创建进程2的同时,进程1就输出了”b”,而进程2和主程序的输出次序是有随机性的,所以会出现多种可能结果。
五、分析与讨论
fork函数的原理是:一个现有进程可以调用fork函数创建一个新进程。
由fork 创建的新进程被称为子进程(child process)。
fork 函数被调用一次但返回两次。
两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
六、教师评语
成绩
签名:
日期:。
天津理工大学_操作系统_存储器的分配与回收算法实现_实验报告
实验报告学院(系)名称:计算机与通信工程学院【实验过程记录(源程序、测试用例、测试结果及心得体会等)】源程序:MemoryBlock.java://内存块类,包含各种操作public class MemoryBlock {static final int BLOCK_SIZE = 4096;private int baseBlock; //内存块基地址private int blockNum; //大小private boolean inUse; //是否已分配private MemoryBlock prev, next;public MemoryBlock(int blockNum) {this.baseBlock = 0;this.blockNum = blockNum;inUse = false;prev = null;next = null;}public MemoryBlock(int base, int blockNum) {this.baseBlock = base;this.blockNum = blockNum;inUse = false;prev = null;next = null;}public int getBlockNum() {return blockNum;}public void setBlockNum(int blockNum) {this.blockNum = blockNum;}public MemoryBlock getPrev() {return prev;}public void setPrev(MemoryBlock prev) {this.prev = prev;public MemoryBlock getNext() {return next;}public void setNext(MemoryBlock next) {this.next = next;}public boolean inUse() {return inUse;}public void setUse() {inUse = true;}public void free() {inUse = false;}public int getBaseBlock() {return baseBlock;}public void setBaseBlock(int baseBlock) { this.baseBlock = baseBlock;}//分配内存块,如果可分配,则返回剩余内存块public MemoryBlock allocate(int blockNum) { if(this.blockNum - blockNum>0) {int newBase = baseBlock + blockNum;int newBlock = this.blockNum-blockNum;this.blockNum = blockNum;setUse();return new MemoryBlock(newBase, newBlock);}else if(this.blockNum - blockNum ==0) {this.blockNum = 0;}return null;}//判断内存块是否能合并public boolean merge(MemoryBlock memBlock) {if(baseBlock+blockNum==memBlock.getBaseBlock()) {setBlockNum(blockNum+memBlock.blockNum);memBlock.setBaseBlock(0);memBlock.setBlockNum(0);return true;}elsereturn false;}@Overridepublic String toString() {String inUse = null;if(inUse())inUse = "已分配";else inUse = "未分配";return"内存块 [基地址=" + baseBlock + ", 大小=" + blockNum +", " + inUse + "]";}}MemoryTable.java://虚类MemTable,提供内存链表的各种基本方法public abstract class MemoryTable {//MemoryBlock链表表头protected MemoryBlock memList;public MemoryTable(int blockNum) {memList = new MemoryBlock(0, blockNum);}//把newBlock插入到memBlock前面public void insertBefore(MemoryBlock memBlock, MemoryBlock newBlock){if(memBlock.getPrev() != null)memBlock.getPrev().setNext(newBlock);if(memList == memBlock)memList = newBlock;newBlock.setPrev(memBlock.getPrev());newBlock.setNext(memBlock);memBlock.setPrev(newBlock);}//在memBlock后插入newBlockpublic void insert(MemoryBlock memBlock, MemoryBlock newBlock) { if(memBlock.getNext() != null)memBlock.getNext().setPrev(newBlock);newBlock.setNext(memBlock.getNext());memBlock.setNext(newBlock);newBlock.setPrev(memBlock);}//删除块的连接关系,但不释放块public void remove(MemoryBlock memBlock) {if(memBlock == memList)memList = memBlock.getNext();if(memBlock.getNext()!=null)memBlock.getNext().setPrev(memBlock.getPrev());if(memBlock.getPrev()!=null)memBlock.getPrev().setNext(memBlock.getNext());}public void print() {MemoryBlock memBlock = memList;int i=0;while(memBlock != null) {System.out.print(i+" ");System.out.println(memBlock);i++;memBlock = memBlock.getNext();}}//合并邻接的空闲内存public void merge(MemoryBlock newBlock) {MemoryBlock memBlock = memList;while(memBlock != null) {if(!memBlock.inUse()) {if(memBlock.merge(newBlock)) {memBlock.setBlockNum( memBlock.getBlockNum() +newBlock.getBlockNum());remove(newBlock);break;}if(newBlock.merge(memBlock)) {newBlock.setBlockNum( newBlock.getBlockNum() + memBlock.getBlockNum());break;}}memBlock = memBlock.getNext();}}//分配内存(抽象函数)public abstract boolean allocate(int blockNum);//释放内存(抽象函数)public abstract boolean free(int baseBlock);}FirstFit.java:public class FirstFit extends MemoryTable{public FirstFit(int blockNum) {super(blockNum);}@Overridepublic boolean allocate(int blockNum) {MemoryBlock memBlock = memList;while(memBlock!=null) {if(!memBlock.inUse()) {if(memBlock.getBlockNum()>blockNum) {MemoryBlock newBlock = memBlock.allocate(blockNum);insert(memBlock, newBlock);return true;}else if(memBlock.getBlockNum()==blockNum) {memBlock.setUse();}}memBlock = memBlock.getNext();}return false;}//分配内存(类内使用)void freeMemory(MemoryBlock freeBlock) {MemoryBlock prev = freeBlock.getPrev();MemoryBlock next = freeBlock.getNext();freeBlock.free();while(!prev.inUse() && (prev.merge(freeBlock))) {prev.setBlockNum( prev.getBlockNum() +freeBlock.getBlockNum());remove(freeBlock);freeBlock = prev;if(freeBlock.getPrev()!=null)prev = freeBlock.getPrev();else return;}}if(freeBlock.getNext()!=null) {while(!next.inUse() && (freeBlock.merge(next))) {freeBlock.setBlockNum ( next.getBlockNum() +freeBlock.getBlockNum());remove(next);freeBlock = next;if(freeBlock.getNext()!=null)next = freeBlock.getNext();else return;}}}@Overridepublic boolean free(int baseBlock) {MemoryBlock memBlock = memList;while(memBlock != null) {if(memBlock.getBaseBlock() == baseBlock) {freeMemory(memBlock);return true;}memBlock = memBlock.getNext();}return false;}}BestFit.java:public class BestFit extends MemoryTable {private MemoryBlock usedMemory;public BestFit(int blockNum) {super(blockNum);usedMemory = null;}@Overridepublic boolean allocate(int blockNum) {MemoryBlock memBlock = memList;MemoryBlock minBlock = null;for(;memBlock!=null; memBlock = memBlock.getNext()) { if(!memBlock.inUse()&&(memBlock.getBlockNum()>=blockNum)) { minBlock = memBlock;break;}}if(minBlock != null) {remove(minBlock);if(minBlock.getBlockNum()!=blockNum) {MemoryBlock newBlock = minBlock.allocate(blockNum);insertUnused(newBlock);}insertUsed(minBlock);return true;}elsereturn false;}boolean freeMemory(MemoryBlock freeBlock) {if(freeBlock != null) {freeBlock.free();removeUsed(freeBlock);insertUnused(freeBlock);return true;}return false;}@Overridepublic boolean free(int baseBlock) {MemoryBlock memBlock = usedMemory;while(memBlock != null) {if(memBlock.getBaseBlock() == baseBlock) {freeMemory(memBlock);merge(memBlock);return true;}memBlock = memBlock.getNext();return false;}//在已分配链表删除public void removeUsed(MemoryBlock memBlock) {if(memBlock == usedMemory)usedMemory = memBlock.getNext();if(memBlock.getNext()!=null)memBlock.getNext().setPrev(memBlock.getPrev());if(memBlock.getPrev()!=null)memBlock.getPrev().setNext(memBlock.getNext());}//插入未分配链表void insertUnused(MemoryBlock newBlock) {if(memList == null)memList = newBlock;else {MemoryBlock memBlock = memList;MemoryBlock preBlock = null;while(memBlock!=null) {if(newBlock.getBlockNum()<=memBlock.getBlockNum()) { insertBefore(memBlock, newBlock);return;}preBlock = memBlock;memBlock = memBlock.getNext();}insert(preBlock, newBlock);}}//插入已分配链表void insertUsed(MemoryBlock newBlock) {if(usedMemory == null)usedMemory = newBlock;else {MemoryBlock memBlock = usedMemory;while(memBlock.getNext() != null)memBlock = memBlock.getNext();memBlock.setNext(newBlock);newBlock.setPrev(memBlock);}}public void print() {super.print();MemoryBlock memBlock = usedMemory;int i=0;while(memBlock != null) {System.out.print(i+" ");System.out.println(memBlock);i++;memBlock = memBlock.getNext();}}}WorstFit.java:public class WorstFit extends MemoryTable {//已分配链表private MemoryBlock usedMemory;public WorstFit(int blockNum) {super(blockNum);usedMemory = null;}@Overridepublic boolean allocate(int blockNum) {MemoryBlock maxBlock = memList;if(maxBlock.getBlockNum()<blockNum)return false;remove(maxBlock);if(maxBlock.getBlockNum()!=blockNum) {MemoryBlock newBlock = maxBlock.allocate(blockNum);insertUnused(newBlock);}insertUsed(maxBlock);return true;}boolean freeMemory(MemoryBlock freeBlock) {if(freeBlock != null) {freeBlock.free();removeUsed(freeBlock);insertUnused(freeBlock);}return false;}@Overridepublic boolean free(int baseBlock) {//已分配链表MemoryBlock memBlock = usedMemory;while(memBlock != null) {if(memBlock.getBaseBlock() == baseBlock) {freeMemory(memBlock);merge(memBlock);return true;}memBlock = memBlock.getNext();}return false;}public void removeUsed(MemoryBlock memBlock) {if(memBlock == usedMemory)usedMemory = memBlock.getNext();if(memBlock.getNext()!=null)memBlock.getNext().setPrev(memBlock.getPrev());if(memBlock.getPrev()!=null)memBlock.getPrev().setNext(memBlock.getNext());}void insertUnused(MemoryBlock newBlock) {if(memList == null)memList = newBlock;else {MemoryBlock memBlock = memList;MemoryBlock preBlock = null;while(memBlock!=null) {if(newBlock.getBlockNum()>=memBlock.getBlockNum()) { insertBefore(memBlock, newBlock);return;}preBlock = memBlock;memBlock = memBlock.getNext();}insert(preBlock, newBlock);}}void insertUsed(MemoryBlock newBlock) {if(usedMemory == null)usedMemory = newBlock;else {MemoryBlock memBlock = usedMemory;while(memBlock.getNext() != null)memBlock = memBlock.getNext();memBlock.setNext(newBlock);newBlock.setPrev(memBlock);}}public void print() {super.print();MemoryBlock memBlock = usedMemory;int i=0;while(memBlock != null) {System.out.print(i+" ");System.out.println(memBlock);i++;memBlock = memBlock.getNext();}}}测试用例:Main.java:public class Main {public static void main(String[] args) {testFirstFit();System.out.println();testBestFit();System.out.println();testWorstFit();}public static void testFirstFit() {MemoryTable mem = new FirstFit(1024);System.out.println("测试首次适应法:");mem.allocate(512);mem.allocate(256);mem.allocate(128);mem.print();mem.free(512);mem.free(768);mem.print();}public static void testBestFit() {MemoryTable mem = new BestFit(1024);System.out.println("测试最佳适应法:");mem.allocate(1);mem.allocate(2);mem.allocate(3);mem.print();mem.free(0);mem.free(1);mem.print();}public static void testWorstFit() {MemoryTable mem = new WorstFit(1024);System.out.println("测试最坏适应法:");mem.allocate(1);mem.allocate(2);mem.allocate(3);mem.print();mem.free(0);mem.free(3);mem.print();}}测试结果:测试首次适应法:分配 512 内存分配 256 内存分配 128 内存内存单元:0 内存块 [基地址=0, 大小=512, 已分配]1 内存块 [基地址=512, 大小=256, 已分配]2 内存块 [基地址=768, 大小=128, 已分配]3 内存块 [基地址=896, 大小=128, 未分配]释放 512 处内存释放 768 处内存内存单元:0 内存块 [基地址=0, 大小=512, 已分配]1 内存块 [基地址=512, 大小=512, 未分配]测试最佳适应法:分配 1 内存分配 2 内存分配 3 内存内存单元:0 内存块 [基地址=6, 大小=1018, 未分配]0 内存块 [基地址=0, 大小=1, 已分配]1 内存块 [基地址=1, 大小=2, 已分配]2 内存块 [基地址=3, 大小=3, 已分配]释放 0 处内存释放 1 处内存内存单元:0 内存块 [基地址=0, 大小=3, 未分配]1 内存块 [基地址=6, 大小=1018, 未分配]0 内存块 [基地址=3, 大小=3, 已分配]测试最坏适应法:分配 1 内存分配 2 内存分配 3 内存内存单元:0 内存块 [基地址=6, 大小=1018, 未分配]0 内存块 [基地址=0, 大小=1, 已分配]1 内存块 [基地址=1, 大小=2, 已分配]2 内存块 [基地址=3, 大小=3, 已分配]释放 0 处内存释放 3 处内存内存单元:0 内存块 [基地址=3, 大小=1021, 未分配]1 内存块 [基地址=0, 大小=1, 未分配]0 内存块 [基地址=1, 大小=2, 已分配]心得体会:1.使用类来进行一些方法的重用2.释放内存时,根据不同的分配方法进行相邻的内存合并3.链表应根据具体情况优化从而简化代码。
Linux基本操作的实验报告.ppt
一. Linux目录管理有关命令
2. cd ---改变当前工作目录 命令格式:cd [目录名]
注: 与Dos的cd命令类似; 当前目录/绝对卢静/相对路径
3.Ls--- 列出文件目录的信息 命令格式:ls [可选项] [子目录名] [文件名] 注: 与Dos的cd命令类似; 当前目录/绝对路径/相对路径 可选项: -a ;列出全部的文件,包括那些隐藏文件. -l :按长格式列目录,输出信息包括文件目录,文件的权限、所属用户组、 文件建立和修改的时间等信息。 -d :只列出子目录信息。 -o :用不同颜色显示各种类型的文件,蓝色表示子目录、绿色表示可执行 文件、红色表示压缩文件、浅蓝色表示连接文件、灰色表示其它文件。
一. Linux目录管理有关命令
注: 通配符的使用与Windows类似: *,?. 如: [1-9]* ----所有以1-9中任意一个字符开头的文件 [1,3,5]* ---- 所有以1或3或5开头的文件
二.更改目录或文件访问权限的命令
Linux中的访问权限
在Linux中,对目录访问的用户分为三
2. chmod ---改变文件或目录的访问权限 命令格式:chmod [可选项] [权限] [目录或文件名] 可选项: -v :报告权限更改信息;
-c :每次发生权限的实质性更改时给出一条信息。
(1) 文字设定法 格式:chmod [who] [+ |-|=] [mode] [文件名 | 目录名] who: u—user g—group o—others a—all + 添加 - 取消 = 赋予给定权限并取消其他所有权限 例如: $chmod g+r,o+r example
linux常用命令实验实验报告 -回复
linux常用命令实验实验报告-回复Linux常用命令实验实验报告一、引言在计算机领域,掌握常用命令是非常重要的。
对于使用Linux操作系统的用户来说,熟悉常用命令更是必备的技能之一。
本篇实验报告将以"Linux常用命令"为主题,介绍并实验一些常用的Linux命令,包括文件与目录管理、权限管理、网络管理、进程管理等方面的命令。
通过本次实验,希望进一步巩固和提升大家对Linux操作系统的理解和实践能力。
二、实验一:文件与目录管理1. 文件列表命令:ls首先,我们来介绍一下`ls`命令,该命令用于列出当前目录下的所有文件和文件夹。
通过在终端中输入`ls`命令,可以查看当前目录下的文件列表。
2. 创建目录命令:mkdir接下来,我们将尝试使用`mkdir`命令创建一个新的目录。
可以输入`mkdir directory_name`来创建一个名为"directory_name"的目录。
3. 切换目录命令:cd使用`cd`命令可以切换当前工作目录。
例如,要进入某个目录,可以使用`cd directory_name`命令。
要返回上一级目录,可以使用`cd ..`。
4. 复制文件命令:cp`cp`命令用于复制文件和目录。
要复制一个文件,可以使用`cp source_file destination_file`命令。
例如,`cp file1.txt file2.txt`将会复制"file1.txt"并将其命名为"file2.txt"。
5. 删除文件命令:rm要删除一个文件,可以使用`rm file_name`命令。
例如,要删除"file.txt"文件,可以输入`rm file.txt`。
6. 查找文件命令:find使用`find`命令可以在文件系统中查找文件。
例如,`find / -namefile_name`将会在根目录下找到名为"file_name"的文件。
2022年linux操作系统实验报告
LINUX操作系统实验报告姓名班级学号指引教师年05月16 日实验一在LINUX下获取协助、Shell实用功能实验目旳:1、掌握字符界面下关机及重启旳命令。
2、掌握LINUX下获取协助信息旳命令:man、help。
3、掌握LINUX中Shell旳实用功能,命令行自动补全,命令历史记录,命令旳排列、替代与别名,管道及输入输出重定向。
实验内容:1、使用shutdown命令设定在30分钟之后关闭计算机。
2、使用命令“cat /etc/cron.daliy”设立为别名named,然后再取消别名。
3、使用echo命令和输出重定向创立文本文献/root/nn,内容是hello,然后再使用追加重定向输入内容为word。
4、使用管道方式分页显示/var目录下旳内容。
5、使用cat显示文献/etc/passwd和/etc/shadow,只有对旳显示第一种文献时才显示第二个文献。
实验环节及成果:1.用shutdown命令安全关闭系统,先开机在图形界面中右击鼠标选中新建终端选项中输入命令Shutdown -h 302、使用命令alias将/etc/cron.daliy文献设立为别名named,左边是要设立旳名称右边是要更改旳文献。
查看目录下旳内容,只要在终端输入命令即可。
取消更改旳名称用命令unalias 命令:在命令后输入要取消旳名称,再输入名称。
3.输入命令将文献内容HELLO重定向创立文本文献/root/nn,然后用然后再使用追加重定向输入内容为word。
环节与输入内容HELLO同样,然后用命令显示文献旳所有内容。
4.使用命令ls /etc显示/etc目录下旳内容,命令是分页显示。
“|”是管道符号,它可以将多种命令输出信息当作某个命令旳输入。
5实验二文献和目录操作命令实验目旳:1、掌握LINUX下文献和目录旳操作命令,如pwd、cd、ls、touch、mkdir、rmdir、cp、mv、rm等。
2、掌握LINUX下建立链接文献旳措施。
Linux操作系统第三次实验报告
3.修改用户的密码和有效期等信息。
4.创建系统用户*system(其中*为学生姓名拼音首字母组合)。
5.查看用户配置文件/etc/passwd和/etc/shadow,观察内容变化情况,可以在命令行中执行文件显示命令,也可以使用grep命令来查找。
二、创建和管理组账户
1.创建一个新的组*group(其中*为学生姓名拼音首字母组合)。
2.修改组账户名称和GID。
3.查看用户所属组。
4.将用户添加到新建组中。
5.将用户从该新建组中删除。
6.查看组配置文件/etc/group和/etc/gshadow获取组账户信息列表,观察变化情况并做简要说明。
指导教师评语:
实验报告
课程名称:Linux操作系统
任课教师:
授课学期:
学生班级:
学生姓名:
实验题目:创建和管理用户账户
实验成绩:
指导教师:
实验室:
日期:
节数:2
实验目的:掌握用户账户和组账户的命令行操作。
实验仪器、物品:已安装好Ubuntu桌面和管理用户账户
1.创建一个普通用户*user(其中*为学生姓名拼音首字母组合)。
Linux操作系统实验教程(2021年整理精品文档)
(完整)Linux操作系统实验教程编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)Linux操作系统实验教程)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)Linux操作系统实验教程的全部内容。
Linux 操作系统实验教程第1章 Linux 系统概述一、Linux 系统结构从操作系统的角度来分析Linux ,它的体系结构总体上属于层次结构如下图所示:从内到外包括三层:最内层是系统核心,中间是Shell 、编译编辑实用程序、库函数等,最外层是用户程序,包括许多应用软件。
从操作系统的功能角度来看,它的核心有五大部分组成:进程管理、存储管理、文件管理、设备管理、网络管理。
各子系统实现其主要功能,同时相互之间是合作、依赖的关系。
进程会管理是操作系统最核心的内容,它控制了整个系统的进程调度和进程之间的通信,是整个系统合理高效运行的关键;存储管理为其他子系统提供内存管理支持,同时其他子系统又为内存管理提供了实现支持,例如要通过文件管理和设备管理实现虚拟存储器和内外存的统一管理。
二、配置一个双引导系统如果计算机中已经安装了其他操作系统,并想创建一个引导系统以便兼用Red Hat Linux和另外的操作系统,需要使用双引导。
机器启动时,可以选择其中之一,但不能同时使用两者。
每个操作系统都从自己的硬盘驱动器或硬盘分区中引导,并使用自己的硬盘驱动器或硬盘分区。
如果计算机上还没有安装任何操作系统,可以使用专门的分区及格式化软件给Windows创建指定大小的分区,Windows的文件系统为FAT,再为Linux系统创建所需要大小的分区(4G或更大),另外再给Linux留100MB左右的交换分区,Linux的文件系统为ext2。
linux实验报告
linux实验报告燕山大学Linux技术上机实验指导精选文库—实验一Linux系统安装与简单配置一、实验目的1.掌握Linux 系统安装的分区准备。
2.掌握Linux系统的安装步骤。
3.掌握Linux系统分区的挂载和卸载。
4.掌握Linux系统的启动和关闭操作。
二、实验内容1.安装VMware虚拟机,设置光盘驱动器,为Linux系统安装做准备。
2.在虚拟机下安装Linux操作系统(如Ubuntu桌面版本)。
3.配置Linux系统运行环境。
4.利用空闲分区创建新的Linux系统分区。
5.将新的Linux系统分区挂载到系统中;卸载新挂载的分区,重新挂载到目录树中的其他位置。
三、主要的实验步骤1.制定安装系统的分区计划。
2.配置光驱引导镜像文件iso,启动系统,开始安装过程。
3.根据安装计划,对磁盘空间进行分区设置。
4.根据系统安装指导,完成Linux系统的安装过程。
5.安装成功后,退出系统,重新启动虚拟机,登陆Linux操作系统。
6.对Linux系统进行配置,如网络设备等。
7.利用磁盘使用工具和mount,将新创建的Linux系统分区挂载到系统中。
将新挂载的分区卸载,并重新挂载到目录树的其他位置。
精选文库—实验二Linux常用命令使用一、实验目的1.掌握Linux一般命令格式。
2.掌握有关文件和目录操作的常用命令。
3.熟练使用man命令。
二、实验内容1.熟悉cd、date、pwd、cal、who、echo、clear、passwd等常用命令。
2.在用户主目录下对文件进行操作:复制一个文件、显示文件内容、查找指定内容、排序、文件比较、文件删除等。
3.对目录进行管理:创建和删除子目录、改变和显示工作目录、列出和更改文件权限、链接文件等。
4.利用man命令显示date、echo等命令的手册页。
5.显示系统中的进程信息。
三、主要实验步骤1.登陆进入系统,修改个人密码。
2.使用简单命令:date、cal、who、echo、clear等,了解Linux命令格式。
天津理工大学-2014-2015-操作系统期末试卷及答案
2014 ~2015 学年度第一学期《计算机操作系统》期末考试试卷课程代码:0660018试卷编号:1-A 命题日期:2015 年11 月18 日答题时限:120 分钟考试形式:闭卷笔试得分统计表:一、填空题(每空1 分,共20 分)1、、、和用户接口管理。
2、进程由程序、和组成。
3、对于分时系统和实时系统,从可靠性上看系统更强;若从交互性来看系统更强。
4、产生死锁的原因主要是和。
5、一台计算机有10台磁带机被m个进程竞争,每个进程最多需要三台磁带机,那么m为时,系统没有死锁的危险。
6、实现SPOOL系统时必须在磁盘上辟出称为和的专门区域,以存放作业信息和作业执行结果。
7、虚拟存储器具有的主要特征为、和虚拟性。
8、按用途可以把文件分为系统文件、和三类。
9、为文件分配外存空间时,常用的分配方法有、和三类。
二、单项选择题(每题1 分,共20 分,答案请填在题后的括号内)1、关于操作系统的叙述是不正确的。
(4)(1)管理资源的程序(2)管理用户程序执行的程序(3)能使系统资源提高效率的程序(4)能方便用户编程的程序2、设计多道批处理系统时,首先要考虑的是。
(3)(1)灵活性和可适应性(2)交互性和响应时间(3)系统效率和吞吐量(4)实时性和可靠性3、当进程调度采用最高优先级调度算法时,从保证系统效率的角度来看,应提高进程的优先级。
(2)(1)以计算为主的(2)在就绪队列中等待时间长的(3)以I/O为主的(4)连续占用处理器时间长的4、进程从运行状态进入就绪状态的原因可能是。
(1)(1)时间片用完(2)被选中占有C P U(3)等待某一事件(4)等待的事件已经发生5、一作业进入内存后,则所属该作业的进程初始时处于状态。
(1)(1)就绪(2)运行(3)挂起(4)阻塞6、进程控制块是描述进程状态和特性的数据结构,一个进程。
Linux实验三讲解
常熟理工学院《Linux程序设计》实验报告—学年第学期专业班级学号姓名实验地点指导教师刘在德计算机科学与工程学院实验要求1.每次实验前,认真复习与本次实验有关的教学内容,认真预习本次实验内容。
2.按照实验要求认真完成实验,把实验内容详细记入实验报告。
3.每一次新实验,实验报告另起一页。
4.报告封面要求(1)信息填写完整;(2)下划线右对齐,力求做到美观大方。
5.打印实验报告(包括封面及本页),装订成册。
6.严谨抄袭,如果有n人实验报告内容雷同,每人得分为总分除以n。
实验三 Liunx常用Shell命令(四号黑体)【一】实验目的(小四黑体)1.掌握Linux常用目录操作命令。
2.掌握Linux常用文件处理命令。
3.掌握Linux常用文件备份命令。
4.掌握Linux常用关机重启命令。
5.掌握Linux其他常用命令。
【二】实验内容(小四黑体)1.进入用户家目录,调用ls命令列出当前目录或指定目录的文件信息,重点测试“ls -l [目录]”,以及显示某一类文件的方法,比如“ls -l *.c”。
2.进入用户家目录,调用cd命令进入指定目录,重点测试进入root目录、父目录、当前用户家目录、前一个目录。
同时调用pwd命令指出当前目录的绝对路径。
3.在当前目录下调用mkdir命令创建空目录,重点测试“mkdir -m 权限值目录名”和“mkdir -p 目录1/目录2”的用法,即“指定目录操作权限/递归建立目录”。
4.调用rmdir命令删除上面创建的目录,重点测试“rmdir -p 目录1/目录2”。
5.调用“cat >文件名”创建一个新文件,并从键盘输入一些信息;然后调用“cat -n/-b/-s 文件名”显示文件内容。
再次调用cat命令建立第二个文件,并输入一些信息,然后调用“cat 文件2>>文件1”把文件2内容追加到文件1的结尾,然后显示文件1的内容。
调用“cat 文件1 文件2 >文件3”合并文件1和2的内容并导入文件3,然后显示文件3的内容。
操作系统实验报告 linux部分(原创)
操作系统实验报告 linux部分(原创)2、3 Linux并发程序设计(实验估计时间:90分钟)Ø背景知识Ø实验目的Ø工具/准备工作Ø实验内容与步骤背景知识管道是Linux中最常用的进程间通信IPC机制。
利用管道时,一个进程的输出可成为另外一个进程的输入。
当输入输出的数据量特别大时,这种IPC机制非常有用。
可以想象,如果没有管道机制,而必须利用文件传递大量数据时,会造成许多空间和时间上的浪费。
在Linux中,通过将两个file结构指向同一个临时的索引节点,而两个索引节点又指向同一个物理页而实现管道。
实验目的1)通过在Linux进程之间进行的通信实例来学习并发程序设计的方法。
2)通过Linux进程通信的程序设计与实现,进一步熟悉操作系统的进程概念,理解Linux进程管理概念。
3)通过阅读和分析Linux实验程序,学习Linux程序设计、调试和运行的方法。
工具/准备工作在开始本实验之前,请回顾教科书的相关内容。
需要准备一台运行Linux操作系统的计算机。
实验内容与步骤并发程序的设计关键是使用创建进程的系统调用,使一个程序运行时可以生成几个同时运行的程序,如果程序中没有创建进程的动作则为顺序程序设计。
本实验中的并发程序例子完成两个程序child和father之间的数据传递工作,具体做法分为四步。
步骤1:编制并发程序pipeline、c。
单击红帽子,在“GNOME帮助”菜单中单击“附件”-“文本编辑器”命令,在文本编辑中键入程序并保存为pipeline、c。
在该程序中定义管道和文件描述符,并且创建子进程child。
该程序用到的系统调用有pipe()、dup()、fork()、close、execl()、exit,它们的功能分别是建立管道、复制文件描述符、创建进程并使子进程与父进程有相同的程序正文、关闭文件描述符、用指定文件覆盖调用程序、撤销当前进程。
清单4-5 pipeline、c// 定义管道程序# define STD_INPUT0// 定义标准输入设备描述符# define STD_OUTPUT1// 定义标准输出设备描述符int fd[2];main(){static charprocess1[]="father",process2[]="child"; pipe(fd);// 定义管道 pipeline(process1,process2);// 调用自定义函数pipeline()pipeline(); exit(1);// 程序结束}pipeline(char*process1,char* process2){ int i; while ((i=fork())==-1);// 创建进程,直到创建成功为止 if (i){ close(fd[0]);// 关闭管道输入描述符close(STD_OUTPUT);// 关闭标准输出描述符1 dup(fd[1]);// 指定标准输出描述符1为管道写指针 close(fd[1]);// 关闭原始管道写指针execl(process1, process1, 0);// 用程序father覆盖当前程序 printf(" father failed、\n");// execl()执行失败 }else { close(fd[1]);// 关闭管道输出描述符close(STD_INPUT);// 关闭标准输入描述符0 dup(fd[0]);// 指定标准输入描述符0为管道读指针 close(fd[0]);// 关闭原始管道读指针 execl(process2,process2,0);// 用程序child覆盖当前程序 printf("child failed、\n");// execl()执行失败 } exit(2);// 程序结束}步骤2:编制“管道写”程序father、c作为父进程的一部分工作。
Linux操作系统实验指导书
《Linux操作系统》实验指导书内蒙古工业大学计算机系2017年10月实验一 Linux基本命令的使用(一)实验目的1.掌握常用的Linux操作系统命令;2.能利用这些命令对操作系统进行基本的系统维护和管理。
(二)实验内容1.利用文件管理命令在用户的个人主目录下创建一个子目录,目录名称为本人的学号(例如5002),利用vi编辑器编写一个SHELL脚本,在终端运行后显示:Hello Linux!I have known how to use all kinds of commands.My name is xxx. (例如:My name is Shi Zhida.)My student ID is xxx. (例如:My student ID is 5002)2.在个人主目录下建立子目录bk+本人学号(例如bk5002)。
3.创建组,组名为身份证的后四位;创建用户,用户名为user+学号后4位;把所建的用户添加到组中。
4.删除由学号建立的目录。
5.熟悉其他命令的使用,可参照课堂内容。
(三)实验要求1.编写脚本源文件,调试通过后打包上交;2.书写实验报告。
(一)实验目的1.通过上机实习,能够编写较复杂的Shell脚本,熟悉Shell脚本的分支和循环语句。
(二)实验内容1.在Linux环境下,利用vi编写SHELL脚本程序。
(、、)2.程序:(1)要求用if结构(2)功能在终端下运行程序,首先清屏,然后提示:“Input a file or directory name, please!”。
从键盘输入一个字符串(如:xxx),如果该字符串是目录,则显示:“xxx is a directory.”;如果该字符串是文件(如:xxx),则显示:“xxx is a regular file.”;如果该文件是可读的,则显示:“xxx is a readable file.”;如果该文件是可写的,则显示:“xxx is a writable.” 如果该文件是可执行的,则显示:“xxx is a executable.”;如果既不是目录也不是文件,则显示:“This script cannot get the file/directory xxx information!”。
天津理工大学-操作系统实验3:磁盘调度算法的实现
天津理工大学-操作系统实验3:磁盘调度算法的实现实验报告学院(系)名称:计算机与通信工程学院【实验过程记录(源程序、测试用例、测试结果及心得体会等)】#include<iostream>#include<iomanip>#include<math.h>using namespace std;const int MaxNumber=100;int TrackOrder[MaxNumber];int MoveDistance[MaxNumber]; //----移动距离; int FindOrder[MaxNumber]; //-----寻好序列。
double AverageDistance; //-----平均寻道长度bool direction; //-----方向true时为向外,false为向里int BeginNum; //----开始磁道号。
int M; //----磁道数。
int N; //-----提出磁盘I/O申请的进程数int SortOrder[MaxNumber]; //----排序后的序列bool Finished[MaxNumber];void Inith(){cout<<"请输入磁道数:";cin>>M;cout<<"请输入提出磁盘I/O申请的进程数:";cin>>N;cout<<"请依次输入要访问的磁道号:";for(int i=0;i<N;i++)cin>>TrackOrder[i];for(int j=0;j<N;j++)MoveDistance[j]=0;cout<<"请输入开始磁道号:";cin>>BeginNum;for(int k=0;k<N;k++)Finished[k]=false;for(int l=0;l<N;l++)SortOrder[l]=TrackOrder[l];}//=====================排序函数,将各进程申请的磁道按从小到大排列=================void Sort(){ //------冒泡排序int temp;for(int i=N-1;i>=0;i--)for(int j=0;j<i;j++){if(SortOrder[j]>SortOrder[j+1]){temp=SortOrder[j];SortOrder[j]=SortOrder[j+1];SortOrder[j+1]=temp;}}}//============FCFS,先来先服务=================================void FCFS(){int temp;temp=BeginNum; //--------将BeginNum赋给temp作为寻道时的当前所在磁道号for(int i=0;i<N;i++){MoveDistance[i]=abs(TrackOrder[i]-temp);//-------计算移动磁道数temp=TrackOrder[i];//-------寻到后,将此道作为当前所在磁道号,赋给temp FindOrder[i]=TrackOrder[i];//-----寻好的赋给寻好序列}}//========SSTF,最短寻道法=============================void SSTF()int temp,n;int A=M;temp=BeginNum; //--------将BeginNum赋给temp作为寻道时的当前所在磁道号for(int i=0;i<N;i++){for(int j=0;j<N;j++) //-------寻找最短的寻道长度{if(abs(TrackOrder[j]-temp)<A&&Finished[j]==false) {A=abs(TrackOrder[j]-temp);n=j;}else continue;}Finished[n]=true; //-------将已经寻找到的Finished赋值为trueMoveDistance[i]=A; //-------寻道长度temp=TrackOrder[n]; //-------当前寻道A=M; //-----重置A值FindOrder[i]=TrackOrder[n]; //----寻好的赋给寻好序列}}//=====================SCAN,扫描算法==========================void SCAN(){int m,n,temp;temp=BeginNum;Sort();//------排序cout<<"请选择开始方向:1--向外;0---向里"; //------选择扫描方向cin>>m;if(m==1)direction=true;else if(m==0)direction=false;cout<<"输入错误";for(int i=0;i<N;i++){if(SortOrder[i]<BeginNum)continue;else{n=i;break;}}if(direction==true) //------选择向外{for(int i=n;i<N;i++){MoveDistance[i-n]=abs(SortOrder[i]-temp);temp=SortOrder[i];FindOrder[i-n]=SortOrder[i];}for(int j=n-1;j>=0;j--){MoveDistance[N-1-j]=abs(SortOrder[j]-temp);temp=SortOrder[j];FindOrder[N-1-j]=SortOrder[j];}}else //-------选择向里{for(int i=n-1;i>=0;i--){MoveDistance[N-i-4]=abs(SortOrder[i]-temp);temp=SortOrder[i];FindOrder[N-i-4]=SortOrder[i];}for(int j=n;j<N;j++){MoveDistance[j]=abs(SortOrder[j]-temp);temp=TrackOrder[j];FindOrder[j]=SortOrder[j];}}}//=================CSCAN,循环扫描算法=======================void CSCAN(){int m,n,temp;temp=BeginNum;Sort();cout<<"请选择开始方向:1--向外;0---向里"; cin>>m;if(m==1)direction=true;else if(m==0)direction=false;elsecout<<"输入错误";for(int i=0;i<N;i++){if(SortOrder[i]<BeginNum)continue;else{n=i;break;}}if(direction==true){for(int i=n;i<N;i++){MoveDistance[i-n]=abs(SortOrder[i]-temp);temp=SortOrder[i];FindOrder[i-n]=SortOrder[i];}for(int j=0;j<n;j++){MoveDistance[N-n+j]=abs(SortOrder[j]-temp);temp=SortOrder[j];FindOrder[N-n+j]=SortOrder[j];}}else{for(int i=n-1;i>=0;i--){MoveDistance[n-1-i]=abs(SortOrder[i]-temp);temp=SortOrder[i];FindOrder[n-1-i]=SortOrder[i];}for(int j=N-1;j>=n;j--){MoveDistance[N-j+n-1]=abs(SortOrder[j]-temp);temp=SortOrder[j];FindOrder[N-j+n-1]=SortOrder[j];}}}//========计算平均寻道时间============== void Count(){int Total=0;for(int i=0;i<N;i++){Total+=MoveDistance[i];}AverageDistance=((double)Total)/((double)N);}void Show(){cout<<"================从"<<BeginNum<<"号磁道开始====================="<<endl;cout<<setw(20)<<"被访问的下一个磁道号"<<setw(20)<<"移动距离(磁道数)"<<endl;for(int i=0;i<N;i++){cout<<setw(15)<<FindOrder[i]<<setw(15)<<MoveDista nce[i]<<endl;}cout<<setw(20)<<"平均寻道长度:"<<AverageDistance<<endl;cout<<endl;}int main(){int y=1;int s;Inith();while(y){cout<<"请选择寻道方式:1--FCFS; 2--SSTF;3--SCAN;4--CSCSN;";cin>>s;switch(s){case 1:FCFS();Count();Show();break;case 2:SSTF();Count();Show();break;case 3:SCAN();Count();Show();break;case 4:CSCAN();Count();Show();break;}cout<<"是否继续选择寻道算法?1--是;2--否";int p;cin>>p;y=p;}return 0;}实验结果:FCFS方式:Sstf方式:SCAN方式:4.CSCSN。
天津理工大学 操作系统实验3:磁盘调度算法的实现
实验报告学院(系)名称:计算机与通信工程学院【实验过程记录(源程序、测试用例、测试结果及心得体会等)】#include<iostream>#include<iomanip>#include<math.h>using namespace std;const int MaxNumber=100;int TrackOrder[MaxNumber];int MoveDistance[MaxNumber]; //----移动距离;int FindOrder[MaxNumber]; //-----寻好序列。
double AverageDistance; //-----平均寻道长度bool direction; //-----方向 true时为向外,false为向里int BeginNum; //----开始磁道号。
int M; //----磁道数。
int N; //-----提出磁盘I/O申请的进程数int SortOrder[MaxNumber]; //----排序后的序列bool Finished[MaxNumber];void Inith(){cout<<"请输入磁道数:";cin>>M;cout<<"请输入提出磁盘I/O申请的进程数:";cin>>N;cout<<"请依次输入要访问的磁道号:";for(int i=0;i<N;i++)cin>>TrackOrder[i];for(int j=0;j<N;j++)MoveDistance[j]=0;cout<<"请输入开始磁道号:";cin>>BeginNum;for(int k=0;k<N;k++)Finished[k]=false;for(int l=0;l<N;l++)SortOrder[l]=TrackOrder[l];}//=====================排序函数,将各进程申请的磁道按从小到大排列================= void Sort(){ //------冒泡排序int temp;for(int i=N-1;i>=0;i--)for(int j=0;j<i;j++){if(SortOrder[j]>SortOrder[j+1]){temp=SortOrder[j];SortOrder[j]=SortOrder[j+1];SortOrder[j+1]=temp;}}}//============FCFS,先来先服务=================================void FCFS(){int temp;temp=BeginNum; //--------将BeginNum赋给temp作为寻道时的当前所在磁道号for(int i=0;i<N;i++){MoveDistance[i]=abs(TrackOrder[i]-temp); //-------计算移动磁道数temp=TrackOrder[i]; //-------寻到后,将此道作为当前所在磁道号,赋给tempFindOrder[i]=TrackOrder[i]; //-----寻好的赋给寻好序列}}//========SSTF,最短寻道法=============================void SSTF(){int temp,n;int A=M;temp=BeginNum; //--------将BeginNum赋给temp作为寻道时的当前所在磁道号for(int i=0;i<N;i++){for(int j=0;j<N;j++) //-------寻找最短的寻道长度{if(abs(TrackOrder[j]-temp)<A&&Finished[j]==false){A=abs(TrackOrder[j]-temp);n=j;}else continue;}Finished[n]=true; //-------将已经寻找到的Finished赋值为trueMoveDistance[i]=A; //-------寻道长度temp=TrackOrder[n]; //-------当前寻道号。
《操作系统》实验教学指导书2.1
天津理工大学华信软件学院《操作系统》实验教学指导书2.1课程代码:课程名称:操作系统/ Operating System开课院(系)、实验室:华信软件学院C408机房适用专业:软件工程专业实验指导书名称:《操作系统实验教程(Linux版)》第七章指导教师:张一鸣实验二进程的建立与调度(2.1 进程的建立与控制)1. 实验目的(1)加深对进程概念的理解,明确进程和程序的区别。
(2)进一步理解并发的概念,明确并发与并行的异同。
(3)分析进程竞争资源现象,学习解决进程互斥的方法。
(4)了解Linux系统中进程通信的基本原理。
2. 实验内容(1)进程的创建编写一段源程序,使用系统调用fork()创建一个子进程,当此程序运行时,在系统中有一个父进程和一个子进程活动。
让每一个进程在屏幕上显示一个字符串;父进程显示字符“I am the parent”并显示其进程id和子进程的id;子进程显示字符串“I am the child”,并显示其进程id。
(2)进程的控制进程并发图,如图1所示。
设有7个进程,其执行次序如图1所示。
在Linux下使用C语言利用系统调用命令fork(),execl(),exit(),wait()进行藐视,调用execl()函数的时候,模拟调用/bin/echo下的echo命令,向控制台输出一句可鉴别是哪个进程的字符串即可。
3. 准备知识(1)阅读Linux的sched.h源文件,加深对进程管理概念的理解。
(2)阅读Linux的fork.c源文件,分析进程的创建过程。
4. 实验原理Linux是一个多用户多任务的操作系统,即在同一个时间内,可以有多个进程同时执行。
常用的单CPU单核计算机在同一个时间片内只能执行一条命令,Linux使用了一种称为“进程调度(process scheduling)”的手段来实现。
首先,为每个进程分配一定的运行时间片,该时间片通常以毫秒为单位,然后依照某种调度算法,从就绪队列中选择一个进程投入运行,其他的进程暂时等待。
Linux操作系统实验三
Linux操作系统实验三淮海⼯学院计算机⼯程学院实验报告书课程名:《⽹络操作系统》题⽬:软件包管理与进程管理班级:⽹络132学号:2013122836姓名:张凤霞评语:成绩:指导教师:批阅时间:年⽉⽇⼀、⽬的与要求1、掌握linux软件包管理⽅法。
2、掌握RPM命令的使⽤。
3、熟悉图形模式下软件管理⼯具的使⽤。
4、掌握常⽤进程管理的命令。
⼆、实验内容与题⽬1、下载并安装telnet软件包(分别采⽤-i、-ivh)。
2、删除上述安装的软件。
3、利⽤rpm查询上述软件4、校验上述⽂件5. 利⽤图形模式下的软件包管理⼯具安装和删除“Eclipse”的有关软件。
6、下载并安装OpenOffice套件。
7、查看进程的统计信息(静态、动态)。
8、查看进程名中包含“con”字符串的进程信息9、后台运⾏gedit软件后,并把它调⼊前台,然后杀死它。
10、利⽤crontab实现每周⼀、三、五的17:30时,打包备份/etc/httpd⽬录中的⽂件到你的主⽬录。
11、练习at、pkill、pstree等命令的使⽤。
12、练习YUM软件⼯具的使⽤。
三、实验步骤与源程序1、下载并安装telnet软件包(分别采⽤-i、-ivh)。
2、删除上述安装的软件。
3、利⽤rpm查询上述软件4、校验上述⽂件5. 利⽤图形模式下的软件包管理⼯具安装和删除“Eclipse”的有关软件。
6、下载并安装OpenOffice套件。
静态动态8、查看进程名中包含“con”字符串的进程信息9、后台运⾏gedit软件后,并把它调⼊前台,然后杀死它。
10、利⽤crontab实现每周⼀、三、五的17:30时,打包备份/etc/httpd⽬录中的⽂件到你的主⽬录11、练习at、pkill、pstree等命令的使⽤。
12、练习YUM软件⼯具的使⽤。
四、结果分析和实验体会通过本次实验学会了可以通过rpm命令来安装和卸载软件,还有学会了进程管理的命令,可以⽤软件管理⼯具安装卸载软件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
2016 至2017 学年第二学期
一、实验一
编写Shell程序,判断文件是否是符号链接文件,如果是则移动到/temp目录下,否则不做任何处理;
流程:
1.建立符号链接文件
2.运行脚本测试
3.查看/temp目录下的结果
操作流程如图1所示(源代码见附录):
图1 实验一
二、实验二
编写Shell程序,使用select命令生成选择菜单,允许用户在菜单中选择,并基于选择执行相应的命令;
如图2,该脚本有三个选项,分别为显示日期、显示时间和退出。
(源代码见附录)
图2 select命令
三、实验三
编写Shell程序,分别采用while和until循环结构来计算1~50之间所有奇数之和。
运行结果见图3,源代码参照附录。
图3 求和
四、心得体会
通过这次实验,初步了解Bash Shell的语法规则和基本的流程控制。
复习了课上讲过的脚本知识。
源代码
实验三sum_until.sh。