操作系统实验二

合集下载

操作系统实验二

操作系统实验二

实验二并发与调度一、实验目的在本实验中,通过对事件和互斥体对象的了解,来加深对Windows 2000线程同步的理解。

通过分析实验程序,了解管理事件对象的API。

了解在进程中如何使用事件对象,在进程中如何使用互斥体对象,线程如何通过文件映射对象发送数据。

在Linux Redhat 9.0操作系统平台上,用pipe()创建一个管道文件,然后用fork()创建两个生产进程和两个消费进程,它们之间通过pipe()传递消息。

二、实验环境硬件环境:计算机一台,局域网环境;软件环境:Windows 2000 Professional,Linux Redhat 9.0操作系统平台,Visual C++ 6.0企业版。

三、实验内容和步骤第一部分:互斥体对象本程序中显示的类CCountUpDown使用了一个互斥体来保证对两个线程间单一数值的访问。

每个线程都企图获得控制权来改变该数值,然后将该数值写入输出流中。

创建者实际上创建的是互斥体对象,计数方法执行等待并释放,为的是共同使用互斥体所需的资源(因而也就是共享资源) 。

利用互斥体保护共享资源// mutex项目# include <windows.h># include <iostream>class CCountUpDown{public:CCountUpDown(int nAccesses) :m_hThreadInc(INV ALID_HANDLE_V ALUE) ,m_hThreadDec(INV ALID_HANDLE_V ALUE) ,m_hMutexV alue(IN V ALID_HANDLE_V ALUE) ,m_nV alue(0) ,m_nAccess(nAccesses){m_hMutexV alue = :: CreateMutex(NULL,TRUE,NULL) ;m_hThreadInc = :: CreateThread(NULL,0,IncThreadProc,reinterpret_cast <LPVOID> (this) ,0,NULL) ;m_hThreadDec = :: CreateThread(NULL,0,DecThreadProc,reinterpret_cast <LPVOID> (this) ,0,NULL) ;:: ReleaseMutex(m_hMutexV alue) ;}virtual ~CCountUpDown(){:: CloseHandle(m_hThreadInc) ;:: CloseHandle(m_hThreadDec) ;:: CloseHandle(m_hMutexV alue) ;}virtual void WaitForCompletion(){if (m_hThreadInc != INV ALID_HANDLE_V ALUE &&m_hThreadDec != INV ALID_HANDLE_V ALUE){:: WaitForSingleObject(m_hThreadInc, INFINITE) ;:: WaitForSingleObject(m_hThreadDec, INFINITE) ;}}protected:virtual void DoCount(int nStep){while (m_nAccess > 0){:: WaitForSingleObject(m_hMutexV alue, INFINITE) ;m_nV alue += nStep;std :: cout << “thread: ” << :: GetCurrentThreadId()<< “value: ” << m_n V alue<< “access: ” << m_nAccess << std :: endl;--m_nAccess;:: Sleep(1000) ; // 使显示速度放慢:: ReleaseMutex(m_hMutexV alue) ;}}static DWORD WINAPI IncThreadProc(LPVOID lpParam){CCountUpDown* pThis =reinterpret_cast < CCountUpDown* > (lpParam) ;pThis -> DoCount(+1) ;return(0) ;}static DWORD WINAPI DecThreadProc(LPVOID lpParam){CCountUpDown* pThis =reinterpret_cast <CCountUpDown* > (lpParam) ;pThis -> DoCount(-1) ;return(0) ;}protected:HANDLE m_hThreadInc;HANDLE m_hThreadDec;HANDLE m_hMutexV alue;int m_nV alue;int m_nAccess ;} ;void main(){ CCountUpDown ud(50) ;ud.WaitForCompletion() ; }分析程序的运行结果,可以看到线程(加和减线程) 的交替执行(因为Sleep() API允许Windows切换线程) 。

操作系统实验二实验报告

操作系统实验二实验报告

操作系统实验二实验报告一、实验目的本次操作系统实验二的主要目的是深入理解和掌握进程管理的相关概念和技术,包括进程的创建、执行、同步和通信。

通过实际编程和实验操作,提高对操作系统原理的认识,培养解决实际问题的能力。

二、实验环境本次实验使用的操作系统为 Windows 10,编程环境为 Visual Studio 2019。

三、实验内容及步骤(一)进程创建实验1、首先,创建一个新的 C++项目。

2、在项目中,使用 Windows API 函数`CreateProcess`来创建一个新的进程。

3、为新进程指定可执行文件的路径、命令行参数、进程属性等。

4、编写代码来等待新进程的结束,并获取其退出代码。

(二)进程同步实验1、设计一个生产者消费者问题的模型。

2、使用信号量来实现生产者和消费者进程之间的同步。

3、生产者进程不断生成数据并放入共享缓冲区,当缓冲区已满时等待。

4、消费者进程从共享缓冲区中取出数据进行处理,当缓冲区为空时等待。

(三)进程通信实验1、选择使用管道来实现进程之间的通信。

2、创建一个匿名管道,父进程和子进程分别读写管道的两端。

3、父进程向管道写入数据,子进程从管道读取数据并进行处理。

四、实验结果及分析(一)进程创建实验结果成功创建了新的进程,并能够获取到其退出代码。

通过观察进程的创建和执行过程,加深了对进程概念的理解。

(二)进程同步实验结果通过使用信号量,生产者和消费者进程能够正确地进行同步,避免了缓冲区的溢出和数据的丢失。

分析结果表明,信号量机制有效地解决了进程之间的资源竞争和协调问题。

(三)进程通信实验结果通过管道实现了父进程和子进程之间的数据通信。

数据能够准确地在进程之间传递,验证了管道通信的有效性。

五、遇到的问题及解决方法(一)在进程创建实验中,遇到了参数设置不正确导致进程创建失败的问题。

通过仔细查阅文档和调试,最终正确设置了参数,成功创建了进程。

(二)在进程同步实验中,出现了信号量使用不当导致死锁的情况。

操作系统实验二:进程管理

操作系统实验二:进程管理

操作系统实验二:进程管理操作系统实验二:进程管理篇一:操作系统实验报告实验一进程管理一、目的进程调度是处理机管理的核心内容。

本实验要求编写和调试一个简单的进程调度程序。

通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。

二、实验内容及要求1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。

