2012级操作系统实验报告

合集下载

操作系统实验报告三

操作系统实验报告三

操作系统实验报告三一、实验目的本次实验的目的是通过设计和实现一个简单的操作系统,加深对操作系统内核设计的理解,并学习操作系统内核的基本构建和运行原理。

二、实验背景操作系统是计算机系统中最核心的软件之一,它负责管理计算机的各种资源以及协调和控制应用程序的执行。

操作系统的设计和实现使计算机能够高效地运行并提供友好的用户接口。

操作系统也为应用程序提供了统一的软硬件访问接口,方便开发人员进行软件开发。

操作系统的设计和实现是计算机科学与技术领域中重要的研究方向之一。

通过操作系统的实验,可以深入了解操作系统的内部原理和机制,加深对操作系统的理解和认识。

三、实验内容本次实验需要设计和实现一个简单的操作系统,完成以下功能:1. 实现一个简单的内存管理模块,包括内存分配和释放的功能。

2. 实现一个简单的进程管理模块,包括进程的创建、撤销和切换的功能。

3. 实现一个简单的文件系统模块,包括文件的读写和目录的管理功能。

4. 实现用户与操作系统之间的交互界面,方便用户进行操作系统的使用。

四、实验步骤1. 设计和实现内存管理模块:a. 设计内存分配算法,根据系统的需要分配和释放内存空间。

b. 实现内存分配和释放的功能函数,确保能够正确地分配和释放内存空间。

2. 设计和实现进程管理模块:a. 设计进程控制块(PCB),记录进程的相关信息。

b. 实现进程的创建、撤销和切换的功能函数,确保进程能够正确地被创建、撤销和切换。

3. 设计和实现文件系统模块:a. 设计文件控制块(FCB),记录文件的相关信息。

b. 实现文件的读写和目录的管理功能函数,确保文件能够正确地被读写和目录能够正确地被管理。

4. 实现用户与操作系统之间的交互界面:a. 设计用户界面,包括命令解释器等。

b. 实现用户输入命令的解释和执行函数,确保用户能够正确地与操作系统进行交互。

五、实验结果与分析经过实验,我们成功地设计和实现了一个简单的操作系统,并完成了内存管理、进程管理和文件系统的功能实现。

《操作系统》实验报告

《操作系统》实验报告

《操作系统》实验报告一、实验目的操作系统是计算机系统中最为关键的组成部分之一,本次实验的主要目的是深入理解操作系统的基本原理和功能,通过实际操作和观察,熟悉操作系统的核心概念,包括进程管理、内存管理、文件系统和设备管理等,提高对操作系统的实际应用能力和问题解决能力。

二、实验环境本次实验在以下环境中进行:操作系统:Windows 10开发工具:Visual Studio 2019编程语言:C++三、实验内容1、进程管理实验进程是操作系统中最基本的执行单元。

在这个实验中,我们使用C++编写程序来创建和管理进程。

通过观察进程的创建、执行和结束过程,理解进程的状态转换和资源分配。

首先,我们编写了一个简单的程序,创建了多个子进程,并通过进程标识符(PID)来跟踪它们的运行状态。

然后,使用等待函数来等待子进程的结束,并获取其返回值。

在实验过程中,我们发现进程的创建和销毁需要消耗一定的系统资源,而且进程之间的同步和通信需要谨慎处理,以避免出现死锁和竞争条件等问题。

2、内存管理实验内存管理是操作系统的核心功能之一,它直接影响系统的性能和稳定性。

在这个实验中,我们研究了动态内存分配和释放的机制。

使用 C++中的 new 和 delete 操作符来分配和释放内存。

通过观察内存使用情况和内存泄漏检测工具,了解了内存分配的效率和可能出现的内存泄漏问题。

同时,我们还探讨了内存分页和分段的概念,以及虚拟内存的工作原理。

通过模拟内存访问过程,理解了页表的作用和地址转换的过程。

3、文件系统实验文件系统是操作系统用于管理文件和目录的机制。

在这个实验中,我们对文件的创建、读写和删除进行了操作。

使用 C++的文件流操作来实现对文件的读写。

通过创建不同类型的文件(文本文件和二进制文件),并对其进行读写操作,熟悉了文件的打开模式和读写方式。

