进程控制与描述实验报告

时间:2024.5.2

一、实验目的

利用Windows提供的API函数,编写程序,实现进程的创建和终止(如创建写字板进程及终止该进程),加深对操作系统进程概念的理解,观察操作系统进程运行的动态性能,获得包含多进程的应用程序编程经验。

二、实验内容

编写一个在dos界面下的简单进程控制系统,实现根据用户选项进行进程的创建、终止,并提供进程的状态。

(1)进程的创建和终止。编写一段程序,可以创建一个进程,并终止当前创建的进程。试观察记录程序执行的结果,并分析原因。

(2)利用VC++6.0实现上述程序设计和调试操作,对于进程创建的成功与否、终止进程操作的成功与否提供一定的提示框。

(3)通过阅读和分析实验程序,学习创建进程、观察进程和终止进程的程序设计方法

三、实验步骤

1.创建进程

使用了Windows提供的CreateProcess函数来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。

函数原型:

BOOL CreateProcess{

    LPCTSTR lpApplicationName,       

    LPTSTR lpCommandLine,       

    LPSECURITY_ATTRIBUTES lpProcessAttributes。

    LPSECURITY_ATTRIBUTES lpThreadAttributes,       

    BOOL bInheritHandles,       

    DWORD dwCreationFlags,

    LPVOID lpEnvironment,       

    LPCTSTR lpCurrentDirectory,       

    LPSTARTUPINFO lpStartupInfo,        

    LPPROCESS_INFORMATION lpProcessInformation

};

一个线程调用该函数首先创建一个进程内核对象用来管理此新进程,随后系统为新进程创建虚拟地址空间,并将可执行文件的代码和数据加载到这个地址空间,接着系统为新进程的主线程创建一个线程内核对象。

本程序所使用的函数中各参数的解释:

1.lpApplicationName

指向一个NULL结尾的、用来指定可执行模块的字符串。这个字符串可以使可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。

  这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处于 lpCommandLine 参数的最前面并由空格符与后面的字符分开。

2.lpCommandLine

传递给新进程的命令行字符串,应当为非常量字符串的地址。可以设定一个完整的命令行,如果第一个标记没有扩展名,CreateProcess将其假设为.exe。如果找不到该文件,CreateProcess按环境设置目录搜索运行。

3.bInheritHandles

决定子进程对父进程继承性,一般设为FALSE。

4.dwCreationFlags

用于标识标志,以便用于规定如何来创建新进程。

5.lpStartupInfo

指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体。

6.lpProcessInformation

指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体。

在使用CreateProcess函数之前首先要对STARTUPINFO结构体进行初始化,来指定新的进程如何显示,这里对参数不再详细展开。

PROCESS_INFORMATION结构体

typedef struct _PROCESS_INFORMATION {

  HANDLE hProcess; // 存放每个对象的与进程相关的句柄

  HANDLE hThread; // 返回的线程句柄

  DWORD dwProcessId; // 用来存放进程ID号

  DWORD dwThreadId; // 用来存放线程ID号

}PROCESS_INFORMATION,*PPROCESS_INFORMATION,*LPPROCESS_INFORMATION;

调用Createprocess()函数后,会自动地对该结构进行填充。

创建新进程可使系统建立一个进程内核对象和一个线程内核对象。在创建进程的时候,系统为每个对象赋予一个初始使用计数值1 。然后,在createProcess返回之前,该函数打开进程对象和线程对象,并将每个对象的与进程相关的句柄放入PROCESS_INFORMATIO结构的hProcess和hThread成员中。当CreateProcess在内部打开这些对象时,每个对象的使用计数就变为2。

2.终止进程

一个进程终止时,系统会依次执行以下操作:

1、终止进程中遗留的任何线程。

2、释放进程分配的所有用户对象,关闭所有内核对象。如果它们的使用计数变为0,内核对象将会释放。

3、将进程的退出代码从STILL_ACTIVE变为传给ExitProcess或是TerminateProcess的参数存储在内核对象中。

4、进程内核对象变为一触发状态。这也是为什么其他线程可以挂起他们自己直至另一个进程终止运行。

5、进程内核对象的使用计数递减1。

本实验使用了Windows提供的TerminateProcess函数来终止进程。

TerminateProcess函数原型:

BOOL TerminateProcess{

HANDLE hProcess          

UINT uExitCode           

};

函数中各参数的解释:

1.hProcess

指定要中断进程的句柄。该句柄可以由 OpenProcess得到.

2.uExitCode

进程和其所有线程的退出代码

这个函数可以用来终止或者说杀死一个进程,它不会留给进程及其所有线程清理的时间,系统会马上终止(杀死)这个进程的所有线程,致使进程终止。在使用此函数前我们必须要调用OpenProcess函数来获得我们要终止进程的句柄,并且要获得进程的PROCESS_TERMINATE权限。

本次试验中设计的简单进程控制系统,由于采用了堆栈式的方法,即每次都将用来接收新进程的识别信息的PROCESS_INFORMATION结构体存入到一个特定的堆栈中去,这样就可以直接利用里面的参数获取需要终止的进程的句柄,从而避免了使用OpenProcess函数的麻烦。当然若这种方法只适用与这样一个简单的小型系统,并不具有普适性。

四、系统截图

1、初始界面

2、打开多个进程

3、关闭进程和相关提醒

五、思考

1.系统是怎样创建进程的?