可根据实验的不同,PCB结构的内容可以作适当的增删)。

为了便于处理,程序中的某进程运行时间以时间片为单位计算。

各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。

2、系统资源(r1…rw),共有w类,每类数目为r1…rw。

随机产生n进程Pi(id,s(j,k)t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。

3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。

建立进程就绪队列。

4、编制进程调度算法:时间片轮转调度算法本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。

在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。

三、实验环境操作系统环境:Windows系统。

编程语言:C#。

四、实验思路和设计1、程序流程图2、主要程序代码//PCB结构体struct pcb{public int id; //进程IDpublic int ra; //所需资源A的数量public int rb; //所需资源B的数量public int rc; //所需资源C的数量public int ntime; //所需的时间片个数public int rtime; //已经运行的时间片个数public char state; //进程状态,W(等待)、R(运行)、B(阻塞)//public int next;}ArrayList hready = new ArrayList();ArrayList hblock = new ArrayList();Random random = new Random();//ArrayList p = new ArrayList();int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m为要模拟的进程个数,n为初始化进程个数//r为可随机产生的进程数(r=m-n)//a,b,c分别为A,B,C三类资源的总量//i为进城计数,i=1…n//h为运行的时间片次数,time1Inteval为时间片大小(毫秒)//对进程进行初始化,建立就绪数组、阻塞数组。

操作系统实验报告-实验二

操作系统实验报告-实验二

操作系统实验报告——实验二:C编程环境实验目的1.熟悉Linux下C程序设计的环境;2.对系统调用有初步了解。

实验内容1.Linux下C语言程序的开发过程a、在用户主目录下用vi编辑C语言源程序(源程序已附后),如:$vi hello.c。

b、用gcc编译C语言源程序:$gcc ./hello.c -o example这里gcc是Linux下的C语言程序编译器(GNU C Compiler),./hello.c表示待编译的源文件是当前工作目录下的hello.c,-o example表示编译后产生的目标代码文件名为example。

c、若编译不正确,则进入vi修改源程序,否则,运行目标代码:$./example 。

注意:这只是gcc最基本的用法,其他常用选项有:-c , -S , -O , -O2, -g 等。

2.编辑、调试下面c语言程序,说明该程序的功能。

#include <stdio.h>#include <stdlib.h>int main() {int n,a[200],carry,temp,i,j,digit = 1;printf("Please input n:");scanf("%d",&n);a[0] = 1;for( i = 2; i <= n; ++i) {for( j = 1, carry = 0; j <= digit; ++j) {temp = a[j-1] * i + carry;a[j-1] = temp % 10;carry = temp / 10;}while(carry) {a[++digit-1] = carry % 10;carry /= 10;}}printf("Result is:\n%d ! = ",n);for( i = digit; i >=1; --i) {printf("%d",a[i-1]);}printf("\n");return 0;}程序运行结果截图:程序实现功能:计算非负数的阶乘,阶乘运算的结果的个位十位百位……分别保存在a[0],a[1],a[2]……3.编写命令解释程序(1)内容:利用C语言编写一个微型命令解释程序,接受并解释以下命令:1.dir //列当前目录2.cop 文件1 文件2 //拷贝文件3.era文件名//删除文件4.dis字符串//显示字符串5.end //结束,退出(2)要求:1.命令应该由空格隔开;2.进行命令合法性检查,若不合法,显示出错信息,等待重新输入;3.调用shell命令来完成各项功能。

实验二操作系统安全配置

实验二操作系统安全配置

实验二操作系统安全配置一.实验目的1.熟悉Windows NT/XP/2000系统的安全配置2. 懂得可信计算机评价准则二.实验内容1.Windows系统注册表的配置点击“开始\运行”选项,键入“regedit”命令打开注册表编辑器,学习并修改有关网络及安全的一些表项2.Windows系统的安全服务a.打开“操纵面板\管理工具\本地安全策略”,查阅并修改有效项目的设置。

b.打开“操纵面板\管理工具\事件查看器”,查阅并懂得系统日志,选几例,分析并说明不一致类型的事件含义。

3. IE浏览器安全设置打开Internet Explorer菜单栏上的“工具\Internet选项”,调整或者修改“安全”、“隐私”、“内容”等栏目的设置,分析、观察并验证你的修改。

4. Internet 信息服务安全设置打开“操纵面板\管理工具\Internet 信息服务”,修改有关网络及安全的一些设置,并启动WWW或者FTP服务器验证(最好与邻座同学配合)。

三.实验过程1. Windows系统注册表的配置点击“开始\运行”选项,键入“regedit”命令打开注册表编辑器,图如下:禁止修改显示属性HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ Policies\System 在右边的窗口中创建一个DOWRD值:“NoDispCPL”,并将其值设为“1”。

没有成功,由于Policies里无System选项.在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer 下在右边的窗口中新建一个二进制值“NoViewContextMenu”,并设值为“01 00 00 00”。

修改后需重新启动WINDOWS .2、Windows系统的安全服务打开“操纵面板\管理工具\本地安全策略”,查阅并修改有效项目的设置。

操作系统实验二

操作系统实验二

操作系统实验⼆实验⼆进程管理(⼀)进程创建⼀、实验⽬的1、掌握进程的概念,明确进程的含义2、认识并了解并发执⾏的实质⼆、实验内容1、编写⼀段程序,使⽤系统调⽤fork( )创建两个⼦进程。

当此程序运⾏时,在系统中有⼀个⽗进程和两个⼦进程活动。

让每⼀个进程在屏幕上显⽰⼀个字符:⽗进程显⽰'a',⼦进程分别显⽰字符'b'和字符'c'。

试观察记录屏幕上的显⽰结果,并分析原因。

2、修改上述程序,每⼀个进程循环显⽰⼀句话。

⼦进程显⽰'daughter …'及'son ……',⽗进程显⽰'parent ……',观察结果,分析原因。

三、所涉及的系统调⽤1、fork( )创建⼀个新进程。

系统调⽤格式:pid=fork( )参数定义:int fork( )fork( )返回值意义如下:0:在⼦进程中,pid 变量保存的fork( )返回值为0,表⽰当前进程是⼦进程。

>0:在⽗进程中,pid 变量保存的fork( )返回值为⼦进程的id 值(进程唯⼀标识符)。

-1:创建失败。

如果fork( )调⽤成功,它向⽗进程返回⼦进程的PID,并向⼦进程返回0,即fork( )被调⽤了⼀次,但返回了两次。

此时OS 在内存中建⽴⼀个新进程,所建的新进程是调⽤fork( )⽗进程(parent process)的副本,称为⼦进程(childprocess)。

⼦进程继承了⽗进程的许多特性,并具有与⽗进程完全相同的⽤户级上下⽂。

⽗进程与⼦进程并发执⾏。

核⼼为fork( )完成以下操作:(1)为新进程分配⼀进程表项和进程标识符进⼊fork( )后,核⼼检查系统是否有⾜够的资源来建⽴⼀个新进程。

若资源不⾜,则fork( )系统调⽤失败;否则,核⼼为新进程分配⼀进程表项和唯⼀的进程标识符。

(2)检查同时运⾏的进程数⽬超过预先规定的最⼤数⽬时,fork( )系统调⽤失败。

实验2 Windows操作系统基础

实验2 Windows操作系统基础

2.查看硬盘,在图2-2-1中记录D盘的相关信息。
3.在C盘根目录下创建如图2-2-2所示的 三级文件夹,并完成如下操作:
(1)在桌面上,用“记事本”程序创建 文本文件t1ห้องสมุดไป่ตู้txt;然后在桌面的快捷菜单 中选择“新建”→“文本文档”命令,创 建文本文件t2.txt、t3.txt、t4.txt。四 个文件的内容任意输入。 (2)将桌面上的t1.txt复制到C: \JSJ11\Sub1\mmm中。 (3)将桌面上的t2.txt复制到C: \JSJ11\Sub2\nnn中。
(3)分别按“名称”、“类型”、“大小”、 “递增”和“递减”对Windows主目录进行排序, 观察5种排序方式的区别。 (4)选择“设置”或“取消”下列文件和文件 夹的“查看”选项,并观察两者之间的区别。 ①鼠标指向文件夹和桌面项时显示提示信息。 ②隐藏受保护的操作系统文件。 ③显示隐藏的文件、文件夹和驱动器。 ④先隐藏后显示已知文件类型的扩展名。
2.掌握磁盘管理的基本方法。
3..掌握Windows7中库的操作。
【实验内容】
1.“Windows 资源管理器”的查看与使用
(1)在桌面双击“计算机”,打开“计算 机”窗口,请仔细观察窗口。 (2)分别选择“超大图标”、“大图标”、 “中图标”、“小图标”、“列表”、“详 细信息”、“平铺”和“内容”等8种方式浏 览Windows主目录,观察各种显示方式之间的 区别。
8.启动“磁盘碎片整理程序”,分析C盘,
查看报告。
(1)碎片:( )%。
(2)如果时间允许,对 C盘进行碎片整理。
9.库的设置 10.库的创建
实验2 Windows7操作系统基础
实验2.1 Windows7的基本操作

操作系统实验二进程调度

操作系统实验二进程调度

实验二:进程调度一、目的要求:用C或C++语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解.二、进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。

每个进程有一个进程控制块( PCB)表示。

进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。

进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。

进程的到达时间为进程输入的时间。

进程的运行时间以时间片为单位进行计算。

每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。

就绪进程获得 CPU后都只能运行一个时间片。

用已占用CPU时间加1来表示。

如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。

每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。

重复以上过程,直到所要进程都完成为止。

三调度算法的流程图如下 :四、程序代码:#include<iostream>using namespace std;#define MAX 10struct task_struct{char name[10]; /*进程名称*/ int number; /*进程编号*/ float come_time; /*到达时间*/float run_begin_time; /*开始运行时间*/ float run_time; /*运行时间*/float run_end_time; /*运行结束时间*/ int priority; /*优先级*/int order; /*运行次序*/int run_flag; /*调度标志*/}tasks[MAX];int counter; /*实际进程个数*/int fcfs(); /*先来先服务*/int ps(); /*优先级调度*/int sjf(); /*短作业优先*/int hrrn(); /*响应比高优先*/int pinput(); /*进程参数输入*/int poutput(); /*调度结果输出*/void main(){int option;pinput();printf("请选择调度算法(0~4):\n");printf("1.先来先服务\n");printf("2.优先级调度\n");printf(" 3.短作业优先\n");printf(" 4.响应比高优先\n");printf(" 0.退出\n");scanf("%d",&option);switch (option){ case 0:printf("运行结束。

操作系统实验答案-实验2Linux的基本操作及vi的使用(答案)

操作系统实验答案-实验2Linux的基本操作及vi的使用(答案)

实验二Linux的基本命令操作及vi的使用实验目的:1、熟悉Linux操作系统环境2、熟悉Linux操作系统的文件结构3、熟悉Linux操作系统的基本命令4、熟悉Linux操作系统的文件组织方式5、学习使用vi编辑器建立、编辑、显示以及加工处理文本文件。

实验内容及要求:1、登陆实验室的Linux服务器。

启动电脑,进入Windows操作系统,在“开始”-〉“运行"中输入“Telnet 10。

200.41。

178”,即可登陆实验室的Linux服务器.在“Login:”提示后输入“stu”+学号(如02号同学输入stu02),按下回车键。

在“Password:”提示后输入“123”(注意输入密码时屏幕上不会有“*”等符号出现,这和Windows 不同),按下回车键,若出现“[os@ root os]$”或“—bash—2.05b$”,表示已成功登陆系统,可以开始输入指令操作。

思考:(用pwd指令)查看自己登陆后位于Linux的哪个目录,写出该目录的路径,与自己周围的同学比较,看是否相同.(可查阅Linux资料了解“/home”目录的功能介绍)2、在Linux中进行以下基本操作:1)在当前目录下新建一个名为(自己姓名首字母缩写+学号后3位数)的子目录.写出你所用的指令.(例如:mkdir zq000 )2)进入刚创建的子目录环境下。

