UNIX操作系统课程设计

合集下载

UNIX操作系统教程第三版教学设计

UNIX操作系统教程第三版教学设计

UNIX操作系统教程第三版教学设计一、教学目标本课程旨在帮助学生掌握UNIX操作系统的基本知识和常用命令,培养其对操作系统的理解和应用能力。

通过本课程的学习,学生应当能够:•了解UNIX操作系统的发展历史和主要特点;•熟悉UNIX操作系统的基本命令,包括文件操作、目录操作、用户管理等;•能够使用常见的UNIX编辑器进行文本编辑和程序编写;•掌握UNIX主机的远程连接和文件传输方式。

二、教学内容本课程分为以下五个部分:1. UNIX操作系统概述•UNIX操作系统的历史及发展;•UNIX操作系统的主要特点和优势;•UNIX操作系统的应用领域和市场占有率。

2. UNIX基本命令•文件操作命令(ls、cat、cp、mv、rm等);•目录操作命令(cd、mkdir、rmdir等);•用户管理命令(useradd、userdel、passwd等);•系统管理命令(ps、top、kill等);•网络相关命令(ping、ifconfig、netstat等)。

3. UNIX编辑器•vi编辑器的基本使用方法;•vi编辑器的高级使用技巧;•emacs编辑器的基本使用方法。

4. UNIX主机远程连接和文件传输•ssh远程连接和文件传输;•sftp远程连接和文件传输;•scp远程文件传输。

5. UNIX操作系统其他主题•Shell脚本编写与执行;•系统进程管理与监控;•UNIX操作系统的安全性和备份策略。

三、教学方法1. 讲授采用传统的讲解教学方式,侧重理论知识和重点难点的讲解。

讲解时应当结合实际操作演示命令使用及实际应用场景。

2. 实验实验操作是本课程的重要环节。

学生应当按照指定的实验步骤进行实验,在操作中不断掌握命令操作的技巧和应用方法。

实验后,还应当进行相应的实验报告撰写和评分。

3. 讨论通过课堂讨论,学生可以了解到命令在实际应用中的使用场景,及使用中出现的问题,更进一步加深理解和掌握。

4. 答疑教师应当随时为学生的疑问提供解答,帮助学生圆满完成实验任务及作业编写。

UNIX基础教程第三版课程设计 (2)

UNIX基础教程第三版课程设计 (2)

UNIX基础教程第三版课程设计一、课程概述UNIX是一个多用户、多任务操作系统,它既适用于小型个人电脑,也可以适用于大型服务器。

本课程旨在通过UNIX基础教程第三版的学习,使学生掌握UNIX操作系统的基本概念、命令、文件系统、文件管理、以及进程管理等内容,为在工作中使用UNIX提供基础知识和技能。

二、课程目标1.理解UNIX的基本概念和哲学,包括文件结构、进程和命令行操作等;2.掌握UNIX基础命令,如文件操作、文本编辑、进程控制等;3.学会使用简单的shell脚本编程,实现文件处理、进程批量管理等自动化操作;4.理解UNIX用户和组的管理,以及权限控制;5.掌握常见UNIX服务器应用服务,如FTP、SSH、Web服务等。

三、课程大纲第一章 UNIX简介及环境搭建•UNIX概述•UNIX环境搭建•UNIX系统启动过程 ### 第二章 UNIX命令行操作•命令行模式介绍•常用命令•命令行操作技巧 ### 第三章文件管理•文件系统介绍•文件查找•文件操作•文件和目录权限控制 ### 第四章进程管理•进程介绍•进程管理命令•进程批量管理 ### 第五章管道和重定向•管道和重定向介绍•标准输入输出与文件描述符•管道和重定向命令 ### 第六章 shell编程•shell脚本介绍•shell程序设计基础•shell程序运行与调试 ### 第七章文本编辑器vim •vim介绍•vim基本操作•vim高级用法 ### 第八章 UNIX用户和组的管理•用户和组的概念•用户和组的管理命令 ### 第九章 UNIX服务器应用服务•常见UNIX服务器应用服务介绍•FTP服务器搭建和使用•SSH服务器搭建和使用•Web服务器搭建和使用 ### 第十章 UNIX高级应用•备份与恢复•磁盘管理•系统调优四、课程教学方法本课程采用理论授课和实践结合的教学模式,以讲解UNIX基本概念和使用技巧为主线,运用示例演练加深学生对UNIX的理解。

lunix课程设计

lunix课程设计

lunix课程设计一、教学目标本课程的教学目标是使学生掌握Linux操作系统的基本原理和使用方法,培养学生具备一定的Linux系统管理和维护能力。

具体目标如下:1.知识目标:–掌握Linux操作系统的基本概念、历史和发展趋势;–理解Linux系统的文件系统结构、进程管理、用户管理等方面的知识;–熟悉Linux系统的常用命令和操作界面;–了解Linux系统的网络配置和管理方法。

2.技能目标:–能够熟练使用Linux系统的命令行界面,进行文件操作、进程管理等工作;–能够配置和管理Linux系统的网络环境,实现基本的网络通信;–能够使用Linux系统的常用软件工具,进行系统监控和性能优化;–能够运用Linux系统的知识,解决实际问题和故障。

3.情感态度价值观目标:–培养学生对Linux操作系统的兴趣和好奇心,激发学生主动学习和探索的精神;–培养学生团队合作和分享的精神,鼓励学生参与开源社区和项目;–培养学生正确的信息安全意识,提高学生保护个人和网络安全的能力。

二、教学内容本课程的教学内容主要包括Linux操作系统的基本原理、使用方法和应用实践。

