网络操作系统课程设计

合集下载

网络操作系统课程设计计划书1

网络操作系统课程设计计划书1

11级网络工程专业《网络操作系统》课程设计教学计划2013-2014学年第一学期一、实习目的与要求1、掌握操作系统基本理论与管理方式;2、在算法基础上,解决实际的管理功能问题,提高学生实际应用、编程的能力;3、涉及编程题目时,要求详细书写文档内容。

二、实习内容项目一、进程机制与并发程序设计(一) linux下生产者与消费者的问题实现1、实验目的(1)掌握基本的同步互斥算法,理解生产者和消费者同步的问题模型。

(2)了解linux中多线程的并发执行机制,线程间的同步和互斥。

2、实验要求(1)创建生产者和消费者线程在linux环境下,创建一个控制台进程,在此进程中创建n个线程来模拟生产者或者消费者。

这些线程的信息由本程序定义的“测试用例文件”中予以指定。

该文件的格式和含义如下:31 P 32 P 43 C4 14 P 25 C 3 1 2 4第一行说明程序中设置几个临界区,其余每行分别描述了一个生产者或者消费者线程的信息。

每一行的各字段间用Tab键隔开。

不管是消费者还是生产者,都有一个对应的线程号,即每一行开始字段那个整数。

第二个字段用字母P或者C区分是生产者还是消费者。

第三个字段表示在进入相应线程后,在进行生产和消费动作前的休眠时间,以秒计时;这样做的目的是可以通过调整这一列参数,控制开始进行生产和消费动作的时间。

如果是代表生产者,则该行只有三个字段。

如果代表消费者,则该行后边还有若干字段,代表要求消费的产品所对应的生产者的线程号。

所以务必确认这些对应的线程号存在并且该线程代表一个生产者。

(2)生产和消费的规则在按照上述要求创建线程进行相应的读写操作时,还需要符合以下要求:①共享缓冲区存在空闲空间时,生产者即可使用共享缓冲区。

②从上边的测试数据文件例子可以看出,某一生产者生产一个产品后,可能不止一个消费者,或者一个消费者多次地请求消费该产品。

此时,只有当所有的消费需求都被满足以后,该产品所在的共享缓冲区才可以被释放,并作为空闲空间允许新的生产者使用。

linux网络操作系统课程设计

linux网络操作系统课程设计

linux网络操作系统课程设计一、课程目标知识目标:1. 理解Linux网络操作系统的基本概念,掌握其体系结构;2. 学会使用Linux命令行,熟悉常见网络配置与故障排除方法;3. 掌握Linux文件系统管理,了解文件权限与安全策略;4. 了解Linux下的网络服务与进程管理,理解系统启动流程。

技能目标:1. 能够独立安装与配置Linux操作系统,进行基本的网络设置;2. 熟练运用Linux命令行进行文件操作、权限管理及进程控制;3. 能够分析网络问题,利用Linux命令行工具进行故障排查;4. 学会编写简单的Shell脚本,实现自动化网络管理任务。

情感态度价值观目标:1. 培养学生对Linux网络操作系统的兴趣,激发探索精神;2. 培养学生的团队协作意识,学会分享与互助;3. 引导学生树立正确的网络道德观念,遵守网络安全规范;4. 培养学生的自主学习能力,养成良好的学习习惯。

本课程针对高年级学生,结合学科特点,注重理论与实践相结合。

在教学过程中,要求教师以学生为中心,关注个体差异,引导学生在实践中掌握知识,提高技能。

通过本课程学习,使学生具备一定的Linux网络操作系统应用与管理能力,为未来的职业发展打下坚实基础。

二、教学内容1. Linux操作系统概述- 系统特点与优势- 体系结构解析2. Linux命令行操作- 常用基本命令- 文件系统结构与命令- 权限管理命令3. 网络配置与故障排除- 网络接口配置- 路由与网关设置- 常用网络故障排除命令4. 文件系统管理- 文件与目录操作- 文件权限与归属管理- 磁盘空间管理5. 网络服务与进程管理- 常见网络服务原理与配置- 进程查看与管理- 系统启动流程与控制6. Shell脚本编程- 基本语法与结构- 常用命令与控制结构- 实例分析与编写本教学内容依据课程目标,按照系统性与科学性原则进行组织。

教学大纲明确各部分内容的教学安排,结合教材章节,确保学生能够逐步掌握Linux网络操作系统的相关知识。

网络操作系统课程设计3

网络操作系统课程设计3

课程设计网络操作系统课课程设计域的方式管理网络设计专业名称:网络工程年级: 07级学生学号: 12007248266 学生姓名:徐宁生网络操作系统课程设计设计名称域的方式管理网络设计设计要求根据本学校的网络和组织机构的实际情况,设计用域的方式来管理本校的校园网。

要求能够合理地设计组织单位,用户组,为用户设置账户属性等。