(提示:指令cd)3)在刚创建的子目录下新建一个名为abc.txt的文件。

写出你所用的指令。

(提示:新建文件的指令是touch)4)将/目录下(即根目录下)的welcome.txt文件复制到自己的子目录下,写出你所用的指令。

cp –i /root/stu62/abc.txt /home/welcome。

txt5)写出welcome.txt文件的内容。

(提示:用cat指令查看)Hello, Boys and girls , welcome to the wonderful Linux world!3、在Linux中进行以下基本操作:1)进入自己的主目录。

操作系统原理实验2-Linux操作系统命令接口

操作系统原理实验2-Linux操作系统命令接口

《操作系统原理》实验报告
实验序号:2 实验项目名称:Linux操作系统命令接口
挑战3:历史命令
挑战4:数据提取
四、实验结果与数据处理
1.查看用户
2.检查权限
3.创建文件
4.创建目录
5.复制文件
6.删除文件
7.预声明变量
8.变量赋值
9.查看变量
10.查找文件
11.打包文件
12.解压文件
13.检查磁盘
14.查看ls命令的帮助信息
15.进入文件添加任务
16.顺序执行多条命令
17.打印全部文件
18.使用管道一行一行查看
19.打印某个字段的某一行
20.默认字典排序
21.删除"hello shiyanlou" 中所有的'o','l','h'
22.将"hello" 中的ll,去重为一个l
23.将输入文本,全部转换为大写或小写输出
24.数据流重定向
25.进程 = 可执行程序 + 该进程对应的内核数据结构
26.linux操作系统基本概念:操作系统按用户数量可以分为单用户系统和多用户系统。