具体内容包括以下几个方面:1.Linux操作系统的基本概念和历史发展,包括Linux的起源、版本变迁和生态系统;2.Linux系统的文件系统结构,包括文件和目录的方式、权限管理等内容;3.Linux系统的进程管理,包括进程的概念、状态转换、进程调度和进程间通信等内容;4.Linux系统的用户管理,包括用户和组的概念、权限设置和用户环境配置等内容;5.Linux系统的网络配置和管理,包括网络接口配置、IP地址分配、网络服务和安全性设置等内容;6.Linux系统的常用命令和操作界面,包括文件操作命令、文本处理命令、系统管理命令等;7.Linux系统的软件安装和管理,包括包管理器的使用、软件安装和更新等内容;8.Linux系统的性能监控和优化,包括系统资源监控、性能分析工具和优化策略等内容;9.Linux系统的应用实践,包括使用Linux系统进行编程、服务器搭建和桌面应用等内容。

UNIX基础教程教学设计

UNIX基础教程教学设计

UNIX基础教程教学设计一、教学目标本次UNIX基础教学主要旨在:1.介绍UNIX基础知识,包括UNIX系统介绍、文件操作、文件编辑、文件管理等基础内容;2.培养学生熟练使用UNIX系统的技能,包括使用基础命令行操作、文本编辑等技能;3.提供实际案例让学生实践所学内容并且能够运用到实际工作中。

二、教学内容1. UNIX系统介绍UNIX是一个多用户、多任务的操作系统。

在此部分,我们将介绍:1.UNIX系统基础概念,包括UNIX操作系统的历史和架构;2.UNIX系统的命令行界面以及基础操作;3.UNIX系统的文件系统。

2. 基础命令行操作在此部分,我们将介绍:1.文件夹的创建、删除以及重命名;2.文件的创建、删除以及重命名;3.文件属性的查看和修改;4.目录的切换、查看和检索等。

3. 文件编辑在此部分,我们将介绍:1.使用vi文本编辑器;2.内容的插入、删除和查找功能;3.如何保存文件和退出编辑器。

4. 文件管理在此部分,我们将介绍:1.如何打包和压缩文件;2.如何进行文件的复制和移动;3.如何查看文件的内容和文件的比较等。

5. 综合案例在此部分,我们会结合实际的UNIX应用案例来让学生实践所学内容并且将所学内容运用到实际工作中。

三、教学方法本次UNIX基础教学采用以下教学方法:1.课堂讲解:对UNIX基础知识以及实际应用案例进行讲解;2.演示和操作:通过对基础命令和文本编辑器的演示和操作,让学生迅速掌握相关技能;3.个案实践:对学生提供具体的实践案例,通过实际操作巩固所学知识;4.小组讨论:鼓励学生进行小组讨论,相互学习、分享经验,并且讨论解决方法。

四、教学评估本次UNIX基础教学采用以下教学评估方式:1.期末考试:对全体学生进行UNIX系统的综合考试;2.平时作业:对学生在课上以及课下所完成的作业进行统计;3.个人报告:鼓励学生研究具体的UNIX操作应用,进行小组汇报。

UNIX基础教程教学设计 (2)

UNIX基础教程教学设计 (2)

UNIX基础教程教学设计一、教学目标本教学针对初学者,旨在让学生掌握UNIX操作系统的基础知识,并能够通过终端命令实现常用的文件操作、文本编辑等任务。

二、教学内容1.UNIX基础介绍–UNIX操作系统的发展历程–UNIX系统的体系结构和特点–UNIX操作系统的优势2.命令行界面的使用–终端窗口的打开和关闭–命令行输入和输出–快捷键的使用3.文件和目录的管理–文件和目录的创建、删除、修改及查看–文件和目录的权限管理–文件拷贝、移动、重命名–文件和目录的压缩和解压缩4.基本文本编辑器的使用–常用文本编辑器介绍–编辑器的基本使用方法–文本文件的读写和保存三、教学方法1.讲授法:通过教师的讲解,让学生理解UNIX系统的基本概念、命令行界面的使用方法,以及常用文件和目录管理命令的使用;2.示例法:以实际操作为主,运用实例演示命令的使用方法,让学生亲自实践,在操作中掌握知识;3.分组讨论法:在教学中加入分组讨论环节,让学生动手操作,提出自己的疑问和解决方法,加深对知识的理解;4.互动式教学法:教师和学生共同讨论,通过互动式教学方法让学生掌握更多的知识。

四、教学评估方式1.经过短期课程的教学,进行测试,检查学生对UNIX操作系统基本概念和使用方法的掌握情况;2.通过操作小练习的方式,考察学生对文件和目录的管理、文本编辑器的使用方法;五、参考资料1.《Unix/Linux编程实践教程》(第2版)2.《Unix网络编程》3.《Unix Shell编程》六、总结UNIX操作系统作为一种历史悠久的操作系统,在计算机科学领域扮演着重要的角色,掌握UNIX操作系统的基础知识对计算机科学专业学生来说是非常重要的。

本教学设计采用多种教学方法,使学生在操作命令的过程中不断提升自己的理论水平和实践操作能力。

Unix系统简明教程第二版课程设计

Unix系统简明教程第二版课程设计

Unix系统简明教程第二版课程设计目的本课程旨在介绍Unix系统的基本概念、组成部分、命令行操作以及常用工具的使用。

学生将会熟悉Unix系统的基本构造和工作原理,掌握常用命令以及脚本编写和调试的技巧,从而为操作系统和系统管理等相关学科奠定基础。

教学目标1.了解Unix系统的历史、特点和应用领域。

2.掌握Unix系统的基本命令行操作和文件系统组织方式。

3.熟悉常见的Unix系统命令,包括文件和目录操作、进程管理、网络和安全等内容。

4.理解Shell编程的基本概念、语法和调试技巧。

5.学会使用常见的Unix系统管理工具,如vim、grep和sed等。