设计工具一台标准配置的计算机,操作系统为windows sever 2003或者windows sever 2000设计内容域和活动目录能够在局域网中建立并管理域控制器,并且正确认识和理解活动目录的基本概念和作用,可以为网络中的用户合理地划分用户组,建立用户账号;并且偶那个过账户属性设置来管理用户账户。

能够合理地划分域,根据实际情况建立组织单位,并正确地将组织单位委派控制给用户管理。

能够为域中的用户和计算机创建合理的组策略对象,充分发挥组策略的作用,提高管理效率和管理水平。

域”的真正含义指的是服务器控制网络上的计算机能否加入的计算机组合。

一提到组合,势必需要严格的控制。

所以实行严格的管理对网络安全是非常必要的。

在对等网模式下,任何一台电脑只要接入网络,其他机器就都可以访问共享资源,如共享上网等。

尽管对等网络上的共享文件可以加访问密码,但是非常容易被破解。

在由Windows 9x构成的对等网中,数据的传输是非常不安全的。

不过在“域”模式下,至少有一台服务器负责每一台联入网络的电脑和用户的验证工作,相当于一个单位的门卫一样,称为“域控制器(Domain Controller,简写为DC)”。

域控制器中包含了由这个域的账户、密码、属于这个域的计算机等信息构成的数据库。

当电脑联入网络时,域控制器首先要鉴别这台电脑是否是属于这个域的,用户使用的登录账号是否存在、密码是否正确。

如果以上信息有一样不正确,那么域控制器就会拒绝这个用户从这台电脑登录。

不能登录,用户就不能访问服务器上有权限保护的资源,他只能以对等网用户的方式访问Windows共享出来的资源,这样就在一定程度上保护了网络上的资源。

《操作系统》课程设计

《操作系统》课程设计

《操作系统》课程设计一、课程目标知识目标:1. 让学生掌握操作系统的基本概念,包括进程、线程、内存管理、文件系统等核心知识;2. 了解操作系统的历史发展,掌握不同类型操作系统的特点及使用场景;3. 掌握操作系统的性能评价方法和常用的调度算法。

技能目标:1. 培养学生运用操作系统知识解决实际问题的能力,如分析系统性能瓶颈、优化系统资源分配等;2. 培养学生具备基本的操作系统编程能力,如进程创建、线程同步、文件操作等;3. 提高学生的团队协作能力和沟通能力,通过小组讨论和项目实践,学会共同解决问题。

情感态度价值观目标:1. 培养学生对操作系统学科的兴趣,激发学生的学习热情,使其形成积极向上的学习态度;2. 培养学生具备良好的信息素养,尊重知识产权,遵循法律法规;3. 培养学生的创新精神和批判性思维,敢于质疑、勇于探索,形成独立思考的能力。

课程性质:本课程为计算机科学与技术专业的核心课程,旨在让学生掌握操作系统的基本原理和实现方法,提高学生的系统分析和编程能力。

学生特点:学生具备一定的编程基础和计算机系统知识,具有较强的逻辑思维能力和动手实践能力。

教学要求:结合学生特点和课程性质,注重理论与实践相结合,通过案例分析和项目实践,帮助学生将所学知识内化为具体的学习成果。

在教学过程中,关注学生的学习进度和反馈,及时调整教学策略,确保课程目标的实现。

二、教学内容1. 操作系统概述:介绍操作系统的定义、发展历程、功能、类型及特点,对应教材第一章内容。

- 操作系统的起源与发展- 操作系统的功能与类型- 操作系统的主要特点2. 进程与线程:讲解进程与线程的概念、状态、调度算法,对应教材第二章内容。

- 进程与线程的定义与区别- 进程状态与转换- 进程调度算法3. 内存管理:分析内存管理的基本原理、策略和技术,对应教材第三章内容。

- 内存分配与回收策略- 虚拟内存技术- 页面置换算法4. 文件系统:介绍文件系统的基本概念、结构、存储原理,对应教材第四章内容。

计算机网络课程设计报告

计算机网络课程设计报告

计算机网络课程设计报告一、设计背景。

计算机网络课程设计是计算机专业学生的重要课程之一,通过该课程的学习,学生可以系统地了解计算机网络的基本原理、技术和应用,培养学生的计算机网络设计和应用能力。

本次课程设计旨在通过实际操作,帮助学生深入理解计算机网络的知识,提高他们的实际动手能力和解决问题的能力。

二、设计目标。

1. 理论与实践相结合,通过设计,使学生能够将所学的理论知识应用到实际的网络设计中,提高他们的实际操作能力。

2. 提高解决问题的能力,设计中设置一些难点和问题,引导学生思考和解决,提高他们的问题解决能力。

3. 培养团队协作精神,设计中设置一些需要团队合作的任务,培养学生的团队协作意识和能力。

三、设计内容。