比如Windows就是典型的单用户系统,Linux就是典型的多用户系统。

多用户系统就是一台能并发和独立地执行分别属于两个和多个用户的若干应用程序的计算机。

27.显示环境变量
28.列出指定用户的所有进程
29显示所有进程
30.将在后台运行的作业放到前台运行
31.访问日志
32.历史命令
33.寻找文件,提取数据见上
五、分析与讨论
上机的命令有很多,要重复操作,才能熟练掌握
六、教师评语成绩。

操作系统实验二(进程管理)

操作系统实验二(进程管理)

操作系统进程管理实验实验题目:(1)进程的创建编写一段程序,使用系统调用fork( )创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。

试观察记录屏幕上的显示结果,并分析原因。

(2)进程的控制修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕上出现的现象,并分析原因。

(3)编制一段程序,使其实现进程的软中断通信。

要求:使用系统调用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按Del键);当捕捉到中断信号后,父进程调用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child process 1 is killed by parent! Child process 2 is killed by parent! 父进程等待两个子进程终止后,输出如下的信息后终止: Parent process is killed! 在上面的程序中增加语句signal(SIGINT, SIG_IGN)和signal(SIGQUIT, SIG_IGN),观察执行结果,并分析原因。

(4)进程的管道通信编制一段程序,实现进程的管道通信。

使用系统调用pipe( )建立一条管道线;两个进程P1和P2分别向管道各写一句话: Child 1 is sending a message! Child 2 is sending a message! 而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。

要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。

实验源程序及报告:(1)、进程的创建#include <stdio.h>int main(int argc, char *argv[]){int pid1,pid2; /*fork first child process*/if ( ( pid1=fork() ) < 0 ){printf( "ProcessCreate Failed!");exit(-1);}if ( ( pid1=fork() ) == 0 ){printf( "b\n" );}/*fork second child process*/if ( ( pid2=fork() ) < 0 ){printf( "ProcessCreate Failed!"); exit(-1);}if ( ( pid2=fork() ) == 0 ){printf( "c\n" );}/*parent process*/else{wait(NULL);printf( "a\n" );exit(0);}return 0;}(2)、进程的控制#include <stdio.h>int main(int argc, char *argv[]){ int pid1,pid2;/*fork first child process*/if ( ( pid1=fork() ) < 0 ){printf( "ProcessCreate Failed!");exit(-1);}if ( ( pid1=fork() ) == 0 ){printf( "This is my Unix OS program!\n" ); }/*fork second child process*/if ( ( pid2=fork() ) < 0 ){printf( "ProcessCreate Failed!");exit(-1);}if ( ( pid2=fork() ) == 0 ){printf( "This is the second Child process!\n" ); }/*parent process*/else{wait(NULL);printf( "This is the Parent process\n" );exit(0);}return 0;}(3)编制一段程序,使其实现进程的软中断通信。

操作系统实验报告(2)

操作系统实验报告(2)

计算机实验报告(2)操作系统部分一、基本要求和内容1.了解操作系统的基本功能.2.认识WINDOWS桌面的各部分组成,掌握基本的桌面操作.3.掌握各种基本操作对象的操作方法.4.学会使用WINDOWS帮助.5.了解基本的DOS命令和基本的命令行操作方法.6.熟练掌握文件操作方法.7.掌握对图标的操作方法(移动/拖曳/单击/双击/右击等等).8.熟悉资源管理器窗口和”我的电脑”(“计算机”)窗口.9.掌握启动控制面板的方法,了解控制面板的主要功能,掌握使用控制面板对软硬件进行设置的方法。

10.掌握“运行”对话框的使用方法。

11.了解“任务管理器”的简单使用方法。

12.熟悉“画图”“记事本”“计算器”“写字板”等常用应用程序。

13.开始POWERPOINT的基本使用.二、通过上机实验解决下列问题1. CTRL+ALT+DEL 组合键的功能是:打开【任务管理器】窗口2.全角和半角的区别是:半角是一个字符,全角是两个字符3. CTRL+A组合键的功能是:全部选中CTRL+C组合键的功能是:复制CTRL+V组合键的功能是:粘贴CTRL+X组合键的功能是:剪切CTRL+Z组合键的功能是: 撤销ALT+PRINTSCREEN组合键的功能是:复制当前窗口、对话框或其他对象到剪贴板中任务栏隐藏时通过什么组合键可以看到任务栏:Ctrl+Alt+Del进行窗口切换的组合键是:ALT+Tab4.“画图”应用程序默认保存文件类型是:*.png“记事本”应用程序默认保存文件类型是: *.txt.DOC是什么文件类型Word文档.EXE是什么文件类型可执行文件(程序文件)5.鼠标的基本操作方法包括:指向、单击、双击和拖动鼠标指针附近有漏沙钟表示当前的状态是: 沙漏是等待,因为程序先是从硬盘上读取,然后再到内存,芯片在其期间进行运算,再没真正的打开程序时,系统认为它没正真的启动6.资源管理器左下角窗格(即”文件夹”窗口)显示的是:系统中的所有资源以分层树型的结构显示出来7.一般情况下,对文件进行重命名时,不应该修改文件的扩展名,因为: 如果修改了后缀名则会导致文件属性更改,文件无法打开8.文件的属性主要包括哪些:“只读”、“存档”、“隐藏”9.选择多个连续的文件可以采用哪些方法:使用鼠标先选定第一个文件或文件夹,然后按住Shift键,用鼠标单击最后一个文件或文件夹,这样在第一个对象和最后一个对象之间的所有文件或文件夹将全部被选中,包括第一个和最后一个文件或文件夹。

