操作系统实验一
- 格式:doc
- 大小:360.50 KB
- 文档页数:12
操作系统实验报告——OS Lab班级:姓名:学号:实验1 实验环境的使用本次实验主要学习了OS Lab的基本使用方法;练习编译、调试了EOS操作系统内核以及EOS应用程序。
无论是EOS操作系统内核还是EOS应用程序,开始时它们都只是一些源代码文件。
当编译器、链接器、软盘镜像编辑器等工具,对它们的源代码文件进行逐步转化后,它们就变成了可以在虚拟机(或者裸机)运行的EOS操作系统内核与EOS应用程序。
思考与练习思考生成EOS SDK文件夹的目的和作用。
查看EOS SDK文件夹中的内容,明白文件夹的组织结构和各个文件的来源和作用。
查看EOS应用程序包含了SDK文件夹中的哪些头文件,是如何包含的?答:操作系统通过向开发者提供SDK来开放其API,开发者在为操作系统编写应用程序时,通过使用SDK来调用API。
如果要为操作系统开发应用程序,就需要首先获得操作系统的SDK。
SDK为了向开发者提供操作系统的API,往往会包含头文件、导入库文件和动态链接库文件。
头文件的主要作用是导出操作系统使用的一些数据类型(例如操作系统中使用的结构体类型)和API函数的声明,一般会被放在SDK中的Inc(Include)文件夹中导入库文件(Import Library)是根据操作系统需要导出的API函数而生成的特定格式的二进制文件导入库文件。
导入库文件的主要作用是告诉应用程序的可执行文件,其调用的API 函数在操作系统中的地址,一般会被放在SDK中的Lib(Library)文件夹中。
动态链接库文件(Dynamic Link Library)是包含了操作系统导出的API函数的可执行代码的二进制文件。
动态链接库文件的格式一般与可执行文件是相同的,只是不能直接执行,一般会被放在SDK中的Bin(Binary)文件夹中。
在IDE 环境成功生成EOS的二进制文件后,会自动生成EOS SDK。
IDE环境会首先新建一个SDK文件夹,然后将eos.h(导出API函数的声明)、eosdef.h(导出数据类型的定义)和error.h(导出错误码)三个头文件复制到SDK文件夹中的INC文件夹中,将生成的四个二进制文件都复制到BIN 文件夹中(EOS SDK为了简单,将导入库文件也放入了BIN 文件夹,而没有使用LIB文件夹)。
操作系统安全实验1实验报告一、实验目的本次操作系统安全实验的主要目的是让我们深入了解操作系统的安全机制,通过实际操作和观察,掌握一些常见的操作系统安全配置和防护方法,提高对操作系统安全的认识和应对能力。
二、实验环境本次实验使用的操作系统为Windows 10 和Linux(Ubuntu 2004),实验设备为个人计算机。
三、实验内容与步骤(一)Windows 10 操作系统安全配置1、账户管理创建新用户账户,并设置不同的权限级别,如管理员、标准用户等。
更改账户密码策略,包括密码长度、复杂性要求、密码有效期等。
启用账户锁定策略,设置锁定阈值和锁定时间,以防止暴力破解密码。
2、防火墙配置打开 Windows 防火墙,并设置入站和出站规则。
允许或阻止特定的应用程序通过防火墙进行网络通信。
3、系统更新与补丁管理检查系统更新,安装最新的 Windows 安全补丁和功能更新。
配置自动更新选项,确保系统能够及时获取并安装更新。
4、恶意软件防护安装并启用 Windows Defender 防病毒软件。
进行全盘扫描,检测和清除可能存在的恶意软件。
(二)Linux(Ubuntu 2004)操作系统安全配置1、用户和组管理创建新用户和组,并设置相应的权限和归属。
修改用户密码策略,如密码强度要求等。
2、文件系统权限管理了解文件和目录的权限设置,如读、写、执行权限。
设置特定文件和目录的权限,限制普通用户的访问。
3、 SSH 服务安全配置安装和配置 SSH 服务。
更改 SSH 服务的默认端口号,增强安全性。
禁止 root 用户通过 SSH 登录。
4、防火墙配置(UFW)启用 UFW 防火墙。
添加允许或拒绝的规则,控制网络访问。
四、实验结果与分析(一)Windows 10 操作系统1、账户管理成功创建了具有不同权限的用户账户,并能够根据需求灵活调整权限设置。
严格的密码策略有效地增加了密码的安全性,减少了被破解的风险。
账户锁定策略在一定程度上能够阻止暴力破解攻击。
操作系统教程实验指导书实验一WINDOWS进程初识1、实验目的(1)学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。
(2)掌握WINDOWS API的使用方法。
(3)编写测试程序,理解用户态运行和核心态运行。
2、实验内容和步骤(1)编写基本的Win32 Consol Application步骤1:登录进入Windows,启动VC++ 6.0。
步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location”处输入工程目录。
创建一个新的控制台应用程序工程。
步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”, 然后在“File”处输入C/C++源程序的文件名。
步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。
编译成可执行文件。
步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows “命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序:E:\课程\os课\os实验\程序\os11\debug>hello.exe运行结果 (如果运行不成功,则可能的原因是什么?) :答:运行成功,结果:(2)计算进程在核心态运行和用户态运行的时间步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。
步骤2:在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。
步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。
篇一:操作系统实验报告完全版《计算机操作系统》实验报告班级:姓名:学号:实验一进程控制与描述一、实验目的通过对windows 2000编程,进一步熟悉操作系统的基本概念,较好地理解windows 2000的结构。
通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解windows 2000中进程的“一生”。
二、实验环境硬件环境:计算机一台,局域网环境;软件环境:windows 2000 professional、visual c++6.0企业版。
三、实验内容和步骤第一部分:程序1-1windows 2000 的gui 应用程序windows 2000 professional下的gui应用程序,使用visual c++编译器创建一个gui应用程序,代码中包括了winmain()方法,该方法gui类型的应用程序的标准入口点。
:: messagebox( null, “hello, windows 2000” , “greetings”,mb_ok) ;/* hinstance */ , /* hprevinstance */, /* lpcmdline */, /* ncmdshow */ )return(0) ; }在程序1-1的gui应用程序中,首先需要windows.h头文件,以便获得传送给winmain() 和messagebox() api函数的数据类型定义。
接着的pragma指令指示编译器/连接器找到user32.lib库文件并将其与产生的exe文件连接起来。
这样就可以运行简单的命令行命令cl msgbox.cpp来创建这一应用程序,如果没有pragma指令,则messagebox() api函数就成为未定义的了。
这一指令是visual studio c++ 编译器特有的。
接下来是winmain() 方法。
其中有四个由实际的低级入口点传递来的参数。
实验一熟悉Windows2000/XP中的进程和线程一、实验目的1、熟悉Windows2000/XP中任务管理器的使用。
2、通过任务管理器识别操作系统中的进程和线程的相关信息。
3、掌握利用spy++.exe来察看Windows中各个任务的更详细信息。
二、实验理论基础及教材对应关系1、实验理论基础:(1)操作系统中的进程和线程的概念;(2)进程PCB的各项指标含意;2、本实验内容主要对应于教材第2章。
三、实验内容与步骤1、启动操作系统自带的任务管理器:方法:直接按组合键Ctrl+Alt+Del,或者是在点击任务条上的“开始”“运行”,并输入“taskmgr.exe”。
如下图所示:2、调整任务管理器的“查看”中的相关设置,显示关于进程的以下各项信息,并完成下表(填满即可):表一:统计进程的各项主要信息3、从桌面启动办公软件“Word”,在任务管理器中找到该软件的登记,并将其结束掉。
再从任务管理器中分别找到下列程序:winlogon.exe、lsass.exe、csrss.exe、smss.exe,试着结束它们,观察到的反应是,原因是。
4、在任务管理器中找到进程“explorer.exe”,将之结束掉,并将桌面上你打开的所有窗口最小化,看看你的计算机系统起来什么样的变化、得到的结论是(说出explorer.exe进程的作用)。
5、运行“spy++.exe”应用软件,点击按钮“”,切换到进程显示栏上,查看进程“explorer.exe”的各项信息,并填写下表:表二:统计线程的各项信息进程:explorer.exe 中的各个线程6、注意某些线程前有“+”,如图所示:,说明二者之间的差异是。
四、实验材料的提交与成绩评定lsass.exe 系统进程,用于微软Windows系统的安全机制。
services.exe 微软Windows操作系统的一部分。
用于管理启动和停止服务。
winlogon.exe Windows 用户登陆程序,管理用户登录和退出。
操作系统实验年级2014 级专业学号姓名指导教师年月日实验一 Windows任务管理器的使用一、实验目的通过在Windows 任务管理器中对程序进程进行响应的管理操作,熟悉操作系统进程管理的概念,学习观察操作系统运行的动态性能.二、实验内容启动并进入Windows环境,单击Ctrl + Alt + Del键,或者右键单击任务栏,在快捷菜单中单击“任务管理器”命令,打开“任务管理器”窗口.1.分别查看每个选项卡的内容,了解相关参数的含义及其当前内容.2.在“进程”选项卡上单击“查看”菜单,然后单击“选择列”命令.单击要增加显示为列标题的项目,然后单击“确定”.分别了解“进程”选项卡各列的含义及其当前内容.3.为更改正在运行的程序的优先级,可在“进程”选项卡上右键单击您要更改的程序,指向“设置优先级”,然后单击所需的选项.更改进程的优先级可以使其运行更快或更慢(取决于是提升还是降低了优先级) ,但也可能对其他进程的性能有相反的影响.(查看进程管理器,说明按照名字序号前5个进程的主要用途和功能.)4、修改windows服务选项,将windows的远程用户修改注册表的服务设置成禁止. :打开控制面板→管理工具→服务→找到"Remote Registry",双击,启动类型设置为禁用.5、修改windows的磁盘管理并设定配额选项。
设定配额的磁盘格式必须是NTFS,如果你的硬盘是FAT32格式;可通过以下命令:convert 盘符:/fs:ntfs 将某一磁盘分区转为NTFS。
6、修改windows启动选项,将其中的前三个自动启动的选项去掉. :开始→运行→输入msconfig,到启动页.7、修改windows的虚拟内存交换空间.8、修改windows使得windows启动时,显示操作系统列表时间为5秒,并写出启动文件的具体内容. :右键我的电脑→属性→高级→启动和故障恢复的设置→显示列表时间设为5,→点击编辑→列出具体内容,一般是:[boot loader]timeout=0default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS[operating systems]multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect9、查看windows本地安全策略,并修改为定期强制修改密码.写出本地安全策略的审核的内容. :开始→运行→输入gpedit.msc →计算机设置→Windows设置→安全设置→账户策略→密码策略→密码最长存留期设置为需要的天数即可.10、获得此计算机网卡的网络配置及mac地址.开始→运行→输入cmd回车→输入ipconfig /all回车即是.11、在D盘新建一个文件夹,以自己的拼音缩写命名,并利用命令将其映射为I盘,例如为aaa,命令:subst I: d:\aaa.即将c:\aaa映射为I盘. (注:I盘是虚拟盘,不是实际的硬盘)语法subst [drive1:[drive2:}Path}subst drive1:/d参数drive1:指定要为其指派路径的虚拟驱动器.drive2:指定包含指定路径的物理驱动器(如果不是当前的驱动器).Path指定要指派给虚拟驱动器的路径./d删除虚拟驱动器./?在命令提示符显示帮助.注释以下命令在subst 命令中使用的驱动器上无法工作(或不应使用):chkdskDiskcompDiskcopyformatlabelrecoverdrive1 参数必须在lastdrive 命令指定的范围之内.如果没有,subst 将显示下列错误消息:Invalid parameter - drive1:范例若要为路径B:\User\Betty\Forms 创建虚拟驱动器Z,请键入:subst z:b:\user\betty\forms现在,不用键入完整路径,而是通过键入虚拟驱动器号,后跟冒号,即可到达该目录,如下所示:z:winxp中的映射盘符命令:subst另附上软件extrasubst.zip(创建虚拟驱动器)12、通过设备管理器查看系统所有组件配置.包括驱动程序,装载的所有程序,windows组件,硬件组件的IRQ等.13、查看windows的版本及注册信息. :开始→运行→输入winver回车14、利用windows自带的聊天工具,进行局域网内的聊天,并写出详细步骤. 首先启动服务中的Messager服务,Sp2以后版本默认为禁止的,将其设为自动,然后要发消息就开始→运行→输入net send 对方IP地址信息内容.回车即可15、利用命令查看windows进程中每个进程所提供的服务.命令:tasklist /SVC (注:查看svchost进程情况)实验二 Windows进程观测一、背景知识Windows提供了创建控制台应用程序的能力,使用户可以利用标准的C++工具,如iostream库中的cout和cin对象,来创建小型应用程序。
第2章Windows操作系统实验实验一Windows基本操作作业要求(1)将打开的窗口层叠,在各窗口中进行切换,并改变窗口的大小,这里要分清窗口右上角的三个按钮的作用。
注意:窗口在最小化时,程序仍在运行,单击“任务栏”窗口中的相关按钮,窗口即恢复。
(2)对菜单栏菜单、快捷菜单进行操作,注意菜单命令的各种不同形式。
(3)打开一个对话框,熟悉其中的各个操作元素。
实验二文件管理操作作业要求在Windows实验素材库建立了如图2-6所示的文件夹结构。
从相应网站下载该实验素材文件夹中的EXERCISE文件夹到D盘根目录下,完成以下操作:(1)在D盘根目录下建立如图2-7所示的文件夹结构。
(2)将EXERCISE文件夹下除TOOL以外的文件夹复制到STUDENT文件夹下。
(3)将STUDENT文件夹下的DOCUMENT文件夹下的文件移动到STUDENT1\WORD文件夹下。
(4)将ELSE文件夹重命名为WIN。
(5)删除VOICE和USER文件夹。
(6)恢复被删除的VOICE文件夹,彻底删除USER文件夹。
实验三运行程序和打开文档操作作业要求(1)选择“开始”菜单的“运行”命令运行计算器程序(Calc.exe)。
(2)选择“开始”菜单的“程序”命令运行画图程序。
(3)在“开始”菜单的“文档”中,找到一个近期使用过的文档,打开并编辑它。
(4)搜索“mspaint.exe”程序文件,并运行之。
实验四定制工作环境与计算机管理操作作业要求(1)在屏幕上找到“任务栏”窗口,将“任务栏”窗口隐藏或取消隐藏,并且改变“任务栏”窗口的大小。
(2)将自己喜爱的程序设置为屏幕保护程序。
(3)将自己喜爱的图片设置为桌面背景,并使图片平铺于桌面上。
(4)将桌面上的“我的电脑”图标拖动到任务栏的快速启动区。
(5)在桌面上创建“画图程序”的快捷方式。
实验五 Windows 2000综合练习作业要求从相应网站下载Windows实验素材文件夹中的EXERCISE文件夹到D盘根目录下,然后在EXERCISE文件夹下完成以下操作:(1)在USER文件夹下建立如下所示的文件夹结构。
实验内容和实验要求实验1:安装Linux系统(4学时)目的:1.学会在操作系统安装之前,根据硬件配置情况,制订安装计划。
2.学会在安装多操作系统前,利用硬盘分区工具(如PQMagic)为Linux准备分区。
3.学会Linux操作系统的安装步骤和简单配置方法。
4.学会Linux系统的启动、关闭步骤,初步熟悉Linux系统的用户界面。
内容:1.安装并使用硬盘分区工具(如PQMagic),为Linux准备好分区。
2.安装Linux系统(如红旗Linux桌面版)。
3.配置Linux系统运行环境。
4.正确地启动、关闭系统。
5.对图形界面进行一般操作。
要求:1.制订安装计划。
2.如果在机器上已安装了Windows系统,而且没有给Linux预备硬盘分区,则安装硬盘分区工具(如PQMagic),运行它,为Linux划分出一块“未分配”分区。
3.在光驱中放入Linux系统安装盘,启动系统。
按照屏幕提示,选择/输入相关参数,启动安装过程。
4.安装成功后,退出系统,取出安装盘。
重新开机,登录Linux系统。
5.对Linux系统进行配置,如显示设备、打印机等。
6.利用鼠标对图形界面进行操作。
说明:1.本实验应在教师的授权和指导下进行,不可擅自操作,否则可能造成原有系统被破坏。
2.如条件不允许每个学生亲自安装,可采用分组进行安装或课堂演示安装的方式。
实验2:Linux 应用及shell编程(4学时)目的:1.掌握Linux一般命令格式和常用命令。
2.学会使用vi编辑器建立、编辑文本文件。
3.了解shell的作用和主要分类。
4.学会bash脚本的建立和执行方式。
5.理解bash的基本语法。
6.学会编写简单的shell脚本。
内容:1.正确地登录和退出系统。
2.熟悉使用date,cal等常用命令。
3.进入和退出vi。
利用文本插入方式建立一个文件。
4.学会用gcc编译器编译C程序。
5.建立shell脚本并执行它。
6.学会使用shell变量和位置参数、环境变量。
实验一:操作系统环境Windows 2000 系统管理实验内容与步骤1. 计算机管理2. 事件查看器3. 性能监视4. 服务5. 数据库 (ODBC)为了帮助用户管理和监视系统,Windows 2000提供了多种系统管理工具,其中最主要的有计算机管理、事件查看器和性能监视等。
步骤1:登录进入Windows 2000 Professional。
步骤2:在“开始”菜单中单击“设置”-“控制面板”命令,双击“管理工具”图标。
在本地计算机“管理工具”组中,有哪些系统管理工具,基本功能是什么:1) internet信息服务功能:Internet 信息服务(IIS)可以使您在Internet 或Intranet 上非常容易地发布信息。
IIS 包含许多管理网站和Web 服务器的功能。
而且具有象Active Server Pages (ASP)一样的编程功能,您可以利用它创建并配置可升级的、灵活的Web 应用程序2)本地安全策略功能:是指在本地安全区域内(一个安全区域,通常是指属于某个组织的一系列处理和通信资源),用于所有与安全相关活动的一套规则。
这些规则是由此安全区域中所设立的本地安全权力机构建立的,并由安全控制机构来描述、实施或实现的3)服务功能:启动和停止在本地计算机上所运行的各种服务。
4)计算机管理功能:可用来管理本地或远程计算机。
这些工具被组合到一个控制台中,这样,查看管理属性和访问执行计算机管理任务所需的工具就方便多了。
5)事件查看器功能: 利用Windows内置的事件查看器,加上适当的网络资源,就可以很好地解决大部分的系统问题。
6)数据源功能:数据源(Data Source)是提供某种所需要数据的器件或原始媒体。
7)性能功能:显示系统性能图表及配置数据日志和警报。
8)组件服务功能:配置和管理com+应用程序。
9) Telnet服务器管理查看以及修改Telnet服务器设置和连接。
10)Internet服务管理器管理IIS、Internet和Intranet Web站点的Web服务器。
实验一:系统调用目的:深入理解操作系统是虚拟机实验方法:利用UNIX/LINUX所提供的系统调用来编写C语言程序,程序中要体现出一些典型的系统调用(函数)。
任务:编写一个C语言程序,该程序将一个存放了一系列整数的文本文件进行排序,每个整数占据文件的一行,排序的结果存放到一个新的文件之中。
源文件和目标文件的文件名字由命令行输入。
例如:假设可执行文件的文件名是sort,源文件与目标文件的名字分别是data 和newdata,那么命令行的情形为如下所示内容:./sort data newdata1、命令行参数的传递。
根据C语言编程规范的要求,传递命令行参数通过main函数进行。
main函数的原型是:main(int argc, char **args),其中argc是一个整数,表示命令行中参数的个数,第二个参数是字符串指针数组,这个数组中的第0个元素存放可执行文件名称,其余为参数,用args[1], args[2]... ...访问。
以上述命令行为例,argc为3,args[0]为“./sort”,args[1]为“data”,args[2]为“newdata”2、系统调用的使用(1)打开文件系统调用open在读写一个文件之前,必须打开这个文件,打开文件的过程主要是将文件的控制结构(LINUX中是i节点)调入内存。
本实验中用如下语句打开文件:fd = open(args[1], O_RDONL Y);第一个参数是打开的文件名,第二个参数O_RDONL Y表示只读,O_WRONL Y表示只写,O_RDWR表示读写,O_CREAT表示创建文件。
open系统调用返回一个整数作为文件描述符,以后用这个文件描述符来访问文件,如果因为某种原因(文件不存在,不符合访问权限,存储空间不足等)致使文件无法打开,则open返回-1。
(2)文件信息读取系统调用read本实验使用如下语句读取文件信息read(fd, &ch, 1)fd是open返回的文件描述符,ch为字符变量,1表示从文件中读取一个字节。
实验一进程创建模拟一、实验目的1)理解进程创建相关理论;2)掌握进程创建方法;3)掌握进程相关数据结构。
二、实验内容本实验针对操作系统中进程创建相关理论进行实验。
要求实验者输入实验指导书提供的代码并进行测试。
代码简化了进程创建的多个步骤和内容。
进程的树形结构采用广义二叉树的方式进行存储。
三、实验原理1)进程控制块为了描述和控制进程的运行,系统为每个进程定义了一个进程控制块(PCB),它是进程实体的一部分,是操作系统管理进程最重要的数据结构。
其主要包含四类信息:(1) 进程标识符它唯一地标识一个进程。
通常包括进程号 pid,父进程号 ppid 和用户号 uid。
(2) 处理机状态处理器的状态通常由处理机的各种寄存器中的内容组成。
PCB 存放中断(阻塞,挂起)时的各寄存器值,当该进程重新执行时,可以从断点处恢复。
主要包括:a) 通用寄存器;b) 指令计数器;c) 程序状态字 PSW;d) 用户栈指针。
(3) 进程调度信息a) 进程状态;b) 进程优先级(用于描述优先使用 cpu 级别的一个整数,高优先级的进程先得到cpu,通常情况下,优先值越小优先级越高);c) 其它信息(等待时间、总执行时间等);d) 事件(等待原因)。
(4) 进程控制信息a) 程序和数据的地址(程序在内存和外存中的首址);b) 进程同步和通信机制;c) 资源列表(进程除 CPU 以外的所有资源);d) 链接指针(进程队列中指向下一个进程的 PCB 首址)。
2) 进程创建流程(1) 申请空白 PCB为新进程申请获得唯一的数字标识符,并从 PCB 集合中索取一个空白 PCB。
如果无空白PCB,可以创建一个新的 PCB。
在本实验中,每次动态创建 PCB。
(2) 为新进程分配资源为新进程分配内存空间和栈空间。
(3) 初始化进程控制块a) 初始化标识信息;b) 初始化处理机状态信息;c) 初始化处理机控制信息。
(4) 将新进程插入就绪队列3) 进程树P1P2 P3 P4 P5P6 P7 P8 P9 P10 P11P12图1-1 进程树进程树用于描述进程家族关系,如图 1-1 中可以看出,进程 P1 创建了进程 P2、P3、P4、P5,而 P2 又创建了 P6、P7、P8 …… 。
在进程创建过程中,需要对每一个新增加的进程加入到进程树中,有了清晰的父子关系,可以使资源继承或进程删除等操作变得很方便。
4) 进程总链它是一个 PCB 链表,每一个新创建的进程必须把其 PCB 放入总链中,该总链可以对破坏的进程树进行修复,也方便 PCB 查找。
四、程序清单1.basic.h 文件#ifndef basic_h#include<stdio.h>#include<string.h>#include<stdlib.h>#define basic_hchar *errormsg[256];//process control blockstruct pcb//定义进程控制块{int pid;//process id子进程int ppid;//parent process id父进程int prio;//priority优先级int state;//state状态(等待,运行,阻塞)int lasttime;//last execute timeint tottime; //totle execute time};//process nodestruct pnode{pcb *node;//指向结构体本身的结点pnode *sub;//子结点pnode *brother;//兄弟结点pnode *next;//下一个结点};//信号量struct semphore{char name[5]; //名称int count;//计数值int curpid;//当前进程的idpnode *wlist; //等待链表};#define geterror(eno) printf("%s\n",errormsg[eno])void initerror()//内部的错误提示{errormsg[0] = (char *)malloc(20);errormsg[0]="error command!";//错误的指令errormsg[1] = (char *)malloc(20);errormsg[1]="error parameter!";}//get a substring in string schar * substr(char *s,int start,int end){char *s1;int len = strlen(s);if(start<0 || end>=len || start>end)return NULL;s1=(char *)malloc(end-start+2);for(int i=0;i<=end-start;i++)s1[i] = s[i+start];s1[i]='\0';return s1;}//find the location of c in string sint instr(char *s,char c){unsigned i;for(i=0;i<strlen(s);i++)if(s[i]==c)return i;return -1;}//change the string to array dataint * strtoarray(char *s){int *a,count,x1;unsigned int i;char c, *s1,*s2;if(!s){printf("string can't be null!\n");return NULL;}count=0;s1=s;for(i=0;i<strlen(s1);i++)if(s1[i]==',')count++;count++;a = (int *)malloc(count);c=',';for(i=0;i<count;i++){x1 = instr(s1,c);if(x1>=0)s2=substr(s1,0,x1-1);elses2=s1;a[i]=atoi(s2);if(c==',')s1=substr(s1,x1+1,strlen(s1)-1);}return a;#endif2、源程序#include "basic.h"pnode *proot;//system process tree rootpnode *plink;//system process link head//create processint createpc(int *para){//add your code herepnode *p,*p1,*pp; //添加结点int pflag;//设置标记pflag=0;for(p=plink;p;p=p->next){if(p->node->pid == para[0]) //check if this pid is already exist{printf("pid %d is already exist!\n",para[0]);return -1;}if(p->node->pid == para[1]) //find parent pcb{pflag=1;pp = p;}}if(!pflag){printf("parent id %d is not exist!\n",para[1]);return -2;}//init new pcbp1 = new pnode;p1->node=new pcb;p1->node->pid = para[0];p1->node->ppid = para[1];p1->node->prio = para[2];p1->sub=NULL;p1->next=NULL;p1->brother=NULL;//add to process treeif(!pp->sub)//添加到进程树pp->sub=p1;elsefor(p=pp->sub;p->brother;p=p->brother);p->brother=p1;}// add to process linkfor(p=plink;p->next;p=p->next);//添加链接p->next=p1;return 0;}//show process detailvoid showdetail()//显示进程细节{//add your code herepnode *p,*p1;//定义结点p=plink;for(;p;) //print all pcb info{printf("%d(prio %d):",p->node->pid,p->node->prio);p1 = p->sub;for(;p1;) //print sub pcb{printf("%d(prio %d)",p1->node->pid,p1->node->prio);p1 = p1->brother;}printf("\n");p = p->next;}printf("\n");}//don't changevoid main(){initerror();short cflag,pflag;char cmdstr[32];proot = new pnode;proot->node=new pcb;proot->node->pid=0;proot->node->ppid=-1;proot->node->prio=0;proot->next=NULL;proot->sub=NULL;proot->brother=NULL;plink=proot;for(;;){cflag=0;pflag=0;printf("cmd:");scanf("%s",cmdstr);if(!strcmp(cmdstr,"exit")) //exit the program退出系统break;if(!strcmp(cmdstr,"showdetail")){cflag = 1;pflag = 1;showdetail();}else{int *para;char *s,*s1;s = strstr(cmdstr,"createpc"); //create process创建进程if(s){cflag=1;para = (int *)malloc(3);//getparameter获取参数s1 = substr(s,instr(s,'(')+1,strlen(s)-2); //get param stringpara=strtoarray(s1);//get parametercreatepc(para); //create processpflag=1;}}if(!cflag)geterror(0);elseif(!pflag)geterror(1);}}五、实验步骤输入实验提供的代码后,可以输入createpc 命令创建进程,输入showdetail 显示每个进程及其子进程的信息,测试命令解释如下:1) createpc 创建进程命令。