1. 网络拓扑设计,要求学生设计一个小型局域网的网络拓扑结构,包括主机、交换机、路由器等设备的连接方式和布局。

2. IP地址规划,要求学生为局域网中的每台主机和设备规划合理的IP地址,要求考虑到网络的扩展性和管理的便利性。

3. 网络服务配置,要求学生配置局域网中的基本网络服务,如DHCP服务、DNS服务等,使局域网内的主机能够正常通信和访问互联网。

4. 网络安全设置,要求学生设置基本的网络安全策略,包括防火墙配置、访问控制策略等,保障局域网的安全和稳定运行。

5. 网络故障排除,设计一些故障场景,要求学生能够快速定位和解决网络故障,提高他们的故障排除能力。

四、设计要求。

1. 设计报告,学生需要提交完整的设计报告,包括设计思路、实施步骤、配置截图等内容。

2. 实际操作,学生需要在实际的网络设备上进行配置和实验,完成设计要求。

3. 问题解答,学生需要对设计中遇到的问题进行解答和总结,形成经验和教训。

五、设计评价。

1. 设计报告评价,评价学生的设计报告是否完整、清晰、符合要求。

2. 实际操作评价,评价学生的实际操作能力和解决问题的能力。

3. 问题解答评价,评价学生对设计中遇到的问题的解答和总结是否合理、深入。

操作系统课程设计Linux

操作系统课程设计Linux

操作系统课程设计Linux一、教学目标本课程的教学目标是使学生掌握Linux操作系统的核心概念、原理和应用技能。

通过本课程的学习,学生将能够:1.理解操作系统的基本原理,包括进程管理、内存管理、文件系统和输入/输出系统。

2.掌握Linux操作系统的安装、配置和管理方法。

3.熟练使用Linux命令行界面,进行日常操作和系统管理。

4.掌握Linux常用命令、 shell脚本编写和系统监控工具的使用。

5.了解Linux操作系统在服务器、嵌入式设备和云计算等领域的应用。

二、教学内容本课程的教学内容分为五个部分:1.操作系统概述:介绍操作系统的定义、功能和分类,以及Linux操作系统的历史和发展。

2.进程管理:讲解进程的基本概念、进程控制、进程同步和互斥、死锁及其解决方法。

3.内存管理:介绍内存分配与回收策略、内存保护、虚拟内存和分页分段机制。

4.文件系统:讲解文件和目录结构、文件访问控制、文件系统性能优化和磁盘空间分配策略。

5.输入/输出系统:介绍I/O设备管理、中断和DMA机制、设备驱动程序和I/O调度策略。

三、教学方法本课程采用多种教学方法相结合的方式,以提高学生的学习兴趣和主动性:1.讲授法:教师讲解操作系统的核心概念和原理,引导学生掌握基本知识。

2.讨论法:学生针对实际案例和问题进行讨论,培养学生的思考和分析能力。

3.案例分析法:分析Linux操作系统的实际应用案例,使学生了解操作系统的应用场景。

4.实验法:安排实验室课时,让学生亲自动手进行系统安装、配置和调试,提高学生的实践能力。

四、教学资源本课程的教学资源包括:1.教材:选用权威、实用的Linux操作系统教材,如《Linux操作系统原理与应用》。

2.参考书:提供相关的学术论文、技术博客和在线文档,供学生拓展阅读。

3.多媒体资料:制作课件、教学视频和演示文稿,辅助学生理解和记忆。

4.实验设备:提供Linux服务器、虚拟机和实验室环境,让学生进行实际操作。

网络操作系统及配置管理课程设计

网络操作系统及配置管理课程设计

网络操作系统及配置管理课程设计一、课程设计概述网络操作系统及配置管理课程是计算机科学与技术专业的一门重要课程,旨在培养学生在企业和组织的计算机网络中全面掌握网络操作系统的功能、安装、配置及管理方法。

通过本次课程设计,学生将进一步巩固已有的理论知识,了解网络操作系统的实际应用,并通过实践掌握网络配置管理技术。

二、课程设计要求本次课程设计要求学生掌握以下知识点:1. Windows Server安装与配置•安装Windows Server 2016操作系统;•熟悉Windows Server 2016的基础操作;•配置Windows Server 2016的网络设置;•配置Windows Server 2016的域、用户和组策略。

2. Linux服务器安装与配置•安装Linux服务器操作系统;•熟悉Linux服务器的基础操作;•配置Linux服务器的网络设置;•配置Linux服务器的域和用户权限。

3. VMware虚拟化技术•熟悉VMware虚拟化技术;•使用VMware搭建Windows Server和Linux服务器;•配置虚拟机网络设置;•对虚拟机进行备份和恢复。

三、课程设计步骤本次课程设计包含如下步骤:1. 实验环境配置学生需要在实验室或自己的计算机上,安装好Windows Server虚拟机、Linux 服务器虚拟机和VMware虚拟化软件。