操作系统实验2

操作系统实验2

操作系统实验2操作系统实验报告哈尔滨工程大学软件学院一、实验概述1. 实验名称实验环境的使用2. 实验目的熟悉操作系统集成实验环境OS Lab的基本使用方法。

练习编译、调试EOS操作系统内核以及EOS应用程序。

3. 实验类型验证二、实验环境OS Lab三、实验过程新建:调试:使用Bochs作为远程目标机:调试:调试软盘引导扇区程序:查看boot.lst文件:查看最后指令字节码调试加载程序:调试内核:EOS启动后的状态和行为:ID是31的是应用程序的进程,ID31的是系统进程。

应用程序的优先级是8,而系统进程的优先级是24,应用程序的进程数是1,而系统进程的进程数是10,并且应用程序是有名字的,而系统程序没有名字。

Id是33的是应用程序的主线程,它与系统线程主要的区别就是优先级不同。

四、思考题1、为什么EOS操作系统从软盘启动时要使用boot.bin和loader.bin两个程序?使用一个可以吗?它们各自的主要功能是什么?如果将loader.bin的功能移动到boot.bin文件中,则boot.bin文件的大小是否仍然能保持小于512字节?答:在IDE环境启动执行EOS操作系统的时候,会把boot.bin、loader.bin和kernel.dll三个二进制文件写到软盘镜像文件中,然后让虚拟机来执行软盘里的EOS操作系统。

仅使用其中的一个是不能运行的。

Boot.bin程序的功能是:在Boot.bin程序执行的过程中,CPU始终处于实模式状态。

Boot.bin程序利用BIOS提供的int 0x13中断服务程序读取软盘FAT12文件系统的根目录,在根目录中搜寻loader.bin文件。

Loader.bin程序的功能是:Loader.bin程序的任务和Boot.bin程序很相似,同样是将其它的程序加载到物理内存中,但这次加载的是EOS内核。

除此之外,Loader.bin程序还负责检测内存大小,为内核准备保护模式执行环境等工作。

《操作系统》实验二

《操作系统》实验二

《操作系统》实验二一、实验目的本实验旨在加深对操作系统基本概念和原理的理解,通过实际操作,提高对操作系统设计和实现的认知。

通过实验二,我们将重点掌握进程管理、线程调度、内存管理和文件系统的基本原理和实现方法。

二、实验内容1、进程管理a.实现进程创建、撤销、阻塞、唤醒等基本操作。

b.设计一个简单的进程调度算法,如轮转法或优先级调度法。

c.实现进程间的通信机制,如共享内存或消息队列。

2、线程调度a.实现线程的创建、撤销和调度。

b.实现一个简单的线程调度算法,如协同多任务(cooperative multitasking)。

3、内存管理a.设计一个简单的分页内存管理系统。

b.实现内存的分配和回收。

c.实现一个简单的内存保护机制。

4、文件系统a.设计一个简单的文件系统,包括文件的创建、读取、写入和删除。

b.实现文件的存储和检索。

c.实现文件的备份和恢复。

三、实验步骤1、进程管理a.首先,设计一个进程类,包含进程的基本属性(如进程ID、状态、优先级等)和操作方法(如创建、撤销、阻塞、唤醒等)。

b.然后,实现一个进程调度器,根据不同的调度算法对进程进行调度。

可以使用模拟的方法,不需要真实的硬件环境。

c.最后,实现进程间的通信机制,可以通过模拟共享内存或消息队列来实现。

2、线程调度a.首先,设计一个线程类,包含线程的基本属性(如线程ID、状态等)和操作方法(如创建、撤销等)。

b.然后,实现一个线程调度器,根据不同的调度算法对线程进行调度。

同样可以使用模拟的方法。

3、内存管理a.首先,设计一个内存页框类,包含页框的基本属性(如页框号、状态等)和操作方法(如分配、回收等)。

b.然后,实现一个内存管理器,根据不同的内存保护机制对内存进行保护。

可以使用模拟的方法。

4、文件系统a.首先,设计一个文件类,包含文件的基本属性(如文件名、大小等)和操作方法(如创建、读取、写入、删除等)。

b.然后,实现一个文件系统管理器,包括文件的存储和检索功能。

操作系统实验2进程调度 实验报告

操作系统实验2进程调度 实验报告
(1)掌握时间片轮换的进程调度算法;
(2)掌握带优先级的进程调度算法;
(3)选用面向对象的编程方法。
二、实验内容;
(1)用C语言(或其它语言,如Java)实现对N个进程采用动态优先调度算法的调度。
(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:
进程标识数ID。
进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。
4.可动态添加、删除进程;
5.完成所有进程操作。
五、程序源代码及注释
六、实验结果分析
1、运行结果如下:
2、结果分析
首先,每次从就绪队列中选择最高优先权的进程时,需要计算出最高优先权和次高优先权之间的STARTBLOCK。即最高优先权进程运行多少个时间片后就会进入阻塞队列。每调度一次,就需要更新所有进程的信息,并判断CPUTIME是否等于ALLTIME,如果相等,则进程完成操作,需从就绪队列中删除。如果阻塞队列中进程的BLOCKTIME为0时,还需要将其转移到就绪队列中。
(5)用户可以干预进程的运行状态,程序应该设置可以让用户中断的入口,并可以通过以下命令查看,修改,终止进程。
A)create随机创建进程,进程的优先级与所需要的时间片随机决定;
B)ps查看当前进程状态
C)sleep命令将进程挂起
D)kill命令杀死进程
E)quit命令退出
(5)分析程序运行的结果,谈一下自己的认识。
三、实验原理;
无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。
根据进程的五个特征:(1)动态性;(2)并发性;(3)异步性;(4)独立性;(5)结构性及三种基本状态的转换,了解各进程对资源的共享和竞争。进程并发执行时,由于资源共享,带来各进程之间的相互制约。为了反映这些制约关系和资源共享关系,在创建一个进程时,应首先创建其PCB,然后才能根据PCB中信息对进程实施有效的管理和控制。当一个进程完成其功能之后,系统则最后释放PCB,进程也随之消亡。

