进程控制与描述试验报告
一、实验目的一、实验目的 利用 Windows 提供的 API 函数,编写程序,实现进程的创建和终止(如创建 写字板进程及终止该进程),加深对操作系统进程概念的理解,观察操作系统进 程运行的动态性能,获得包含多进程的应用程序编程经验。 二、实验内容二、实验内容 编写一个在 dos 界面下的简单进程控制系统,实现根据用户选项进行进程的 创建、终止,并提供进程的状态。 (1)进程的创建和终止。编写一段程序,可以创建一个进程,并终止当前 创建的进程。试观察记录程序执行的结果,并分析原因。 (2)利用 VC++6.0 实现上述程序设计和调试操作,对于进程创建的成功与 否、终止进程操作的成功与否提供一定的提示框。 (3)通过阅读和分析实验程序,学习创建进程、观察进程和终止进程的程 序设计方法 三、实验步骤三、实验步骤 1. 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_INATION lpProcessInation }; 一个线程调用该函数首先创建一个进程内核对象用来管理此新进程,随后系 统为新进程创建虚拟地址空间, 并将可执行文件的代码和数据加载到这个地址空 间,接着系统为新进程的主线程创建一个线程内核对象。 本程序所使用的函数中各参数的解释: 1.lpApplicationName1.lpApplicationName 指向一个 NULL 结尾的、用来指定可执行模块的字符串。这个字符串可以使 可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱 动器和目录建立可执行模块的路径。 这个参数可以被设为 NULL,在这种情况下,可执行模块的名字必须处于 lpCommandLine 参数的最前面并由空格符与后面的字符分开。 2.lpCommandLine2.lpCommandLine 传递给新进程的命令行字符串,应当为非常量字符串的地址。可以设定一个 完整的命令行,如果第一个标记没有扩展名,CreateProcess 将其假设为.。 如果找不到该文件,CreateProcess 按环境设置目录搜索运行。 3.bInheritHandles3.bInheritHandles 决定子进程对父进程继承性,一般设为 FALSE。 4.dwCreationFlags4.dwCreationFlags 用于标识标志,以便用于规定如何来创建新进程。 5.lpStartupInfo5.lpStartupInfo 指向一个用于决定新进程的主窗体如何显示的 STARTUPINFO 结构体。 6.lpProcessInation6.lpProcessInation 指向一个用来接收新进程的识别信息的 PROCESS_INATION 结构体。 在使用 CreateProcess 函数之前首先要对 STARTUPINFO 结构体进行初始化, 来指定新的进程如何显示,这里对参数不再详细展开。 PROCESS_INATIONPROCESS_INATION 结构体结构体 typedef struct _PROCESS_INATION { HANDLE hProcess; // 存放每个对象的与进程相关的句柄 HANDLE hThread; // 返回的线程句柄 DWORD dwProcessId; // 用来存放进程 ID 号 DWORD dwThreadId; // 用来存放线程 ID 号 }PROCESS_INATION,*PPROCESS_INATION,*LPPROCESS_INATION ; 调用 Createprocess()函数后,会自动地对该结构进行填充。 创建新进程可使系统建立一个进程内核对象和一个线程内核对象。在创建进 程的时候, 系统为每个对象赋予一个初始使用计数值 1 。 然后, 在 createProcess 返回之前, 该函数打开进程对象和线程对象,并将每个对象的与进程相关的句柄 放入PROCESS_INATIO结构的hProcess和hThread成员中。 当CreateProcess 在内部打开这些对象时,每个对象的使用计数就变为 2。 2. 2.终止进程终止进程 一个进程终止时,系统会依次执行以下操作: 1、终止进程中遗留的任何线程。 2、释放进程分配的所有用户对象,关闭所有内核对象。如果它们的使用计 数变为 0,内核对象将会释放。 3、将进程的退出代码从 STILL_ACTIVE 变为传给 ExitProcess 或是 TerminateProcess 的参数存储在内核对象中。 4、进程内核对象变为一触发状态。这也是为什么其他线程可以挂起他们自 己直至另一个进程终止运行。 5、进程内核对象的使用计数递减 1。 本实验使用了 Windows 提供的 TerminateProcess 函数来终止进程。 TerminateProcessTerminateProcess 函数原型:函数原型: BOOL TerminateProcess{ HANDLE hProcess UINT uExitCode }; 函数中各参数的解释: 1.hProcess1.hProcess 指定要中断进程的句柄。该句柄可以由 OpenProcess 得到. 2.uExitCode2.uExitCode 进程和其所有线程的退出代码 这个函数可以用来终止或者说杀死一个进程,它不会留给进程及其所有线程 清理的时间,系统会马上终止(杀死)这个进程的所有线程,致使进程终止。在使 用此函数前我们必须要调用 OpenProcess 函数来获得我们要终止进程的句柄, 并 且要获得进程的 PROCESS_TERMINATE 权限。 本次试验中设计的简单进程控制系统,由于采用了堆栈式的方法,即每次都 将用来接收新进程的识别信息的 PROCESS_INATION 结构体存入到一个特定 的堆栈中去, 这样就可以直接利用里面的参数获取需要终止的进程的句柄,从而 避免了使用 OpenProcess 函数的麻烦。 当然若这种方法只适用与这样一个简单的 小型系统,并不具有普适性。 四、系统截图四、系统截图 1 1、初始界面、初始界面 2 2、打开多个进程、打开多个进程 3 3、关闭进程和相关提醒、关闭进程和相关提醒 五、思考五、思考 1.系统是怎样创