确保虚拟机可以正常运行,并且虚拟机之间可以互相通信。

2. Windows Server安装与配置学生需要安装Windows Server 2016操作系统,并且在服务器上配置域、用户和组策略等。

2.1 安装Windows Server 2016操作系统•创建新的虚拟机,安装Windows Server 2016;•配置网络设置,确保虚拟机能够通过网络连接其他虚拟机;•安装Windows Server自带的管理工具,包括远程桌面服务、Hyper-V 和Active Directory Domn Services等。

网络操作系统应用课程设计

网络操作系统应用课程设计

网络操作系统应用课程设计1. 简介网络操作系统是一种可以被多个用户同时访问和共享的操作系统。

它可以运行在一台或多台计算机上,并且可以支持多用户同时工作。

本课程设计将要求学生使用网络操作系统来完成一项任务并进行评估。

该任务将包括服务器端和客户端的设置与功能。

2. 任务描述在本次课程设计中,学生将需要实现以下任务:•首先,需要设置服务器和客户端。

•之后,将需要创建多个用户账户并分配权限。

•尝试进行文件共享,包括上传和下载文件,以及远程访问。

•最后,需要实现该系统的管理和监控,例如查找并解决故障以及保护系统安全。

3. 实现细节下面将具体介绍该任务的实现细节。

3.1 服务器端服务器端是网络操作系统的核心部分,它将负责管理和分配资源。

学生需要安装和设置服务器端,并确保其正常运行。

该服务器端将运行Windows操作系统,并要求学生按照计划分配各种服务和配置。

3.1.1 用户和权限学生需要在服务器端创建多个用户账户,并根据任务需求设置他们的权限。

这将包括文件和目录访问、安全性和网络连接等方面的权限。

3.1.2 文件共享学生需要在服务器端上设置文件目录,并允许客户端共享这些文件。

要实现文件共享,学生需要创建共享文件夹并授权给指定用户。

该操作将使用Windows的共享文件夹功能。

3.1.3 远程访问学生要通过Internet或Intranet实现远程访问,允许远程客户端访问服务器上的共享文件和应用程序等。

这个过程需要安装和设置远程桌面连接,进行端口映射,同时保证系统的安全性。

3.1.4 系统管理和监控学生需要维护服务器的系统安全和稳定性。

这将包括查找和解决故障,防止恶意攻击和数据泄漏等方面的任务。

该过程需要使用Windows Server的管理和监控工具。

3.2 客户端客户端是用户接入网络操作系统的入口,学生需要实现一个客户端界面,并且能够与服务器端相互通信。

3.2.1 用户登录和权限从客户端访问服务器需要登录验证。

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

操作系统的课程设计实验(shell程序)用C语言编写一个简单的shell程序,希望达到以下目的:用C语言编写清晰易读、设计优良的程序,并附有详细的文档。

熟悉使用Linux下的软件开发工具,例如gcc、gdb和make。

在编写系统应用程序时熟练使用man帮助手册。

学习使用POSIX/UNIX系统调用、对进程进行管理和完成进程之间的通信理解并发程序中的同步问题。

锻炼在团队成员之间的交流与合作能力。

熟悉虚拟机软件VMWare的操作与使用熟悉Linux操作系统的基本操作与命令的使用掌握gcc编译器的基本使用,并能使用gcc编译器编写简单的程序实验环境本实验的程序用C语言编写,使用makefile文件编译整个程序,生成一个名为ysh可执行程序,在终端输入“./ysh”即可执行。

makefile文件的内容如下:ysh:ysh.c1.2 实验要求1.2.1 ysh解释程序的重要特征本实验要实现一个简单的命令解释器,也就是Linux中的shell程序。

实验程序起名为ysh,要求其设计类似于目前流行的shell解释程序,如bash、csh、tcsh,但不需要具备那么复杂的功能。

ysh程序应当具有如下一些重要的特征:l 能够执行外部程序命令,命令可以带参数。

.。

l 能够执行fg、bg、cd、history、exit等内部命令。

l 使用管道和输入输出重定向。

l 支持前后台作业,提供作业控制功能,包括打印作业的清单,改变当前运行作业的前台/后台状态,以及控制作业的挂起、中止和继续运行。

除此之外,在这个实验中还须做到:l 使用make工具建立工程。

l 使用调试器gdb来调试程序。

l 提供清晰、详细的设计文档和解决方案。

1.2.2 ysh解释程序的具体要求1. Shell程序形式本实验的ysh程序设计不包括对配置文件和命令行参数的支持。

如果实现为像bash那样支持配置文件,当然很好,但本实验并不要求。

ysh应提供一个命令提示符,如ysh>,表示接收用户的输入,每次执行完成后再打印下一个命令提示符ysh>。

当用户没有输入时,ysh需要一直处于随时等待输入状态,同时在屏幕上显示一些必要的信息。