操作系统实验二(银行家算法)实验报告

操作系统实验二(银行家算法)实验报告

实验二实验报告实验源码:#include "stdio.h"#include <iostream.h>#include <string.h>#define False 0 // 定义False#define True 1 // 定义Trueint Max[100][100] = {0}; // 各进程所需各类资源的最大需求int Avaliable[100] = {0}; // 系统可用资源char name[100] = {0}; // 资源的名称int Allocation[100][100] = {0}; // 系统已分配资源int Need[100][100] = {0}; // 还需要资源int Request[100] = {0}; // 请求资源向量int temp[100] = {0}; // 存放安全序列int Work[100] = {0}; // 存放系统可提供资源int M = 100; // 作业的最大数为100int N = 100; // 资源的最大数为100// 显示资源矩阵void showdata(){int i,j;printf("\n此时刻的资源分配情况为:\n");// 显示表头printf(" Max Allocation Need Avaliable\n");printf("PCB ");// 显示作业名称for(j = 0;j < 4;j++){for(i = 0;i < N;i++)printf("%c ",name[i]);printf(" ");}printf("\n");// 显示当前作业资源分配情况for(i = 0;i < M;i++){printf(" %d ",i);for(j = 0;j < N;j++)printf("%d ",Max[i][j]);printf(" ");for(j = 0;j < N;j++)printf("%d ",Allocation[i][j]);printf(" ");for(j = 0;j < N;j++)printf("%d ",Need[i][j]);if(i == 0){printf(" ");for (j = 0;j < N;j++)printf("%d ",Avaliable[j]);}printf("\n");}}// 进行资源分配int changdata(int i){int j;for (j = 0;j < M;j++) {Avaliable[j] = Avaliable[j] - Request[j];Allocation[i][j] = Allocation[i][j] + Request[j];Need[i][j] = Need[i][j] - Request[j];}return 1;}// 安全性算法int safe(){int i,d,k = 0,m,h,s,apply,Finish[100] = {0};int j;int flag = 0;for(i = 0;i < N;i++)Work[i] = Avaliable[i];printf(" 安全性检查\n");printf(" Work Need Allocation Work+Allocation Finish\n");printf("PCB ");// 显示作业名称for(j = 0;j < 4;j++){for(i = 0;i < N;i++)printf("%c ",name[i]);printf(" ");}printf("\n");// 显示当前作业资源分配情况for(i = 0;i < M;i++){apply = 0;for(j = 0;j < N;j++){if (Finish[i] == False && Need[i][j] <= Work[j]){apply++;if(apply == N){printf(" %d ",i);for(d = 0;d < N;d++)printf("%d ",Work[d]);printf(" ");for(d = 0;d < N;d++)printf("%d ",Need[i][d]);printf(" ");for(d = 0;d < N;d++)printf("%d ",Allocation[i][d]);printf(" ");for(m = 0;m < N;m++){Work[m] = Work[m] + Allocation[i][m];printf("%d ",Work[m]);}// 变分配数Finish[i] = True;temp[k] = i;printf(" ");printf("true ");printf("\n");i = -1;k++;flag++;}}}}for(i = 0;i < M;i++){if(Finish[i] == False){for(j = 0;j < N;j++){Avaliable[j] = Avaliable[j] + Request[j];;Allocation[i][j] = Allocation[i][j] - Request[j];;Need[i][j] = Need[i][j] + Request[j];}printf("\n系统进入不安全状态!此时系统不分配资源!\n"); // 不成功系统不安全return 0;}}printf("\n此时系统是安全的!\n"); // 如果安全,输出成功printf("安全序列为:");for(i = 0;i<M;i++) // 输出运行进程数组{printf("%d",temp[i]);if(i < M - 1)printf("->");}printf("\n");return 0;}// 利用银行家算法对申请资源对进行判定void share(){char ch;int i = 0,j = 0;ch = 'y';printf("\n请输入要求分配的资源进程号(0 - %d):",M - 1);scanf("%d",&i); // 输入须申请的资源号printf("\n请输入进程%d 申请的资源:\n",i);for(j = 0;j < N;j++){printf("%c:",name[j]);scanf("%d",&Request[j]); // 输入需要申请的资源}for (j = 0;j < N;j++){if(Request[j] > Need[i][j]) // 判断申请是否大于需求,若大于则出错{printf("\n进程%d 申请的资源大于它需要的资源",i);printf(" 分配不合理,不予分配!\n");ch = 'n';break;} else {if(Request[j] > Avaliable[j]) // 判断申请是否大于当前资源,若大于则{// 出错printf("\n进程%d 申请的资源大于系统现在可利用的资源",i);printf(" 分配出错,不予分配!\n");ch = 'n';break;}}}if(ch == 'y') {changdata(i); // 根据进程需求量变换资源showdata(); // 根据进程需求量显示变换后的资源safe(); // 根据进程需求量进行银行家算法判断}}// 主函数int main(){int t = 1,i,j,number,choice,m,n,flag;char ming;printf("\n请首先输入系统可供资源种类的数量:");scanf("%d",&n);N = n;for(i = 0;i < n;i++){printf("资源%d 的名称:",i + 1);scanf("%s",&ming);name[i] = ming;printf("资源的数量:");scanf("%d",&number);Avaliable[i] = number;}printf("\n");printf("请输入作业的数量:");scanf("%d",&m);M = m;printf("\n请输入各进程的最大需求量( %d * %d 矩阵)[Max]:\n",m,n);for(i = 0;i < m;i++)for(j = 0;j < n;j++)scanf("%d",&Max[i][j]);do{flag = 0;printf("\n请输入各进程已经申请的资源量( %d * %d 矩阵)[Allocation]:\n",m,n);for(i = 0;i < m;i++)for(j = 0;j < n;j++){scanf("%d",&Allocation[i][j]);if(Allocation[i][j] > Max[i][j])flag = 1;Need[i][j] = Max[i][j] - Allocation[i][j];}if(flag)printf("\n申请的资源大于最大需求量,请重新输入!\n\n");}while(flag);showdata(); // 显示各种资源safe(); // 用银行家算法判定系统是否安全while(1){if(t == 1){printf("\n 利用银行家算法预分配资源\n");share();t = 0;}else break;printf("\n 是否继续银行家算法?(按1 键继续,按其它任意键退出):");scanf("%d",&t);printf("\n");}return 1;}实验结果截图:运行程序:输入相应数据并完成首次自检:进程1请求资源Request(1,0,2):进程4请求资源Request(3,3,0):进程0请求资源Request(0,2,0):。