教学内容第一部分 Unix系统基础知识1.Unix系统简介–Unix系统的历史和特点–Unix系统与其他操作系统的比较–Unix系统的应用领域2.Unix文件系统–文件系统的组成和层次结构–文件和目录的基本操作–文件类型和权限管理3.Unix Shell–Shell的作用和特点–Shell编程的基本语法–Shell编程的调试技巧第二部分 Unix系统命令1.文件和目录操作–文件和目录的查看和创建–文件和目录的复制、移动和删除–文件和目录的权限设置2.进程管理–进程的查看和管理–进程的控制和调试3.网络和安全–网络相关命令的使用–安全相关命令的使用第三部分 Unix系统管理工具1.vim编辑器–vim的特点和使用方法–vim的高级功能和配置技巧2.grep文本搜索工具–grep的作用和使用方法–grep的高级功能和应用例子3.sed文本处理工具–sed的作用和使用方法–sed的高级功能和应用例子教学方法1.讲授:通过授课讲解Unix系统的基本概念、命令行操作和常用工具的使用。

2.演示:通过演示实际操作流程和工具的使用,帮助学生更好地理解和掌握相关技能。

3.实验:通过实际操作和编程练习,加强学生对Unix系统的理解和掌握。

4.课堂讨论和问答环节:鼓励学生在讲授和演示环节提问,讲授者及时回答,并引导学生间互相交流,加深学习效果。

教你认识un教学教案

教你认识un教学教案

教你认识UNIX教学教案第一章:UNIX概述1.1 课程目标:了解UNIX操作系统的历史背景、特点和应用领域。

1.2 教学内容:1.2.1 UNIX的历史发展:介绍UNIX操作系统的起源、发展过程和版本变迁。

1.2.2 UNIX的特点:讲解UNIX操作系统的开放性、多用户、多任务、简洁性、高效性等特点。

1.2.3 UNIX的应用领域:介绍UNIX操作系统在服务器、嵌入式系统、科学研究等领域的应用。

1.3 教学方法:采用讲解、案例演示、讨论等方式进行教学。

第二章:UNIX基本操作2.1 课程目标:掌握UNIX操作系统的基本操作,包括文件操作、目录操作和文本编辑。

2.2 教学内容:2.2.1 文件操作:学习创建、删除、复制、移动文件和文件夹等操作。

2.2.2 目录操作:掌握目录的创建、删除、切换和查看目录内容等操作。

2.2.3 文本编辑:学习使用VI/VIM文本编辑器进行文本编辑和基本操作。

2.3 教学方法:采用讲解、操作演示、实践操作等方式进行教学。

第三章:UNIX文件权限与管理3.1 课程目标:了解UNIX文件权限的概念,掌握文件权限的设置与更改方法。

3.2 教学内容:3.2.1 文件权限概念:讲解UNIX文件权限的分类(读、写、执行)和表示方法。

3.2.2 文件权限设置与更改:学习使用`chmod`、`chown`、`chgrp`等命令进行文件权限的设置与更改。

3.3 教学方法:采用讲解、操作演示、实践操作等方式进行教学。

第四章:UNIX常用命令4.1 课程目标:掌握UNIX操作系统中常用的命令,提高操作效率。

4.2 教学内容:4.2.1 文件操作命令:学习`ls`、`cp`、`mv`、`rm`等文件操作命令的使用方法。

4.2.2 文本处理命令:掌握`grep`、`sed`、`awk`等文本处理命令的使用技巧。

4.2.3 系统管理命令:了解`ps`、`top`、`df`、`du`等系统管理命令的功能及使用方法。

unix操作系统课程设计

unix操作系统课程设计

unix操作系统课程设计一、课程目标知识目标:1. 理解Unix操作系统的基本概念,掌握其发展历程、特点及应用场景。

2. 学会使用Unix命令行界面,熟练掌握常用命令及其功能。

3. 掌握文件和目录权限管理,了解Unix系统的安全机制。

4. 了解Unix系统的进程管理,掌握基本的进程控制方法。

技能目标:1. 能够独立完成Unix操作系统的安装和配置。

2. 熟练运用Unix命令行进行文件操作、目录操作和文本处理。

3. 能够编写简单的Shell脚本,实现自动化任务。

4. 能够诊断和解决Unix系统中的常见问题。

情感态度价值观目标:1. 培养学生对操作系统原理的兴趣,激发学习热情。

2. 培养学生的团队协作意识,学会在团队中分享和交流Unix操作经验。

3. 培养学生严谨、细致的学习态度,养成良好的操作习惯。

4. 增强学生的信息安全意识,遵循法律法规,保护系统安全。

课程性质:本课程为理论与实践相结合的课程,注重培养学生的实际操作能力。

学生特点:学生具备一定的计算机基础知识,但对Unix操作系统了解不多,需要从基本概念和操作入手。

教学要求:以学生为中心,注重实践操作,结合实际案例进行教学,提高学生的实际应用能力。

在教学过程中,将课程目标分解为具体的学习成果,以便进行有效的教学设计和评估。

二、教学内容1. Unix操作系统概述- Unix发展历程- Unix系统特点- Unix应用场景2. Unix命令行操作- 常用命令介绍- 文件和目录操作- 文本处理命令- 命令行快捷键3. 文件权限与目录管理- 文件权限概念- 权限设置命令- 目录权限管理4. Unix进程管理- 进程基本概念- 进程查看命令- 进程控制方法5. Shell脚本编程- Shell概述- 基本语法- 流程控制语句- 脚本实例分析6. Unix系统安全- 用户与用户组管理- 系统安全机制- 常见安全问题及预防7. Unix实用工具与网络配置- 常用网络命令- 网络配置方法- 系统监控与性能优化教学内容安排与进度:第1-2周:Unix操作系统概述及命令行操作第3-4周:文件权限与目录管理第5-6周:Unix进程管理与Shell脚本编程第7-8周:Unix系统安全与实用工具第9-10周:网络配置与系统性能优化本教学内容根据课程目标,结合教材章节进行组织,注重科学性和系统性,确保学生在掌握基本概念和操作的基础上,能够逐步提高实际应用能力。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统课程设计模拟UNIX文件系统的设计及实现院系:国际教育学院班级:计07 – 4班姓名:符龙指导教师:孙昌立2011 年5 月18 日操作系统课程设计任务书一、题目:银行家算法二、设计要求(1)小组成员分工协作完成。