2. 外部命令和内部命令在大多数情况下,用户输入的命令是执行存储在文件系统中的可执行程序,我们叫做外部命令或外部程序。

ysh应当支持在执行这些程序时可以将输入输出重新定向到一个文件,并允许若干个程序使用管道串联起来。

从本实验的角度来讲,我们把由管道连接起来的复合命令以及单独使用的命令统称为作业。

外部命令的形式是一系列分隔的字符串。

第一个字符串是可执行程序的名字,其他的是传给这个外部程序的参数。

如果第一个字符串所声明的可执行文件并不存在或者不可执行.则认为这个命令是错误的。

解释器还须支持一些内部命令,这些命令在ysh程序内部实现了特定的动作,下面是一些内部命令,如果用户提交了一个内部命令,ysh 应当按照下面的描述执行相应动作。

l exit:结束所有的子进程并退出ysh。

l jobs:打印当前正在后台执行的作业和挂起的作业信息。

输出信息应采用便于用户理解的格式。

jobs自身是一条内部命令,所以不需要显示在输出上。

l fg %<int>:把<int>所标识的作业放到前台运行。

如果这个作业原来已经停止,那么让它继续运行。

shell应当在打印新的命令提示符之前等待前台运行的子进程结束。

l bg %<int>:在后台执行<int>标识的已挂起的进程。

3.命令行当用户在提示符后面输入命令时,输入的整行内容叫做“命令行字符串”,ysh应当保存每一条命令行字符串,直到它表示的作业执行结束,其中包括后台作业和被挂起的作业。

ysh应当给每一个命令行字符串赋一个非负整数标识符。

这个整数用来标识存储作业的数据结构,作业的数据结构应包含整个命令行字符串所表示的内容。

一旦命令行字符串代表的作业执行结束,ysh就要删掉表示这个作业的数据结构。

标识符可以循环使用。

对于包含内部命令的命令行字符串,不需要为它们建立作业的数据结构,因为它们本身的内容全部包含在ysh程序中。

4.前台和后台作业ysh应当能够执行前台和后台作业。

shell在前台作业执行结束之前要一直等待。

而在开始执行后台作业时要立刻打印出提示符ysh>,让用户输入下一条命令。

前台作业的执行总是优先于执行一个后台作业,ysh不需要在打印下一个提示符前等待后台作业的完成,无论是否有后台作业的执行,只要完成一个前台作业,便立即输出提示符ysh>。

一个后台作业结束时,ysh应当在作业执行结束后立刻打印出一条提示信息。

下面语法中会在命令语法分析程序中介绍相应的语法来支持后台作业。

5.特殊键又称组合键。

通过终端驱动程序,特殊的组合键可以产生信号给ysh,程序应当对这些信号做出适当的响应。

l Ctrl+Z:产生SIGTSTP信号,这个信号不是挂起ysh,而是让shell挂起在前台运行的作业,如果没有任何前台作业,则该特殊键无效。

l Ctrl+C:产生SIGINT信号,这个信号不是中止ysh,而是通过ysh发出信号杀死前台作业中的进程。

如果没有任何前台作业,则该特殊键无效。

6.分析用户输入1) 分隔符和特殊字符分析用户输入的语法分析器应具有下面介绍的功能,它能够检查用户的输入错误。

如果用户输入的某些地方出错了,ysh应提供合理的出错信息。

就像商业级别的shell一样,ysh每次接受用户输入的一行命令,在用户按下回车键(Enter)后开始执行分析动作。

空命令不产生任何操作,而只是打印一个新提示符。

定义空格符为分隔符,ysh应能处理命令行中间和前后出现的重复空格符。

某些字符被称做“元字符",它们在用户输入的上下文中具有特定的含义。

这些字符包括“&、| 、<、>“。

shell假设这些字符不会出现在程序名、参数名和文件名中,它们是ysh的保留字符。

下面几小节会解释这些元字符的含义。

2) 内部命令如果命令行字符串符合前面介绍的内部命令的格式,它就作为一个内部命令被解释。

如果不是,就要考虑可能是外部程序的执行,或者是错误的。

3) I/O重定向一个程序命令后面可能还跟有元字符“<”或“>”,它们是重定向符号,而在重定向符号后面还跟着一个文件名。

在“<”的情况下,程序的输入被重定向到一个指定的文件中。

在“>”的情况下,程序的输出被重定向到一个指定的文件中。

如果输出文件不存在,需要创建一个输出文件。

如果输入文件不存在,则认为是出现了错误。

4) 管道和协同程序在一条命令行中当若干个命令被元字符“|”分隔开时,这个元字符代表管道符号。

在这种情况下,ysh为每一个子命令都创建一个进程,并把它们的输入/输出用管道连接起来。

例如下面这条命令行:progA argA1 argA2<infile | progB argB1>outfile应生成progA和progB两个进程,progA的输入来自文件infile,progA的输出是progB的输入,并且progB的输出是文件outfile。