《操作系统》实验报告(2)

《操作系统》实验报告(2)
b.将f02.txt的读权限去掉(修改权限的命令是chmod),___chmod -r f02.txt____;看看还能否用cat打开该文件;不能查看,权限不够
c.将subdir目录的读权限去掉,看看是否能用ls命令看到其中内容?
权限不够
(三)Shell程序设计
1.上机编辑、执行实验内容中的例1~例6过程,写出每个脚本(例1~例5)的功能和执行结果;
然后把t01.txt复制一个新文件t03.txt,catt01.txt>t02.txt;
用cat命令将f01.txt的内容追加到t01.txt的末尾,catf01.txt>> t01.txt;
再用diff命令比较t01.txt,t02.txt和t03.txt,比较t01.txt,t02.txt:diff t01.txt t02.txt,结果是否相同:__相同___;比较t01.txt,t03.txt:diff t01.txt t03.txt,结果是否相同:不相同;比较t02.txt,t03.txt:diff t02.txt t03.txt,结果是否相同:不相同。出现上述结果的原因是:______________________________________________________________________________。
2.修改例5,使脚本中不出现break循环控制语句;
3.编写一个Shell过程完成如下功能:
a.合并两个$1、$2文件为$3,并显示内容。
b.如果缺少$3,那么先报告缺少$3,将合并后的内容输出到totaltext.txt,并显示内容。
c.如果缺少$2、$3那么先报告缺少$2、$3,只显示$1的内容。
b.用ln命令给t03.txt建立一个符号链接t04.txt,ln–st03.txt t04.txt;用cat命令看看t04.txt,___cat t04.txt_____;然后删去t03.txt,___rm t03.txt____;再用cat命令看看t04.txt,___cat t04.txt___;结果是:___t04.txt为空____

Windows操作系统实验二实验报告

Windows操作系统实验二实验报告

Windows操作系统C/C++ 程序实验姓名:_____王晨璐_____学号:____1131000046____班级:____1班_____院系:___信息工程学院_____2015__年_10_月_26_日实验二Windows 2000/xp进程控制一、背景知识二、实验目的三、工具/准备工作四、实验内容与步骤请回答:Windows所创建的每个进程都是以调用CreateProcess()API函数开始和以调用TerminateProcess()或ExitProcess() API函数终止。

1. 创建进程步骤5:编译完成后,单击“Build”菜单中的“Build 2-1.exe”命令,建立2-1.exe可执行文件。

操作能否正常进行?如果不行,则可能的原因是什么?可以正常运行。

清单2-1展示的是一个简单的使用CreateProcess() API函数的例子。

首先形成简单的命令行,提供当前的EXE文件的指定文件名和代表生成克隆进程的号码。

大多数参数都可取缺省值,但是创建标志参数使用了:CREATE_NEW_CONSOLE标志,指示新进程分配它自己的控制台,这使得运行示例程序时,在任务栏上产生许多活动标记。

然后该克隆进程的创建方法关闭传递过来的句柄并返回main() 函数。

在关闭程序之前,每一进程的执行主线程暂停一下,以便让用户看到其中的至少一个窗口。

CreateProcess() 函数有10个核心参数?本实验程序中设置的各个参数的值是:a. LPCSTR lpApplivetionName szFllenameb. LPCSTR lpCommandLine szCmdLinec. LPSECURITY_ATTRIBUTES lpProcessAttributes NULLd. LPSECURITY_ATTRIBUTES lpThreadAttributes NULLe.BOOL bInherithandle Falsef. DWORD dwCreationFlage CREATE_NEW_CONSOLEg. LPVOID ipEnvironment NULLh. LPCTSTR lpCurrentDirectory NULLI. STARTUPINFO lp startupinfo &siJ. LPPROCESS_INFORMATION lpProcessInformation &pi 程序运行时屏幕显示的信息是:提示:部分程序在Visual C++环境完成编译、链接之后,还可以在Windows 2000/xp的“命令提示符”状态下尝试执行该程序,看看与在可视化界面下运行的结果有没有不同?为什么?界面是一样的2. 正在运行的进程步骤10:编译完成后,单击“Build”菜单中的“Build 2-2.exe”命令,建立2-2.exe可执行文件。

最新操作系统实验报告实验二

最新操作系统实验报告实验二

最新操作系统实验报告实验二实验目的:1. 熟悉最新操作系统的架构和特性。

2. 掌握操作系统的基本操作和配置方法。

3. 分析操作系统的性能和稳定性。

实验环境:- 硬件环境:Intel Core i7处理器,16GB RAM,256GB SSD。

- 软件环境:最新操作系统版本X.Y.Z,图形界面和命令行界面。

实验步骤:1. 安装最新操作系统X.Y.Z,记录安装过程中的关键步骤和遇到的问题。

2. 配置系统环境,包括网络设置、显示设置、用户账户管理等。

3. 测试文件系统的性能,包括文件的创建、复制、删除和搜索操作。

4. 测试多任务处理能力,通过同时运行多个应用程序来观察系统响应时间和资源分配情况。

5. 检验系统的安全性,包括用户权限管理、防火墙设置和病毒防护功能。

6. 评估系统的稳定性,进行长时间运行测试,记录是否有崩溃或异常行为发生。

7. 对系统进行基准测试,使用专业工具如SPEC CPU测试套件来评估系统性能。

实验结果:1. 安装过程中,系统顺利识别硬件并完成驱动安装,未遇到兼容性问题。

2. 系统配置简便,图形用户界面直观易用,网络配置通过向导快速完成。

3. 文件系统测试显示,读写速度达到预期标准,搜索操作响应迅速。

4. 多任务处理测试中,系统在开启多个资源密集型应用时仍保持流畅,未出现明显延迟。

5. 安全性测试表明,用户权限分级明确,防火墙和病毒防护均能有效工作。