此外,还研究了文件的权限设置和目录的管理,了解了如何保护文件的安全性和组织文件的结构。

4、设备管理实验设备管理是操作系统与外部设备进行交互的桥梁。

操作系统实验--处理机调度算法实现

操作系统实验--处理机调度算法实现
主要用到的技术是STL中的vector以维护和保存进程容器、就绪容器、完成容器。
当程序启动时,用户可以选择不同的调度算法。然后用户从控制台输入各个进程的信息,这些信息保存到进程容器中。进程信息输入完毕后,就开始了进程调度,每调度一次判断就绪队列是否为空,若为空则系统时间加一个时间片。判断进程容器中是否有新的进程可以加入就绪队列。
struct proc //定义进程结构体
{
char name[5];
int num;
int pri;
};
void main()//主函数
{ char ch;
struct proc pr[n];//声明结构体数组
int i,k,j;
int count=n;
for(i=0;i<n;i++)//输入5个进程
函数描述:
struct proc/*定义结构体内部包含进程的信息*/
{
char name[5]; /*定义进程名*/
int num; /*定义运行时间*/
int pri; /*定义优先权*/
};
Void main()/*主函数:掌控整个程序的运行过程,是程序的主体部分*/
struct proc pr[n];/*声明结构体数组*/
4.处理机调度总是选队首进程运行。采用动态优先数算法,进程每运行一次优先数就减“1”,同时将运行时间减“1”。
5.若要求运行时间为零,则将其状态置为“结束”,且退出队列。
6.运行所设计程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程
实验过程与实验结果(可包括实验实施的步骤、算法描述、流程、结论等)
for(k=1;k<n;k++)

操作系统 实验报告

操作系统 实验报告

操作系统实验报告操作系统实验报告引言:操作系统是计算机系统中最重要的软件之一,它负责管理计算机硬件资源,并提供程序运行环境。

操作系统的设计和实现是计算机科学领域的重要研究方向之一。

本篇实验报告将介绍我们在操作系统实验中所进行的实践和实验结果。

一、实验目的我们的实验目的是通过实践操作系统的基本功能,深入理解操作系统的原理和实现方式。

具体来说,我们的实验目标包括:1. 学习并掌握操作系统的基本概念和原理;2. 理解操作系统与硬件之间的交互过程;3. 实践操作系统的进程管理、内存管理和文件系统等功能;4. 分析操作系统的性能和优化策略。

二、实验环境我们使用了一台配置较高的计算机作为实验环境,该计算机配备了一块主频为2.5GHz的多核处理器、8GB内存和500GB硬盘。

我们选择了一款常见的操作系统作为实验平台,以便于进行实验和调试。

三、实验过程1. 进程管理在进程管理实验中,我们实现了进程的创建、调度和终止等功能。

首先,我们编写了一个简单的程序,用于创建多个进程并进行调度。

然后,我们通过观察进程的执行顺序和时间片分配情况,分析操作系统的调度算法对系统性能的影响。

2. 内存管理在内存管理实验中,我们实现了内存的分配和回收等功能。

我们编写了一个模拟程序,用于模拟内存的分配和释放过程。

通过观察内存分配的效率和内存碎片的情况,我们评估了不同的内存管理算法的性能。

3. 文件系统在文件系统实验中,我们实现了文件的创建、读写和删除等功能。

我们编写了一个简单的文件操作程序,用于测试文件系统的性能和可靠性。

通过观察文件系统的读写速度和文件恢复的效果,我们评估了不同的文件系统实现方式的优劣。

四、实验结果通过实验,我们获得了以下结果:1. 进程管理实验中,我们发现不同的调度算法对系统性能的影响差异较大。

短作业优先算法在短时间内能够提高系统的响应速度,而时间片轮转算法则能够保证公平性。

2. 内存管理实验中,我们发现不同的内存管理算法对内存利用率和碎片情况有很大的影响。

操作系统 实验报告

操作系统 实验报告

操作系统实验报告操作系统是计算机硬件和应用软件之间的一个重要桥梁,它提供了对硬件资源的管理和调度,为应用程序提供了一个运行环境。

在操作系统的发展历史中,经历了批处理系统、分时系统、网络操作系统等不同的阶段和发展方向。

本次实验主要涉及操作系统的进程管理、文件系统以及内存管理。

首先是进程管理,进程是计算机中最基本的执行单元,负责处理用户的请求并执行相应的操作。

在实验中,我们使用了进程调度算法来调度不同的进程。

进程调度算法的选择会直接影响到系统的性能和响应时间。

最常见的进程调度算法有FCFS(先到先服务)、SJF(短作业优先)、RR(时间片轮转)等。

本次实验中,我们实现了一个简单的RR调度算法,按照时间片的顺序轮流使用CPU资源。

实验结果显示,RR调度算法能够有效地保证多个进程同时运行且公平地使用CPU。

其次是文件系统,文件系统是操作系统中管理文件和文件夹的机制。

在实验中,我们使用了文件管理的一些基本操作如创建文件、打开文件、写入文件和关闭文件等。

在文件的操作过程中,通过文件指针来记录当前的读写位置以便于下一次读写。

实验结果显示,文件管理功能能够很好地实现对文件的读写和管理。

最后是内存管理,内存是计算机中存储数据和程序的地方,对于操作系统来说管理和分配内存是一个非常重要的任务。

在实验中,我们主要学习了内存的分区管理和分页管理。

内存的分区管理将内存划分为若干个大小不等的区域,每个程序占用相应的内存空间。

而内存的分页管理则将程序划分为固定大小的页,同时也将内存划分为页框,通过页表来进行地址映射。

实验结果显示,分页管理可以有效地利用内存资源,提高系统的性能和可用性。

通过本次操作系统实验,我对操作系统的原理和实践有了更深入的理解。

在实验中,我了解了进程管理、文件系统和内存管理的基本概念和功能,并通过实验来掌握相关的操作和原理。

通过实验的过程,我深刻地认识到操作系统对计算机的重要性,以及良好的操作系统设计对系统性能的影响。

操作系统课程实验报告

操作系统课程实验报告

一、实验概述实验名称:操作系统课程实验实验目的:1. 理解操作系统基本概念、原理及功能;2. 掌握操作系统的基本操作和应用;3. 提高实际操作能力和分析问题、解决问题的能力。

实验内容:1. 操作系统基本概念及原理的学习;2. 操作系统基本操作的应用;3. 实验项目:文件读写、多进程、多线程。

二、实验环境操作系统:Windows 10编译器:Visual Studio语言:C/C++实验平台:Windows 10系统下的虚拟机三、实验过程1. 操作系统基本概念及原理的学习操作系统是计算机系统中最基本的系统软件,负责管理计算机硬件资源、提供用户接口以及执行各种应用程序。

在实验过程中,我们学习了以下基本概念及原理:(1)进程管理:进程是操作系统能够进行运算处理的独立单位,具有动态性、并发性、异步性和独立性等特点。

进程管理主要包括进程的创建、调度、同步、通信和终止等。

(2)内存管理:内存管理是操作系统核心功能之一,主要负责分配、回收、保护和管理内存资源。

内存管理方式有分页、分段、段页式等。

(3)文件系统:文件系统是操作系统用于存储、检索和管理文件的机制。

文件系统主要包括目录结构、文件属性、文件操作等。

(4)设备管理:设备管理负责管理计算机系统中的各种外部设备,包括输入、输出和存储设备。

设备管理主要包括设备分配、设备驱动程序、缓冲区管理等。

2. 操作系统基本操作的应用在实验过程中,我们应用以下基本操作:(1)进程管理:创建、调度、同步、通信和终止进程。

(2)内存管理:分配、回收、保护和管理内存资源。

(3)文件系统:创建、删除、读写文件,实现目录结构的管理。

(4)设备管理:分配、回收、控制和管理设备。

3. 实验项目:文件读写、多进程、多线程(1)文件读写实验实验目的:掌握文件的基本操作,实现文件的创建、打开、读取、写入和关闭。

实验步骤:① 创建一个文件,命名为“test.txt”。

② 打开文件,以读写模式。

2012 操作系统实验1

2012 操作系统实验1

《操作系统》课程实验报告实验名称进程同步算法的实现模拟实验序号 1姓名刘徐俊系院专业计算机班级10网络1 学号实验日期2012-11-01 指导教师阮鸥成绩一、实验目的进程同步问题是OS的核心内容。

本实验要求用高级语言编写和调试一个程序来模拟进程同步算法。

通过本实验可以加深理解有关同步技术、进程控制块、进程队列的概念,并体会和了解同步(生产者—消费者问题)算法的具体实施办法。

二、实验内容与要求(1) 模拟实现生产者—消费者问题。

Get、put二进程共用缓冲区s(大小为每次只存放一个记录)。

Get负责输入记录到缓冲区s,put负责把t中的记录取出打印。

(2) 设计进程PCB结构和三种进程状态的队列,可以实现PCB队列的插入、删除、排序功能。

(3) 设计各进程使用的信号灯,画出各进程的P、V操作实现流程图;(4)实现进程同步,完成记录的正常输出,要能够通过程序运行表现出对缓冲区s的进行临界区互斥和进程同步的思想(最好能记录或输出二个进程的实时状态和变化过程、二个进程队列的实时内容、几个缓冲区中实时内容,输出到屏幕上,这个过程同时记录在一个文本文件中);(5) 编程语言不限制,tc2.0,vc6.0,.net,java都可以。

三、实验设备地点:科技楼网络实验室602硬件环境:Intel Pentium Processor 1.8G ,512M内存,windows 操作系统软件环境:win7系统vc++6.0四、实验步骤(1)模拟实现生产者—消费者问题。

Get、put二进程共用缓冲区s(大小为每次只存放一个记录)。

Get负责输入记录到缓冲区s,put负责把t中的记录取出打印。

实验代码:#include <windows.h>#include <stdio.h>#include <producerThread.h>#include <consumerThread.h>DWORD WINAPI producerThread(LPVOID lp){int n=(int)lp;while(empty>0){EnterCriticalSection(&CriticalSection);printf("producer produce %dth good\n", n, T_MAX-empty+1);empty--;LeaveCriticalSection(&CriticalSection);Sleep(500);}void MyThread(){ HANDLE get ,put;get = CreateThread(NULL,NULL,producerThread,(void*)1,NULL,NULL);put = CreateThread(NULL,NULL,producerThread,(void*)2,NULL,NULL);int main(int argc, char* argv[]){//创建临界区对象InitializeCriticalSection(&CriticalSection);2湖北工业大学 计算机学院网络工程系·2009年编制3if(empty>0)MyThread();Sleep(50000);//删除临界区对象 DeleteCriticalSection(&CriticalSection);return 0;}main(){int full=0;int empty=n;int mutex=1;cobeginp1();p2();p3();...pm();c1();c2();c3();...ck();coend}producer(){while(生产未完成)...生产一个产品;P(empty);p(mutex);送一个产品到缓冲区;v(mutex);v(full);}}consumer(){while(还要继续消费){p(full);p(mutex);从有界缓冲区中取产品;v(mutex);v(empty);...消费一个产品;}}具体实现程序:#include "stdafx.h"#include "windows.h"4湖北工业大学 计算机学院网络工程系·2009年编制5 #include "string.h"char temp; //中间缓存DWORD WINAPI Get(LPVOID lp){ //将要打印的字符取出并一个一个的存入缓存char * sp;sp=( char *) lp;while(1) //字符结束标志'\0'{ temp=*sp;if(temp=='\0') return 0;sp++;Sleep(500);}return 0;}DWORD WINAPI Put(LPVOID lp){ //将字符从缓存里面取出,一次一个printf("output the string:");while(temp!='\0'){printf("%c ",temp);Sleep(500);}putchar('\n');return 0;}void Mythread(char sp []){ //建立两个并行线程HANDLE handle1,handle2;handle1 = CreateThread(NULL,NULL,Get,(void*)sp,NULL,NULL);handle2 = CreateThread(NULL,NULL,Put,NULL,NULL,NULL);}int main(int argc, char* argv[]){char sp[100]={'\0'};printf("input the string to print:");scanf("%s",sp);Mythread(sp);Sleep(10000);printf("the output come to teh end !\n");return 0;}(2)设计进程PCB结构和三种进程状态的队列,可以实现PCB队列的插入、删除、排序功能。

操作系统实验报告

操作系统实验报告

操作系统实验报告班级:软件1042姓名:******学号:101*****指导老师:***老师安徽工业大学工商学院2012年12月目录实验一 WINDOWS进程初识 (2)1、实验目的 (2)2、实验内容和步骤 (2)3、实验结论 (4)实验二进程管理 (4)1、实验目的 (4)2、实验内容和步骤 (4)3、实验结论 (9)实验三进程同步的经典算法 (9)1、实验目的 (9)2、实验内容和步骤 (10)3、实验结论 (12)实验四存储管理 (12)1、实验目的 (12)2、实验内容和步骤 (12)3、实验结论 (19)实验一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中的程序拷贝过来,编译成可执行文件。

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

哈尔滨学院实验报告课程名称:计算机操作系统专业软件工程:级班:128-号学:12031801名姓:常燕如教务处制实验一进程管理【实验目的与要求】⒈加深对进程概念的理解,明确进程与程序的区别。

⒉掌握Linux进程创建及撤销的方法,进一步认识并发执行的实质。

⒊掌握Linux系统下守护进程的创建方法。

【实验原理】⒈ Linux进程管理命令⑴进程查瞧⑵进程终止⑶进程优先级设置⒉ Linux进程控制函数⑴创建与修改进程⑵设置进程属性⑶获取进程属性⑷进程的退出⒊ Linux守护进程⑴独立启动守护进程⑵超级守护进程⑶守护进程的编写流程守护进程的编写遵循特定的流程,主要包括五个步骤:Step⒈创建子进程,退出父进程Step⒉在子进程中创建新会话Step⒊改变当前目录为根目录Step⒋重设文件权限掩码Step⒌关闭文件描述符【实验主要仪器与材料】⒈带Linux操作系统的PC机⒉ GCC编译器【实验内容】⒈获取进程信息通过管理命令,获取系统当前执行进程的信息,包括进程名称与ID、PID与PGID等。

⒉创建进程编程程序,实现父进程创建一个子进程,返回后父子进程都分别循环输出字符串“I am parent、”或“I am child、”5次,每输出一次延时1秒(sleep(1)),然后进入下一次循环。

观察并分析运行结果。

然后将程序改为父子进程同步执行:子进程循环输出字符串“I am child、”5次,然后父进程再循环输出字符串“I am parent、”5次。

再次观察并分析运行结果。

【实验步骤及实验结果分析】⒈实验内容1通过进程实现及验证父进程及子进程的id号的命令ps -lg⒉实验内容2⑴实现父进程创建一个子进程,返回后父子进程都分别循环输出字符串“I am parent、”或“I am child、”5次,每输出一次延时1秒(sleep(1)),然后进入下一次循环。

#include<sys/types、h>#include<unistd、h>#include<stdio、h>int main(){pid_t pt;printf("Hello world!\n");int i;pt=fork();for(i=0;i<5;i++){if(pt==-1)printf("Fork error、\n");else if{printf("I am a parent、\n");Sleep(1);}else{printf("I am a child、\n");Sleep(1);}}return 0;}⑵父子进程同步执行:子进程循环输出字符串“I am child、”5次,然后父进程再循环输出字符串“I am parent、”5次。

#include<sys/types、h>#include<unistd、h>#include<stdio、h>int main(){pid_t pt;printf("Hello world!\n");int i;pt=fork();for(i=0;i<5;i++){if(pt==-1)printf("Fork error、\n");else if{printf("I am a parent、\n");}else{printf("I am a child、\n");}}return 0;}【思考题】⒈程序与进程的区别。

(1)程序就是动态的,程序就是静态的:程序就是有序代码的集合;进程就是程序的执行。

通常进程不可在计算机之间迁移;而程序通常对应着文件、静态与可以复制。

(2)进程就是暂时的,程序就是永久的:进程就是一个状态变化的过程,程序可长久保存。

(3)进程与程序的组成不同:进程的组成包括程序、数据与进程控制块(即进程状态信息)。

(4)进程与程序的对应关系:通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。

⒉Linux操作系统下有哪些进程类型。

交互进程; 批处理进程; 守护进程;⒊进程创建函数fork与vfork的区别。

(1)fork()用于创建一个新进程。

由fork()创建的子进程就是父进程的副本。

即子进程获取父进程数据空间,堆与栈的副本。

父子进程之间不共享这些存储空间的部分。

而vfork()创建的进程并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec(或exit)于就是也就不会存放该地址空间。

相反,在子进程调用exec或exit之前,它在父进程的空间进行。

(2)vfork()与fork()另一个区别就就是:vfork保证子进程先运行,在调用exec或exit之前与父进程数据就是共享的,在它调用exec或exit之后父进程才可能被调度运行。

(3)vfork与fork之间的还有一个区别就是:vfork保证子进程先运行,在她调用exec或exit之后父进程才可能被调度运行。

如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

⒋进程的退出函数有哪些?有何区别?C程序就是如何被启动终止的?exit函数; return函数; abort函数_exit函数。

exit与_exit函数用于正常终止一个程序exit先执行一些清除处理、然后进入内核清除操作包括调用执行各终止处理程序,关闭所有标准I/O流_exit立即进入内核abort函数用于异常终止一个程序exit就是一个函数,有参数,把控制权交给系统return就是函数执行完后的返回,将控制权交给调用函数实验二进程通信【实验目的与要求】⒈了解基于信号的进程通信机制。

⒉熟悉LINUX系统中进程之间软中断通信的基本原理。

【实验原理】一、信号⒈信号的基本概念⒉信号的发送⒊对信号的处理二、所涉及的中断调用⒈kill()⒉signal()⒊wait()⒋waitpid()⒌lockf()【实验主要仪器与材料】⒈带Linux操作系统的PC机⒉GCC编译器【实验内容】⒈编写程序:用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child process1 is killed by parent!Child process2 is killed by parent!父进程等待两个子进程终止后,输出如下的信息后终止:Parent process is killed!⒉分析利用软中断通信实现进程同步的机理。

【实验步骤及实验结果分析】⒈编写程序:用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child process1 is killed by parent!Child process2 is killed by parent!父进程等待两个子进程终止后,输出如下的信息后终止:Parent process is killed!⒉对软中断信号的处理分三种情况进行:(1)如果进程收到的软中断就是一个已决定要忽略的信号,不做处理便立即返回。

(2)进程收到软中断后便退出。

(3)执行用户设置的软中断处理程序。

【思考题】实验内容的参考程序如下,请仔细阅读、调试、分析,回答下述问题:#include <stdio、h>#include <signal、h>#include <unistd、h>#include <stdlib、h>#include <sys/wait、h>void waiting(),stop();int wait_mark;int main(){int p1, p2, stdout=1;while((p1=fork()) == -1); /*创建子进程p1*/if (p1 > 0){while((p2=fork()) == -1); /*创建子进程p2*/if(p2 > 0){wait_mark=1;signal(SIGINT, stop); /*接收到^c信号,转stop*/waiting();kill(p1, 16); /*向p1发软中断信号16*/kill(p2, 17); /*向p2发软中断信号17*/wait(0); /*同步*/wait(0);printf("Parent process is killed!\n");exit(0);}else{wait_mark=1;signal(17, stop); /*接收到软中断信号17,转stop*/waiting();lockf(stdout, 1, 0);printf("Child process 2 is killed by parent!\n");lockf(stdout, 0, 0);exit(0);}}else{wait_mark=1;signal(16, stop); /*接收到软中断信号16,转stop*/waiting();lockf(stdout, 1, 0);printf("Child process 1 is killed by parent!\n");lockf(stdout, 0, 0);exit(0);}return 0;}void waiting(){while(wait_mark != 0);}void stop(){wait_mark=0;}⒈参考程序段前面部分用了两个wait(0),它们起什么作用?作用:wait(0)函数作用就是等待子进程结束,父进程有两个子进程,所以两个wait函数。

⒉参考程序段中每个进程退出时都用了语句exit(0),为什么?作用:就是为了让子进程正常自我终止,正常退出。

⒊参考程序的运行结果就是什么?Parent process is killed!⒋参考程序就是否符合实验要求?为什么?不符合。

原因:p1,p2都会捕捉中断信号。

对于父进程,当它捕捉到中断信号时就会转向指定的函数stop();函数,之后父进程被唤醒,从被中断处继续执行。

对于子进程,由于没有给它们指定的收到中断信号后的动作,就会执行默认的动作,结束自己。

所以当我们发出中断信号后,父进程按预计的方式正常执行,而p1,p2自己结束了自己,所以不会有预计的结果。

相关文档
最新文档