这种命令行可以通过进程间通信中的管道来实现。

含有一个和多个管道的命令会在如下几种情况下产生错误:l 当其任何一个子程序执行出错时。

l 除了第一个子程序以外的其他子程序的输入被重定向。

l 除了最后一个子程序以外的其他子程序的输出被重定向。

由管道连接的多个进程所组成的作业只有当其所有的子进程都执行完毕后才算结束。

5)后台作业当用户需要在后台执行一个作业时,可以在作业命令的后面加上元字符“&”。

用户以该种方式输入的作业命令都必须放在后台执行,同时并不影响用户与终端的交互。

6)语法下面给出的语法规则描述图提供了控制用户输入的一种更规范的描述形式。

如果使用Linux中的现有工具lex和yacc来建立命令行分析器,还需要对这个语法进行修改,以便使它支持LALR(1)(Look Ahead Left Reduction)分析方法。

这个语法并不包括特殊键,因为它们不会在用户输入时显示出来,而是需要单独处理。

CommandLine代表用户的合法输入,它作为ysh要执行的一条“指令”。

这里假设存在一个词法分析器,它将空格符作为分隔符,并识别元字符作为一个词法记号等。

CommandLine := NULLFgCommandLineFgCommandLine&FgCommandLine := SimpleCommandFirstCommand MidCommand LastCommandSimpleCommand := ProgInvocation InputRedirect OutputRedirectFirstCommand := ProgInvocation InputRedirectMidCommand := NULL| ProgInvocation MidCommandLastCommand := |ProgInvocation OutputRedirectProgInvocation := ExecFi le Args .InputRedirect := NULL,<STRINGOutputRedirect := NULL>STRINGExecFile := STRINGArgs := NULLSTRING ArgsSTRING := NULLCHAR STRINGCHAR := 0 |1 |…| 9| a |b |…| z | A | B |…| Z7.实验步骤建议(1)阅读关于fork、exec、wait和exit系统调用的man帮助手册。

(2)编写小程序练习使用这些系统调用。

(3)阅读关于函数tcsetpgrp和setpgid的man帮助手册。

(4)练习编写控制进程组的小程序,要注意信号SIGTTIN和SIGTTOU。

(5)设计命令行分析器(包括设计文档)。

(6)实现命令行分析器。

(7)使用分析器,写一个简单的shell程序,使它能执行简单的命令。

(8)增加对程序在后台运行的支持,不必担心后台作业运行结束时要打印一条信息(这属于异步通知)。

增加jobs命令(这对于调试很有帮助)。

(9)增加输入输出重定向功能。

(10)添加代码支持在后台进程结束时打印出一条信息。

(11)添加作业控制特征,主要实现对组合键Ctrl+Z、Ctrl+C的响应,还有实现fg和bg命令功能。

(12)增加对管道的支持。

(13)实现上面的所有细节并集成。

(14)不断测试。

(15)写报告。