要求每个成员有自己相对独立的模块,同时要了解其他组员完成的内容。

(2)查阅相关资料,自学具体课题中涉及到的新知识。

(3)采用结构化、模块化程序设计方法设计,功能要完善,界面美观。

(4)所设计的系统应有菜单、动画和音乐。

(5)按要求写出课程设计报告,并于设计结束后1周内提交。

其主要内容包括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件总体设计、详细设计、软件的调试、总结、谢启、附录:带中文注释的程序清单、参考文献。

报告一律用A4纸打印,中文字体为宋体,西文字体用Time New Roma,一律用小四号字,行距采用“固定值”18磅,首行缩进2字符。

总体设计应配合软件总体模块结构图来说明软件应具有的功能。

详细设计应用传统或N-S流程图和屏幕抓图说明,调试的叙述应配合出错场景的抓图来说明出现了哪些错误,如何解决的。

三、课程设计工作量由于是设计小组团结协作完成设计任务,一般每人的程序量在200行有效程序行左右,不得抄袭。

四、课程设计工作计划2011年5月10日,指导教师讲课,学生根据题目准备资料;2011年5月12日,设计小组进行总体方案设计和任务分工;2011年5月13日~2009年6月23日,每人完成自己承担的程序模块并通过独立编译;2011年5月14日~2009年6月29日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行;2011年5月16日,验收、撰写报告;2011年5月18日,验收或总结。

指导教师签章教研室主任签章操作系统课程设计指导教师评语与成绩指导教师评语:课程设计表现成绩:课程设计验收成绩:课程设计报告成绩:课程设计总成绩:指导教师签章2009年7月日目录1.概述 (1)2.总体设计 (2)3.详细设计 (3)4.代码调试 (9)5.总结 (11)6.附录 (12)7. 参考文献 (30)一.概述【课设原理】UNIX 采用树型目录结构,每个目录表称为一个目录文件。

一个目录文件是由目录项组成的。

每个目录项包含16B ,一个辅存磁盘块(512B)包含32个目录项。

在目录项中,第1、2字节为相应文件的外存i 节点号,是该文件的内部标识;后14B 为文件名,是该文件的外部标识。

所以,文件目录项记录了文件内、外部标识的对照关系。

根据文件名可以找到辅存i 节点号,由此便得到该文件的所有者、存取权、文件数据的地址健在等信息。

UNIX 的存储介质以512B 为单位划分为块,从0开始直到最大容量并顺序加以编号就成了一个文件卷,也叫文件系统。

UNIX 中的文件系统磁盘存储区分配图如下: 0# 1#2#…K # K+1# K+2# K+3#… n #本次课程设计是要实现一个简单的模拟UNIX 文件系统。

我们在磁盘中申请一个二进制文件模拟UNIX 内存,依次初始化建立位示图区,I 节点区,数据块区。

并给已打开的文件建立文件打开表。

【课设内容】1.设计任务多用户、多级目录结构文件系统的设计与实现。

可以实现下列几条命令login 用户登录 logout 退出当前用户 dir 列文件目录 creat 创建文件delet 删除文件及目录树 open 打开文件 close 关闭文件 read 读文件 write 写文件 mkdir 创建目录 cd 改变文件目录 format 格式化文件系统 quit 退出文件系统2.文件系统应具有的基本功能i 节点区 文件存储区引导区管理区(1)多用户:usr1,usr2,usr3,……,usr8 (1-8个用户)(2)多级目录:可有多级子目录;(3)具有login (用户登录)(4)系统初始化(建文件卷、提供登录模块)(5)文件的创建: create(6)文件的打开:open(7)文件的读:read(8)文件的写:write(9)文件关闭:close(10)删除文件或目录:delet(11)创建目录(建立子目录):mkdir(12)改变当前目录:cd(13)列出文件目录:dir(14)退出:logout二.总体设计【算法思想】先建立512个块,每个块对应512个字节,在建立一个有512个元素的字符数组,每个元素对应相应的块号,不管是文件或是目录都有I节点,建立自己设定数目元素的I节点表,并依次把位图区,I节点表,数据块区每个元素映射到一个二进制文件上。

在每一次的操作中如果相应元素有变动,则对应在文件中更新输出相应数据,以便下一次启动程序的时候可以快速导入上一次的数据。

【系统总体框架图】【系统总体流程图】三.详细设计【各模块功能说明】1.format 模块 功能:格式化文件系统,即初始化文件系统,相当于硬盘的格式化。

将其中原有的用户及用户下的文件系统全部还原初始状态,即没有任何用户和目录、文件,也就是按设计的文件系统格式重建新的文件系统。

2. get_blknum 和release_blk 模块 功能:get_blknum 找到一个空闲数据块,并修改对应位图号元素为1。

release_blk 修改对应的位图元素,并把文件系统中对应的数据块清零。

开始文件系统是否建立? 在内存中申请内存空间 将磁盘上的文件读入内存YN用户登录模块,输入用户名和密码,可以 在程序中设定,不用保存在文件系统中 用户名、密码对吗? 执行init(),进行初始化 操作,进入用户子目录执行command(),对用户输入的命令进行解析和 执行。

若数据被修改或新建立,则保存主存i 节 点和数据块的内容到内存的文件系统,并写回磁 盘,保存修改。

若输入错误命令则显示出错信息。