操作系统分成以下步骤来完成:1)打开将要再该进程中执行的映像文件;2)创建Windows执行体进程对象;3)创建初始线程(栈、堆执行环境初始化及执行线程体对象);4)通知Windows子系统已新进程创建;5)开始执行初始线程;6)在新进程和线程环境中完成地址空间的初始化(比如加载必须的DLL和库),然后开始到进程入口执行。至此,完成所有的创建工作。

2.可执行文件加载时进行了那些处理?

   首先操作系统判断该文件是否是一个合法的可执行文件。如果是则操作系统将按照段表中的指示为可执行程序分配地址空间。

再者进行了将源代码转换为机器可认识代码的过程。编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。具体经过以下几个处理:

C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件。

3.当首次调用新创建进程时,其入口在哪里?

首次调用新创建进程的入口在指向进程的句柄。

六、遇到的问题

1、由于是第一次接触到Createprocess函数和TerminateProcess函数,所以对函数内部的参数意义并不是很明朗,导致无法顺利地创建与终止进程,因此也花了较多的时间去了解各个参数实际的作用;

2、在实验的过程中碰到了不同编译器对有效地址字符串的处理问题,如在cfree编辑器正常运行的代码在VS中报错,强制转换后出现指针溢出等问题。经过反复思考与去网上所搜答案得知VS在处理字符串时转化成Unicode编码进行,在改过后VS无报错现象;

3、在上面的叙述中也有提到,针对这次试验的特殊性,并没有使用OpenProcess函数去获取相应进程的句柄并加以控制,而是用了比较取巧的方法保留了每个进程的状态信息,虽然简化了代码的编写,但实际并不正规;

4、也是花了较大的力气去尝试给出用户界面,但是在VS2010环境下MFC程序不知原因报出了一个溢出错误,暂时无法解决;而且想利用通过将C代码封装成dll文件并用C#进行调用的努力也以失败结束,因此在这次的实验中只能采用dos下的简单用户界面,也算是无奈之举,接下来的实验会努力给出完整的界面使其看起来更像一个完整的系统。


第二篇:进程控制实验报告电子版


福州大学数学与计算机科学学院

操作系统上机实验报告

更多相关推荐:
机械控制工程基础实验报告

中北大学机械与动力工程学院实验报告专业名称实验课程名称实验项目数总学时班级学号姓名指导教师协助教师日期年月日实验二二阶系统阶跃响应一实验目的1研究二阶系统的特征参数如阻尼比和无阻尼自然频率n对系统动态性能的影响...

控制工程基础 实验报告

控制工程基础课程实验报告班级学号91211020xx25姓名南京理工大学20xx年1月1控制工程基础课程仿真实验一已知某单位负反馈系统的开环传递函数如下25分Gs10s25s25借助MATLAB和Simulin...

控制工程基础实验报告

控制工程基础实验报告姓名班级学号目录实验三131实验目的132实验内容133实验结果2实验四1541实验目的1542实验内容1543实验结果15实验三控制系统的频域与时域分析一实验目的1掌握控制系统数学模型的基...

现代控制工程实验报告

实验一传递函数与状态空间模型的转换实验时间10月9日实验地点机电楼实验人邹金萍一实验目的学会使用matlab将传递函数变为状态空间表达式二实验原理为了将传递函数变为状态空间表达式Matlab中提供了函数tf2s...

过程控制工程实验报告模板

成绩过程控制工程实验报告班级姓名学号指导老师实验日期目录实验一上水箱特性测试计算机控制实验2实验二压力单闭环控制系统的设计与实验7实验三上水箱液位和流量串级系统计算机控制9实验四流量比值控制系统计算机控制122...

20xx控制工程基础实验报告

控制工程基础课程实验报告班级学号姓名南京理工大学20xx年12月控制工程基础课程仿真实验一已知某单位负反馈系统的开环传递函数如下25分Gs10s25s25借助MATLAB和Simulink完成以下要求1把Gs转...

三相异步电动机的直接起动、点动控制实验报告

三相异步电动机的直接起动点动控制实验报告姓名杨宇学号091542班级10931专业数控指导老师申爱民20xx418一实验目标1熟悉常用低压电器仪表的使用及接线2熟悉三相异步电动机的铭牌数据并能正确接线3训练三相...

机械控制工程基础实验报告

机械控制工程基础实验报告一机械控制工程基础实验报告二机械控制工程基础实验报告三

清华大学精仪系--控制工程基础--实验内容与实验报告

实验内容一直流电机双环调速系统实验此时必须松开连轴节不带动工作台1测试电流环特性由于外接霍尔传感器只有一套有五套PWM放大器有电流输出接成跟随器方式其电流采样输出为25芯D型插座的17模拟地19脚但模拟地是电流...

《机械工程控制基础》Matlab仿真实验报告单(实验二)

工学院实验报告单机械工程控制基础Matlab仿真实验报告单课程名称机械工程控制基础实验姓名日期成绩年级专业实验二一阶二阶线性系统时间响应的Matlab仿真实验一实验内容1一阶线性系统1当T分别取012以及5时系...

天津大学控制工程基础matlab上机实验报告

机械控制工程基础上机实验报告第三章时域分析法习题310单位阶跃响应num22050den11584223309240100stepnumdengridsubplot221单位脉冲响应num220500den11...

《机械工程控制基础》Matlab仿真实验报告单(实验三)

红河学院工学院实验报告单机械工程控制基础Matlab仿真实验报告单课程名称机械工程控制基础实验姓名日期成绩年级专业20xx级机械工程学号实验场地任美福楼222实验三二阶线性系统时域性能指标的Matlab仿真实验...

控制工程实验报告(16篇)