cc ysh.c—o ysh主要代码:#include <stdio.h>#include <ctype.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/wait.h>#include <math.h>#include <signal.h>#include <stdlib.h>#include "ysh.h"#define NO_PIPE -1#define FD_READ 0#define FD_WRITE 1int is_founded(char * cmd){int k = 0;while(envpath[k] != NULL){ strcpy(buf,envpath[k]);strcat(buf,cmd);if(access(buf,F_OK) == 0){ return 1;}return 0;}void getenviron(int n,char * s){ int i = 0,j = 0,k = 0;char c;char buff[80];char * p;while((c=s[i]) != '=') { buff[i++] = c;} buff[i++] = '\0';if(strcmp(buff,"PATH") == 0) {while(s[i] != '\0'){ if(s[i] == ':') {buff[j++] = '/';buff[j] = '\0';p = (char *)malloc(strlen(buff) + 1);strcpy(p,buff);envpath[k++] = p;envpath[k] = NULL;j = 0;i++;} else {buff[j] = s[i];j++;i++;}}} elsefprintf(stderr,"No match");}int getline(int fd,char * buf){ int i = 0;while(read(fd,& c,1)) {buf[i++] = c;if(c == '\n') {buf[i-1] = '\0';return i;}} return i;}void init_environ(){int fd,n;char buf[80];if((fd = open("ysh_profile",O_RDONLY,660)) == -1) { printf("init environ variable error!\n");exit(1);}while((n = getline(fd,buf)) != 0) {getenviron(n,buf);}envhis.start = 0;envhis.end = 0;head = end = NULL;}int pipel(char * input,int len){ char * argv[10][30];char * filename[0];int i,j,k,is_bg = 0;int li_cmd = 0;int fd[10][1],pipe_in = -1;int pipe_out = -1,flag = 0;pid_t pid;for(i = 0,j = 0,k = 0;i <= len;i++) {if((input[i] == ' ') || (input[i] == '\t') || (input[i] == '\0') || (input[i] == '|') || (input[i] == '>') || (input[i] == '\n')){if((input[i] == '|') || (input[i] == '>')){if(input[i] == '>') {flag =1;}if(j > 0 ) {buf[j++] = '\0';argv[li_cmd][k] = (char *)malloc(sizeof(char) * j);strcpy(argv[li_cmd][k],buf);k++;}argv[li_cmd][k] = (char *)0;li_cmd++;k = 0;j = 0;}if(j == 0) {continue;} else {buf[j++] = '\0';if(flag == 0) {argv[li_cmd][k] = (char *)malloc(sizeof(char) * j);strcpy(argv[li_cmd][k],buf);k++;} else{filename[0] = (char *)malloc(sizeof(char) * j);strcpy(filename[0],buf);}}j = 0;if((input[i] == '&') && (input[i] == '\0')) {is_bg = 1;continue;}buf[j++] = input[i];}}argv[li_cmd][k++] = NULL;for(i = 0;i <= 10;i++) {fd[i][FD_READ] = NO_PIPE;fd[i][FD_WRITE] = NO_PIPE;}for(i = 0;i < li_cmd;i++) {if(pipe(fd[i]) == -1) {printf("Can not open pipe!\n");return 0;}}for(i = 0;i < li_cmd;i++) {if(is_founded(argv[i][0]) == 0) {printf("Can not found command!\n");break;}}if(i != 0) {pipe_in = fd[i - 1][FD_READ];} else {pipe_in = NO_PIPE;}if(i != li_cmd) {pipe_out = fd[i][FD_WRITE];{ if(flag == 1) {if((pipe_out = open(filename[0],O_WRONLY | O_CREAT | O_TRUNC,S_IRUSR | S_IWUSR)) == -1) {printf("Can not open %s\n",filename[0]);return 0;}} else {pipe_out = NO_PIPE;}}if((pid = fork()) < 0) {printf("Fork failed!\n");return 0;}if(pid == 0) {if(pipe_in == NO_PIPE) {close(pipe_in);}if(pipe_out == NO_PIPE) {close(pipe_out);}if(pipe_out != NO_PIPE) {dup2(pipe_out,1);close(pipe_out);}if(pipe_in != NO_PIPE) {dup2(pipe_in,0);close(pipe_in);}execv(buf,argv[i]);} else {if(is_bg == 0) {waitpid(pid,NULL,0);}close(pipe_in);close(pipe_out);}return 0;}void add_history(char * inputcmd){envhis.end = (envhis.end + 1) % HISNUM;if(envhis.end == envhis.start) {envhis.start = (envhis.start + 1) % HISNUM;}strcpy(envhis.his_cmd[envhis.end],inputcmd); }void history_cmd(){int i,j = 0;if(envhis.start == envhis.end) {return;}else if(envhis.start < envhis.end) {for(i = envhis.start + 1;i <= envhis.end;i++) { printf("%d\t%s\n",j,envhis.his_cmd[i]);j++;}} else {for(i = envhis.start + 1;i < HISNUM;i++) { printf("%d\t%s\n",j,envhis.his_cmd[i]);j++;}for(i = 0;i <= envhis.end;i++) {printf("%d\t%s\n",j,envhis.his_cmd[i]);j++;}}}void cd_cmd(char * route){if(route != NULL) {if(chdir(route) < 0)printf("cd;%s Error file or directory!\n",route);}}void jobs_cmd(){struct NODE * p;int i = 1;p = head;if(head != NULL) {do{printf("%d %d %s\t%s\n",i,p -> pid,p -> state,p -> cmd);i++;p = p -> link;}while(p != NULL);}elseprintf("No jobs!\n");}void add_node(char * input_cmd,int node_pid){struct NODE * p;p = (struct NODE *)malloc(sizeof(struct NODE));p -> pid = node_pid;strcpy(p -> state,input_cmd);strcpy(p -> state,"running");p -> link = NULL;if(head == NULL) {head = p;end = p;} else {end -> link = p;end = p;}}void del_node(int sig,siginfo_t * sip){struct NODE * q;struct NODE * p;int id;if(sig_z == 1) {sig_z = 0;goto out;}id = sip -> si_pid;p = q = head;if(head == NULL)goto out;while(p -> pid != id && p -> link != NULL) {p = p -> link;}if(p -> pid != id)goto out;if(p == head)head = head -> link;else {while(q -> link != p) {q = q -> link;}if(p == end) {end = q;q -> link = NULL;} else {q -> link = p -> link;}}free(p);out:return;}void setflag(){sig_flag = 1;}void ctrl_z(){struct NODE * p;int i = 1;if(pid1 == 0) {goto out;}if(head != NULL) {p = head;while((p -> pid != pid1) && (p -> link != NULL)) {p = p -> link;}if(p -> pid == pid1) {strcpy(p -> state,"stopped");} else{add_node(input,pid1);strcpy(end -> state,"stopped");}}else{add_node(input,pid1);strcpy(end -> state,"stopped");}sig_z = 1;kill(pid1,SIGSTOP);for(p = head;p -> pid != pid1;p = p -> link){i++;}printf("[%d]\t%s\t%s\n",i,end -> state,end -> cmd);pid1 = 0;out:return;}void bg_cmd(int job_num){struct NODE * p;int i = 0;p = head;for(i = 1;i < job_num;i++){p = p -> link;}kill(p -> pid,SIGCONT);strcpy(p -> state,"running");}void fg_cmd(int job_num){struct NODE * p;int i = 0;p = head;for(i = 1;i < job_num;i++){p = p -> link;}strcpy(p -> state,"running");strcpy(input,p -> cmd);pid1 = p -> pid;signal(SIGTSTP,ctrl_z);kill(p -> pid,SIGCONT);waitpid(p -> pid,NULL,0);}int main(){init_environ();while(1){char c;char * arg[20];int i = 0,j = 0,k = 0;int is_pr = 0,is_bg = 0;int input_len = 0,path;int pid = 0,status = 0;struct sigaction action;action.sa_sigaction = del_node;sigfillset(& action.sa_mask);action.sa_flags = SA_SIGINFO;sigaction(SIGCHLD,& action,NULL);signal(SIGTSTP,ctrl_z);path = get_current_dir_name();printf("ysh@%s ",path);while(((c = getchar()) == ' ') || (c == '\t') || (c == EOF)) {;}if(c == '\n'){continue;}while(c != '\n'){buf[input_len++] = c;c = getchar();}buf[input_len] = '\0';input = (char *)malloc(sizeof(char) * (input_len + 1)); strcpy(input,buf);for(i = 0,j = 0,k = 0;i <= input_len;i++){if((input[i] == '<') || (input[i] == '>') || (input[i] == '|')) {if(input[i] == '|'){pipel(input,input_len);add_history(input);free(input);}elseredirect(input,input_len);add_history(input);free(input);}is_pr = 1;break;}}if(is_pr == 1){continue;}for(i = 0,j = 0,k = 0;i <= input_len;i++){if((input[i] == ' ') || (input[i] == '\0')){if(j == 0){continue;}else{buf[j++] = '\0';arg[k] = (char *)malloc(sizeof(char) * j);strcpy(arg[k++],buf);j = 0;}}else{if((input[i] == '&') && (input[i + 1] == '\0'))is_bg = 1;continue;}buf[j++] = input[i];}}if(strcmp(arg[0],"exit") == 0){add_history(input);printf("Bye bye!\n");free(input);break;}if(strcmp(arg[0],"history") == 0){add_history(input);history_cmd();free(input);continue;}if(strcmp(arg[0],"cd") == 0){add_history(input);for(i = 3,j = 0;i <= input_len;i++){buf[j++] = input[i];}buf[j] = '\0';arg[1] = (char *)malloc(sizeof(char) * j);strcpy(arg[1],buf);cd_cmd(arg[1]);free(input);continue;}if(strcmp(arg[0],"jobs") == 0){add_history(input);jobs_cmd();free(input);continue;}if(strcmp(arg[0],"bg") == 0){add_history(input);for(i = 0;i <= input_len;i++){if(input[i] == '%'){break;}}i++;for(;i <= input_len;i++){buf[j++] = input[i];}buf[j] = '\0';arg[1] = (char *)malloc(sizeof(char) * j);strcpy(arg[1],buf);bg_cmd(atoi(arg[1]));free(input);continue;}if(strcmp(arg[0],"fg") == 0){add_history(input);for(i = 0;i <= input_len;i++) {if(input[i] == '%'){break;}}i++;for(;i <= input_len;i++){buf[j++] = input[i];}buf[j] = '\0';arg[1] = (char *)malloc(sizeof(char) * j);strcpy(arg[1],buf);fg_cmd(atoi(arg[1]));free(input);continue;}if(is_pr == 0){arg[k] = (char *)malloc(sizeof(char));arg[k] = NULL;if(is_founded(arg[0]) == 0){printf("This command is not founed!\n");for(i = 0;i <= k;i++){free(arg[i]);}continue;}}add_history(input);if((pid = fork()) == 0){if(is_bg == 1){while(sig_flag == 0){signal(SIGUSR1,setflag);}sig_flag = 0;}}else{pid1 = pid;if(is_bg == 1) {add_node(input,pid1);kill(pid,SIGUSR1);pid1 = 0;} if(is_bg == 0){waitpid(pid,& status,0);}}if(is_bg == 1) {sleep(1);}for(i = 0;i < k;i++) {free(arg[i]);free(input);}}return 0;}。

相关文档
最新文档