退出用户(logout)吗?用户输入quit 吗?结束执行format(), 建立文件系统NNNYYY3. init()模块功能:读入文件系统4.quit()模块功能:退出系统5 .creat()模块功能:创建文件,分配一空目录项,分配磁盘块。

可用位示图。

填写该空目录项。

如文件长度(0),文件名,类型等。

6. open()模块功能:打开文件,并判断文件类型和打开方式。

如果文件没有在文件打开表中就在文件打开表中建立该文件项。

7. close()模块功能:关闭文件,删除该文件的用户打开文件表目。

8. write()模块功能:写文件,需要先打开文件。

并判断文件权限。

写完后修改文件系统中的对应数据区。

9. read()模块功能:读文件。

需先打开文件。

读入相应数据块的内容到缓冲区,然后输出。

10.delet()模块功能:如果参数是文件则删除文件,如果是目录则删除该目录下的所有文件和目录。

11.mkdir()功能:建立新的目录,先在I节点表中找到一个未使用的,并初始化该I节点,并在文件系统中对应更新输出。

12.cd()功能:将当前目录切换到当前目录的一个子目录下或当前目录的父目录。

程序流程图各功能模块流程图是是否 否遍历i 节点区argv[1]=”..” 目录是否存在找到的目录i 节点号送当前目录inum_cur当前目录的父i 节点号送当前目录inum_cur开始结束改变当前目录cd()读入位示图信息到内存读入i 节点信息到内存当前目录为根目录初始化打开文件表 结束开始初始化函数init()是否否是提示输入用户名和密码用户名是否存在创建新用户 读入用户信息到内存开始密码是否正确结束用户登陆login()是 是否否遍历i 节点区i 节点的父节点是否为当前目录i 节点区是否遍历完输出文件名或目录名开始 结束显示目录dir()是是否否遍历i 节点区要创建的目录是否存在是否有空的i 节点遍历i 节点区 分配一个目录i 节点开始 结束创建目录mkdir()是否是否 是否遍历i 节点区要打开的文件是否存在提示输入打开模式将打开文件信息写入打开文件信息表file_array[]遍历打开文件表file_array[]文件是否已经打开提示输入开始位置和读字节数 调用读块操作,读出块内字符模式是否为可读 开始 结束开始结束 打开文件open()读文件read()是是否否 遍历i 节点区要创建的文件是否存在是否有空的i 节点遍历i 节点区分配一个文件i 节点开始 结束创建文件creat()是否是否遍历打开文件表file_array[]文件是否已经打开提示输入写入字节数 调用写块操作,写入块内字符模式是否为可写是否遍历打开文件表file_array[]文件是否已经打开将打开文件表项标志位置-1 file_array[i].inum = -1开始结束 写文件write()开始结束关闭文件close()四.代码调试1.初始化和登陆文件系统第一次运行程序2.建立新目录,显示当前目录下的文件和目录,并转到新目录下是否遍历i 节点区要删除的文件是否存在 释放文件对应的i 节点区inode_array[i].inum = -1释放两个磁盘块文件是否大于的一块释放一个磁盘块是否开始结束删除文件delet()3.建立新的文件,打开,写,读。

4.clear清屏后,dir查看当前目录下文件信息5.返回根目录下,并删除根目录下所有子目录和文件6.logout退出登录或quit退出程序。

五. 总结开始第一天构思,不断的筛选证明模拟UNIX下的内存方法,并在网络上查找相应的UNIX环境资料。

接下来几天开始实践动手,从整体框架开始构思,到各个细节端口的实现。

操作系统是计算机科学与技术专业中的一门重要基础课,目的是让我们了解操作系统的基本概念,理解计算机系统的资源如何组织,操作系统如何有效地管理这些系统资源,用户如何通过操作系统与计算机系统打交道。

通过课程设计,可以进一步理解在计算机系统上运行的其它各类操作系统,并懂得在操作系统的支持下建立自己的应用系统。

操作系统课程设计,对于训练我们掌握程序设计、熟悉上机操作和程序调试技术都有重要作用。

重点培养我们的思维能力、创新能力和排错能力。

通过课程设计,进一步融会贯通教材内容,掌握程序各功能模块的工作原理,相互联系和来龙去脉,完整地建立系统的概念。

激发我的学习热情和主动性,培养我的独立工作能力,在实践活动中,将所学知识综合运用,增长才干,并积累经验。

对编程语言又有了更深一层次的认识,并对编程能力有所加强,但还是很多的不足有待改进,对于编程来说还需要大量的实践,才能在发现问题和解决问题中前进与提高。