6. 稳定性测试中,系统连续运行72小时无故障,表现出良好的稳定性。

7. 基准测试结果显示,系统性能较前一版本有显著提升,特别是在多线程处理方面。

实验结论:最新操作系统X.Y.Z在本次实验中表现出了良好的性能和稳定性。

系统的用户界面友好,配置和管理方便。

文件系统和多任务处理能力均达到预期目标,安全性和稳定性也符合最新的操作系统标准。

推荐对性能和稳定性有较高要求的用户进行升级。

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

暨南大学本科实验报告专用纸
一、实验目的
通过进程的创建、撤销和运行加深对进程概念和进程并发执行的理解,明
确进程与程序之间的区别。

二、实验环境及设备
(一)实验室名称:计算机实验室
(二)主要仪器设备:PC机、Linux操作系统环境
三、实验内容
(1)编写一段程序,使用系统调用fork()来创建两个子进程,并由父进
程重复显示字符某字符串和自己的标识数,而子进程则重复显示某字符串
和自己的标识数。

(2)编写一段程序,使用系统调用fork()来创建一个子进程。

子进程通过系统调用exec()更换自己的执行代码,显示新的代码后,调用exit()结束。

而父进程则调用waitpid()等待子进程结束,并在子进程结束后显示子进程的标识符,然后正常结束。

四、实验调试分析
1、实验函数说明
(1)fork()创建新进程
要创建一个进程,最基本的系统调用是fork。

系统调用fork用于派生一个进程,
头文件:#include <>
函数定义:int fork( void );
返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1
函数说明:一个现有进程可以调用fork函数创建一个新进程。

由fork创建的新进程被称为子进程(child process)。

fork函数被调用一次但返回两次。

两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。

子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。

注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,它们之间共享的存储空间只有代码段。

(2)exec函数族
头文件:#include <>
函数族:
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, const char *envp[]);
int execv(const char *path, const char *argv[]);
int execve(const char *path, const char *argv[], const char *envp[]; int execvp(const char *file, const char *argv[]);
参数说明:
execl的第一个参数是包括路径的可执行文件,后面是列表参数,列表的第一个为命令path,接着为参数列表,最后必须以NULL结束。

execlp的第一个参数可以使用相对路径或者绝对路径。

execle最后包括指向一个自定义环境变量列表的指针,此列表必须以NULL 结束。

execv,v表示path后面接收的是一个向量,即指向一个参数列表的指针,注意这个列表的最后一项必须为NULL。

execve,path后面接收一个参数列表向量,并可以指定一个环境变量列表向量
execvp,第一个参数可以使用相对路径或者绝对路径,v表示后面接收一个参数列表向量。

exec被调用时会替换调用它的进程的代码段和数据段(但是文件描述符不变),直接返回到调用它的进程的父进程,如果出错,返回-1并设置errno。

(3)exit()终止进程函数
头文件:#include <>
exit()函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构。

(4)waitpid()父进程等待子进程中等或结束后才执行
头文件:#include<sys/> 或 #include<sys/>
定义函数: pid_t waitpid(pid_t pid,int * status,int options);函数说明:waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。

如果在调用 waitpid()时子进程已经结束,则 waitpid()会立即返回子进程结束状态值。

子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一起返回。

如果不在意结束状态值,则参数status可以设成NULL。

参数pid为欲等待的子进程识别码, 其他数值意义如下:
pid<-1 等待进程组识别码为 pid 绝对值的任何子进程。

pid=-1 等待任何子进程,相当于 wait()。

pid=0 等待进程组识别码与目前进程相同的任何子进程。

pid>0 等待任何子进程识别码为 pid 的子进程。

参数options提供了一些额外的选项来控制waitpid,参数 option 可
以为 0 或可以用"|"运算符把它们连接起来使用。

2、实验调试
(1)实验一调试
刚开始在写两个fork()程序时,是将两个fork()函数写在一起,如果是这样的话,第二次调用fork()语句时就可能不满足实验的要求了,因为父子进程的执行顺序是任意的,在第二次调用fork()函数时,可能是第一次调用产生的子进程在调用这个fork()函数,就会返回0值,不符合实验要求创建两个子进程的条件,因此应在确定当前进程时父进程时才调用fork()语句创建第二个子进程。

(2)实验二调试
创建子进程后,调用execl()将参数中指定的新进程代替原有的进程,若能够成功替换该进程就不会执行该函数后面的exit(0),转向执行新进程,待所有的子进程执行完毕后,就会转向执行waitpid()函数,再返回子进程的识别码,并输出;若没有替换成功就会执行execl()后面的语句exit(0),终止当前的子进程,再转向执行waitpid()语句。

备注:实验调试过程中未能将调试结果截图是本次实验的一大败笔。

下次会注意的。

五、实验结果
六、实验源程序
/*实验二程序*/
#include<>
#include<>
#include<>
int main()
{
pid_t pid1,pid2;
/*先创建一个子进程*/
pid1=fork();
if(pid1<0){
/*pid1没创建子进程成功*/
printf("fail to fork.\n");
exit(1);
}else if(pid1 == 0){
printf("child,pid is : %u\n",getpid()); }else
{
printf("parent,pid is :%u\n",getpid());
/*若是父进程,则再新创建其子进程*/
pid2=fork();
if(pid2<0){
printf("fail to fork.\n");
exit(1);
}else if(pid2 == 0){
printf("child,pid is : %u\n",getpid());
}else
{
printf("parent,pid is :%u\n",getpid());
}
}
return 0;
}
/*实验二程序*/
#include<>
#include<sys/>
#include<>
#include<>
int main(){
pid_t pid;
int result;
/*创建子进程*/
pid = fork();
if(pid <0)
printf("fork error");
else if (pid == 0)
{
/*若是子进程*/
printf("new program.\n");
/*替换当前的进程*/
execl("/root/","",0);
/*若没有替换成功,终止该子进程*/ exit(0);
}
else{
/*若子进程全部执行结束,*/
/*则返回子进程的进程标识码*/
int e=waitpid(pid,&result,0);
printf("Child process PID:%d.\n",e);
exit(0);
}
}
七、实验心得
通过做这次实验,了解了子进程和父进程的调用顺序,以及调用的结果,而且通过调用fork()可以知道存在三种情况下,子进程发生调用的变化。

相关文档
最新文档