六.附录源代码:// head.h文件#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <string.h>#include<stack>using namespace std;#define BLKSIZE 512 // 数据块的大小#define BLKNUM 512 // 数据块的块数#define INODESIZE 32 // i节点的大小#define INODENUM 32 // i节点的数目#define FILENUM 8 // 打开文件表的数目//用户typedef struct{char user_name[10]; // 用户名char password[10]; // 密码} User;//i节点typedef struct{short inum; // 文件i节点号char file_name[10]; // 文件名char type; // 文件类型char user_name[10]; // 文件所有者short iparent; // 父目录的i节点号short length; // 文件长度short address[2]; // 存放文件的地址} Inode;//打开文件表typedef struct{short inum; // i节点号char file_name[10]; // 文件名short mode; // 读写模式(1:read, 2:write,// 3:read and write) } File_table;// 申明函数void login(void);void init(void);int analyse(char *);void save_inode(int);int get_blknum(void);void read_blk(int);void write_blk(int);void release_blk(int);void pathset();void del(int);// 用户命令处理函数void help(void);void cd(void);void dir(void);void mkdir(void);void creat(void);void open(void);void read(void);void write(void);void close(void);void delet(void);void logout(void);void command(void);void quit();//main.cpp文件#include "head.h"//定义全局变量char c hoice;int argc; // 用户命令的参数个数char *argv[5]; // 用户命令的参数int inum_cur; // 当前目录char t emp[2*BLKSIZE]; // 缓冲区User user; // 当前的用户char b itmap[BLKNUM]; // 位图数组Inode inode_array[INODENUM]; // i节点数组File_table file_array[FILENUM]; // 打开文件表数组char i mage_name[10] = "data.dat"; // 文件系统名称FILE *fp; // 打开文件指针//创建映像hd,并将所有用户和文件清除void format(void){int i;Inode inode;printf("Will be to format filesystem...\n");printf("WARNING:ALL DATA ON THIS FILESYSTEM WILL BE LOST!\n");printf("Proceed with Format(Y/N)?");scanf("%c", &choice);getchar();if((choice == 'y') || (choice == 'Y')){if((fp=fopen(image_name, "w+b")) == NULL){printf("Can't create file %s\n", image_name);exit(-1);}for(i = 0; i < BLKSIZE; i++)fputc('0', fp);inode.inum = 0;strcpy(inode.file_name, "/");inode.type = 'd';strcpy(er_name, "/");inode.iparent = 0;inode.length = 0;inode.address[0] = -1;inode.address[1] = -1;fwrite(&inode, sizeof(Inode), 1, fp);inode.inum = -1;for(i = 0; i < 31; i++)fwrite(&inode, sizeof(Inode), 1, fp);for(i = 0; i < BLKNUM*BLKSIZE; i++)fputc('\0', fp);fclose(fp);// 打开文件user.txtif((fp=fopen("user.txt", "w+")) == NULL){printf("Can't create file %s\n", "user.txt");exit(-1);}fclose(fp);printf("Filesystem created successful.Please first login!\n");}return ;}// 功能: 用户登陆,如果是新用户则创建用户void login(void){char *p;int flag;char user_name[10];char password[10];char file_name[10] = "user.txt";do{printf("login:");gets(user_name);printf("password:");p=password;while(*p=getch()){if(*p == 0x0d){*p='\0'; //将输入的回车键转换成空格break;}printf("*"); //将输入的密码以"*"号显示p++;}flag = 0;if((fp = fopen(file_name, "r+")) == NULL){printf("\nCan't open file %s.\n", file_name);printf("This filesystem not exist, it will be create!\n");format();login();}while(!feof(fp)){fread(&user, sizeof(User), 1, fp);// 已经存在的用户, 且密码正确if(!strcmp(er_name, user_name) &&!strcmp(user.password, password)){fclose(fp);printf("\n");return ;}// 已经存在的用户, 但密码错误else if(!strcmp(er_name, user_name)){printf("\nThis user is exist, but password is incorrect.\n");flag = 1;fclose(fp);break;}}if(flag == 0) break;}while(flag);// 创建新用户if(flag == 0){printf("\nDo you want to creat a new user?(y/n):");scanf("%c", &choice);gets(temp);if((choice == 'y') || (choice == 'Y')){strcpy(er_name, user_name);strcpy(user.password, password);fwrite(&user, sizeof(User), 1, fp);fclose(fp);return ;}if((choice == 'n') || (choice == 'N'))login();}}// 功能: 将所有i节点读入内存void init(void){int i;if((fp = fopen(image_name, "r+b")) == NULL){printf("Can't open file %s.\n", image_name);exit(-1);}// 读入位图for(i = 0; i < BLKNUM; i++)bitmap[i] = fgetc(fp);// 显示位图// 读入i节点信息for(i = 0; i < INODENUM; i++)fread(&inode_array[i], sizeof(Inode), 1, fp);// 显示i节点// 当前目录为根目录inum_cur = 0;// 初始化打开文件表for(i = 0; i < FILENUM; i++)file_array[i].inum = -1;}// 功能: 分析用户命令, 将分析结果填充argc和argv// 结果: 0-13为系统命令, 14为命令错误int analyse(char *str){int i;char temp[20];char *ptr_char;char *syscmd[]={"help", "cd", "dir", "mkdir", "create", "open", "read", "write","close", "delet", "logout", "clear","format","quit"};argc = 0;for(i = 0, ptr_char = str; *ptr_char != '\0'; ptr_char++){if(*ptr_char != ' '){while(*ptr_char != ' ' && (*ptr_char != '\0'))temp[i++] = *ptr_char++;argv[argc] = (char *)malloc(i+1);strncpy(argv[argc], temp, i);argv[argc][i] = '\0';argc++;i = 0;if(*ptr_char == '\0') break;}}if(argc != 0){for(i = 0; (i < 14) && strcmp(argv[0], syscmd[i]); i++);return i;}elsereturn 14;}// 功能: 将num号i节点保存到hd.datvoid save_inode(int num){if((fp=fopen(image_name, "r+b")) == NULL){printf("Can't open file %s\n", image_name);exit(-1);}fseek(fp, BLKNUM +num*sizeof(Inode), SEEK_SET);fwrite(&inode_array[num], sizeof(Inode), 1, fp);fclose(fp);}// 功能: 申请一个数据块int get_blknum(void){int i;for(i = 0; i < BLKNUM; i++)if(bitmap[i] == '0') break;// 未找到空闲数据块if(i == BLKNUM){printf("Data area is full.\n");exit(-1);}bitmap[i] = '1';if((fp=fopen(image_name, "r+b")) == NULL){printf("Can't open file %s\n", image_name);exit(-1);}fseek(fp, i, SEEK_SET);fputc('1', fp);fclose(fp);return i;}// 功能: 将i节点号为num的文件读入tempvoid read_blk(int num){int i, len;char ch;int add0, add1;len = inode_array[num].length;add0 = inode_array[num].address[0];if(len > 512)add1 = inode_array[num].address[1];if((fp = fopen(image_name, "r+b")) == NULL){printf("Can't open file %s.\n", image_name);exit(-1);}fseek(fp, BLKSIZE+INODESIZE*INODENUM +add0*BLKSIZE, SEEK_SET);ch = fgetc(fp);for(i=0; (i < len) && (ch != '\0') && (i < 512); i++){temp[i] = ch;ch = fgetc(fp);}if(i >= 512){fseek(fp,BLKSIZE+INODESIZE*INODENUM+add1*BLKSIZE, SEEK_SET);ch = fgetc(fp);for(; (i < len) && (ch != '\0'); i++){temp[i] = ch;ch = fgetc(fp);}}temp[i] = '\0';fclose(fp);}// 功能: 将temp的内容输入hd的数据区void write_blk(int num){int i, len;int add0, add1;add0 = inode_array[num].address[0];len = inode_array[num].length;if((fp = fopen(image_name, "r+b")) == NULL){printf("Can't open file %s.\n", image_name);exit(-1);}fseek(fp, BLKSIZE+INODESIZE*INODENUM+add0*BLKSIZE, SEEK_SET);for(i=0; (i<len)&&(temp[i]!='\0')&&(i < 512); i++)fputc(temp[i], fp);if(i == 512){add1 = inode_array[num].address[1];fseek(fp, BLKSIZE+INODESIZE*INODENUM+add1*BLKSIZE, SEEK_SET);for(; (i < len) && (temp[i] != '\0'); i++)fputc(temp[i], fp);}fputc('\0', fp);fclose(fp);}// 功能: 释放文件块号为num的文件占用的空间void release_blk(int num){FILE *fp;if((fp=fopen(image_name, "r+b")) == NULL){printf("Can't open file %s\n", image_name);exit(-1);}bitmap[num] = '0';fseek(fp, num, SEEK_SET);fputc('0', fp);fclose(fp);}// 功能: 显示帮助命令void help(void){printf("command: \n\help --- show help menu \n\clear --- clear the screen \n\cd --- change directory \n\mkdir --- make directory \n\create --- create a new file \n\open --- open a exist file \n\read --- read a file \n\write --- write something to a file \n\close --- close a file \n\delet --- delete a exist file or directory \n\format --- format a exist filesystem \n\logout --- exit user \n\quit --- exit this system\n");}//设置文件路径void pathset(){char path[50];int m,n;if(inode_array[inum_cur].inum == 0)strcpy(path,er_name);else{strcpy(path,er_name);m=0;n=inum_cur;while(m != inum_cur){while(inode_array[n].iparent != m){n = inode_array[n].iparent;}strcat(path,"/");strcat(path,inode_array[n].file_name);m = n;n = inum_cur;}}printf("[%s]$",path);}// 功能: 切换目录(cd .. 或者cd dir1)void cd(void){int i;if(argc != 2){printf("Command cd must have two args. \n");return ;}if(!strcmp(argv[1], ".."))inum_cur = inode_array[inum_cur].iparent;else{for(i = 0; i < INODENUM; i++)if((inode_array[i].inum>0)&&(inode_array[i].type=='d')&&(inode_array[i].iparent==inum_cur)&&!strcmp(inode_array[i].file_name,argv[1])&&!strcmp(inode_array[i].user_name,er_name))break;if(i == INODENUM)printf("This directory isn't exsited.\n");elseinum_cur = i;}}// 功能: 显示当前目录下的子目录和文件(dir)void dir(void){int i;int dcount=0,fcount=0;short bcount=0;if(argc != 1){printf("Command dir must have one args. \n");return ;}// 遍历i节点数组, 显示当前目录下的子目录和文件名for(i = 0; i < INODENUM; i++)if((inode_array[i].inum> 0) &&(inode_array[i].iparent == inum_cur)&&!strcmp(inode_array[i].user_name,er_name)){if(inode_array[i].type == 'd'){dcount++;printf("%-20s<DIR>\n", inode_array[i].file_name);}else{fcount++;bcount+=inode_array[i].length;printf("%-20s%12d bytes\n", inode_array[i].file_name,inode_array[i].length);}}printf("\n %d file(s)%11d bytes\n",fcount,bcount);printf(" %d dir(s) %11d bytes FreeSpace\n",dcount,1024*1024-bcount);}// 功能: 在当前目录下创建子目录(mkdir dir1)void mkdir(void){int i;if(argc != 2){printf("command mkdir must have two args. \n");return ;}// 遍历i节点数组, 查找未用的i节点for(i = 0; i < INODENUM; i++)if(inode_array[i].inum < 0) break;if(i == INODENUM){printf("Inode is full.\n");exit(-1);}inode_array[i].inum = i;strcpy(inode_array[i].file_name, argv[1]);inode_array[i].type = 'd';strcpy(inode_array[i].user_name,er_name);inode_array[i].iparent = inum_cur;inode_array[i].length = 0;save_inode(i);}// 功能: 在当前目录下创建文件(creat file)void create(void){int i;if(argc != 2){printf("command creat must have two args. \n");return ;}for(i = 0; i < INODENUM; i++){if((inode_array[i].inum > 0) &&(inode_array[i].type == 'f') &&!strcmp(inode_array[i].file_name, argv[1])) {printf("This file is exsit.\n");return ;}}for(i = 0; i < INODENUM; i++)if(inode_array[i].inum < 0) break;if(i == INODENUM){printf("Inode is full.\n");exit(-1);}inode_array[i].inum = i;strcpy(inode_array[i].file_name, argv[1]);inode_array[i].type = 'f';strcpy(inode_array[i].user_name, er_name);inode_array[i].iparent = inum_cur;inode_array[i].length = 0;save_inode(i);}// 功能: 打开当前目录下的文件(open file1)void open(){int i, inum, mode, filenum;if(argc != 2){printf("command open must have two args. \n");return ;}for(i = 0; i < INODENUM; i++)if((inode_array[i].inum > 0) &&(inode_array[i].type == 'f') &&!strcmp(inode_array[i].file_name,argv[1])&&!strcmp(inode_array[i].user_name,er_name))break;if(i == INODENUM){printf("The file you want to open doesn't exsited.\n");return ;}inum = i;printf("Please input open mode:(1: read, 2: write, 3: read and write):");scanf("%d", &mode);getchar();if((mode < 1) || (mode > 3)){printf("Open mode is wrong.\n");return;}for(i = 0; i < FILENUM; i++)if(file_array[i].inum < 0) break;if(i == FILENUM){printf("The file table is full, please close some file.\n");return ;}filenum = i;file_array[filenum].inum = inum;strcpy(file_array[filenum].file_name, inode_array[inum].file_name);file_array[filenum].mode = mode;printf("Open file %s by ", file_array[filenum].file_name);if(mode == 1) printf("read only.\n");else if(mode == 2) printf("write only.\n");else printf("read and write.\n");}// 功能: 从文件中读出字符(read file1)void read(){int i, inum;if(argc != 2){printf("command read must have two args. \n");return;}for(i = 0; i < FILENUM; i++)if((file_array[i].inum > 0) &&!strcmp(file_array[i].file_name,argv[1]))break;if(i == FILENUM){printf("Open %s first.\n", argv[1]);return ;}else if(file_array[i].mode == 2){printf("Can't read %s.\n", argv[1]);return ;}inum = file_array[i].inum;printf("The length of %s:%d.\n", argv[1], inode_array[inum].length);if(inode_array[inum].length > 0){read_blk(inum);for(i = 0; (i < inode_array[inum].length) && (temp[i] != '\0'); i++) printf("%c", temp[i]);}}// 功能: 向文件中写入字符(write file1)void write(){int i, inum, length;if(argc != 2){printf("Command write must have two args. \n");return ;}for(i = 0; i < FILENUM; i++)if((file_array[i].inum>0)&&!strcmp(file_array[i].file_name,argv[1])) break;if(i == FILENUM){printf("Open %s first.\n", argv[1]);return ;}else if(file_array[i].mode == 1){printf("Can't write %s.\n", argv[1]);return ;}inum = file_array[i].inum;printf("The length of %s:%d\n", inode_array[inum].file_name, inode_array[inum].length);if(inode_array[inum].length == 0){i=0;inode_array[inum].address[0] = get_blknum();printf("Input the data(CTRL+Z to end):\n");while(i<1023&&(temp[i]=getchar())!=EOF) i++;temp[i]='\0';length=strlen(temp)+1;inode_array[inum].length=length;if(length > 512)inode_array[inum].address[1] = get_blknum();save_inode(inum);write_blk(inum);}elseprintf("This file can't be written.\n");}// 功能: 关闭已经打开的文件(close file1)void close(void){int i;if(argc != 2){printf("Command close must have two args. \n");return ;}for(i = 0; i < FILENUM; i++)if((file_array[i].inum > 0) &&!strcmp(file_array[i].file_name, argv[1])) break;if(i == FILENUM){printf("This file doesn't be opened.\n");return ;}else{file_array[i].inum = -1;printf("Close %s success!\n", argv[1]);}}//回收i节点,有文件则删除文件void del(int i){inode_array[i].inum = -1;if(inode_array[i].length > 0){release_blk(inode_array[i].address[0]);if(inode_array[i].length >= 512)release_blk(inode_array[i].address[1]);}save_inode(i);}//删除子目录树和文件void delet(void){if(argc != 2){printf("Command delete must have two args. \n");return ;}int n,t,i;stack<int> istk;for(i = 0; i < INODENUM; i++)//查找待删除子目录if((inode_array[i].inum >=0) &&(inode_array[i].iparent == inum_cur)&&(!strcmp(inode_array[i].file_name,argv[1]))&&(!strcmp(inode_array[i].user_name,er_name))) {n=inode_array[i].inum;break;}if(i==INODENUM) puts("Directory ERROR");else{istk.push(n);while(!istk.empty()){t=istk.top();istk.pop();del(t);for(i = 0; i < INODENUM; i++)if((inode_array[i].inum >=0) &&(inode_array[i].iparent == t))istk.push(i);}}}// 功能: 退出当前用户(logout)void logout(){printf("Do you want to exit this user(y/n)?");scanf("%c", &choice);getchar();if((choice == 'y') || (choice == 'Y')){printf("\nCurrent user has exited!\n");login();}return ;}// 功能: 退出文件系统(quit)void quit(){printf("Do you want to exist(y/n):");scanf("%c", &choice);getchar();if((choice == 'y') || (choice == 'Y'))exit(0);}// 功能: 显示错误void errcmd(){printf("Command Error!!!\n");}//清空内存中存在的用户名void free_user(){int i;for(i=0;i<10;i++)er_name[i]='\0';}// 功能: 循环执行用户输入的命令, 直到logout// "help", "cd", "dir", "mkdir", "creat", "open","read", "write", "close", "delete", "logout", "clear", "format","quit"void command(void){char cmd[100];system("cls");do{pathset();gets(cmd);switch(analyse(cmd)){case 0:help(); break;case 1:cd(); break;case 2:dir(); break;case 3:mkdir(); break;case 4:create(); break;case 5:open(); break;case 6:read(); break;case 7:write(); break;case 8:close(); break;case 9:delet(); break;case 10:logout();break;case 11:system("cls");break;case 12:format();init();free_user();login();break;case 13:quit(); break;case 14:errcmd(); break;default:break;}}while(1);}// 主函数int main(void){login();init();command();return 0;}七. 参考文献1.汤子瀛编.《计算机操作系统》.西安电子科技大出版社。

相关文档
最新文档