实验二Windows进程控制
- 格式:doc
- 大小:213.00 KB
- 文档页数:9
操作系统实验二进程管理以下是为大家整理的操作系统实验二进程管理的相关范文,本文关键词为操作系统,实验,进程,管理,,您可以从右上方搜索框检索更多相关文章,如果您觉得有用,请继续关注我们并推荐给您的好友,您可以在综合文库中查看更多范文。
操作系统实验实验二进程管理学号姓名班级华侨大学电子工程系实验目的1、理解进程的概念,明确进程和程序的区别。
2、理解并发执行的实质。
3、掌握进程的创建、睡眠、撤销等进程控制方法。
实验内容与要求基本要求:用c语言编写程序,模拟实现创建新的进程;查看运行进程;换出某个进程;杀死进程等功能。
实验报告内容1、进程、进程控制块等的基本原理。
进程是现代操作系统中的一个最基本也是最重要的概念,掌握这个概念对于理解操作系统实质,分析、设计操作系统都有其非常重要的意义。
为了强调进程的并发性和动态性,可以给进程作如下定义:进程是可并发执行的程序在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位。
进程又就绪、执行、阻塞三种基本状态,三者的变迁图如下:就绪I/o完成时间片完进程调度I/o请求阻塞执行由于多个程序并发执行,各程序需要轮流使用cpu,当某程序不在cpu上运行时,必须保留其被中断的程序的现场,包括:断点地址、程序状态字、通用寄存器的内容、堆栈内容、程序当前状态、程序的大小、运行时间等信息,以便程序再次获得cpu时,能够正确执行。
为了保存这些内容,需要建立—个专用数据结构,我们称这个数据结构为进程控制块pcb(processcontrolblock)。
进程控制块是进程存在的惟一标志,它跟踪程序执行的情况,表明了进程在当前时刻的状态以及与其它进程和资源的关系。
当创建一个进程时,实际上就是为其建立一个进程控制块。
在通常的操作系统中,pcb应包含如下一些信息:①进程标识信息。
为了标识系统中的各个进程,每个进程必须有惟一的标识名或标识数。
②位置信息。
指出进程的程序和数据部分在内存或外存中的物理位置。
操作系统实验二:进程管理操作系统实验二:进程管理篇一:操作系统实验报告实验一进程管理一、目的进程调度是处理机管理的核心内容。
本实验要求编写和调试一个简单的进程调度程序。
通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。
二、实验内容及要求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为时间片大小(毫秒)//对进程进行初始化,建立就绪数组、阻塞数组。
最新实验二-实验报告(进程管理)实验目的:1. 理解操作系统中进程的概念及其特性。
2. 掌握进程管理的基本原理和方法。
3. 学习进程创建、撤销、阻塞和唤醒等操作。
4. 熟悉进程间的同步与通信机制。
实验环境:- 操作系统:Linux/Unix- 编程语言:C/C++- 开发工具:GCC编译器,GDB调试器实验内容:1. 创建进程:编写程序,使用系统调用fork()创建子进程,并观察父进程与子进程的行为差异。
2. 进程撤销:实现一个程序,通过系统调用exit()或abort()撤销进程,并观察其对进程组和会话的影响。
3. 进程阻塞与唤醒:设计并实现一个父进程和多个子进程的程序,其中子进程执行阻塞操作(如sleep()),父进程负责唤醒这些子进程。
4. 进程同步:利用信号量或管程等同步机制,实现两个并发进程的同步操作。
5. 进程通信:通过管道(PIPE)、消息队列、共享内存等IPC机制,实现进程间的信息交换。
实验步骤:1. 设计并编写创建进程的程序代码。
2. 在Linux环境下使用GCC编译程序,并记录编译过程。
3. 运行程序,使用GDB等工具调试程序,并观察fork()的执行效果。
4. 实现进程撤销的程序,并记录exit()和abort()的不同行为。
5. 编写进程阻塞与唤醒的程序,并通过实验观察不同进程状态的变化。
6. 完成进程同步的代码实现,并测试死锁及其解决方法。
7. 编写并测试进程通信的程序,确保信息能够正确传递。
实验结果:- 展示创建进程前后的系统状态变化,包括进程表和内存分配情况。
- 记录进程撤销后,父进程收集子进程状态的输出。
- 展示进程阻塞与唤醒的输出结果,验证进程状态转换的正确性。
- 展示进程同步的实验结果,包括死锁的产生与解决。
- 展示进程通信的测试结果,验证信息传递的准确性。
实验分析:- 分析进程创建和撤销的系统资源变化。
- 讨论进程阻塞与唤醒机制的效率和应用场景。
- 探讨进程同步与通信的复杂性及其在多线程编程中的重要性。
实验2 进程控制一、实验目的加深对进程概念的理解,明确进程和程序和区别;进一步认识并发执行的实质;分析进程争用资源的现象。
二、实验内容1. 熟悉Linux进程控制常用命令。
2. 输入进程创建、控制的程序并调试程序。
三、实验预备知识1. 进程控制常用命令(1)ps 命令功能:查看目前的系统中有哪些进程,以及它们的执行情况。
常用命令格式及功能如下:ps 查看系统中属于自己的进程ps au 查看系统中所有用户的进程ps aux 查看系统中包含系统内部的及所有用户的进程主要输出列说明:USER:进程所有者的用户名PID:进程号TTY:进程从哪个终端启动TIME:此进程所消耗的CPU时间COMMAND:正在执行的命令或进程名称(2)top 命令功能:动态显示进程,实时监测进程状态。
与ps命令相似,只是top命令在执行后会以指定的时间间隔来刷新显示信息,以使top所显示的进程状态总是当前时刻的。
(3)kill 命令功能:结束或终止进程。
常用命令格式及功能如下:kill 5302 杀死PID为5302的进程kill -9 5302 强行杀死PID为5302的进程(4)echo $变量名功能:查看外壳变量的设定值。
例:echo $$ 显示当前进程PID2.常用系统调用函数常用系统调用函数、程序的说明、参数及定义如下:(1)fork()函数功能:创建一个新进程函数格式:int fork()其中返回int取值意义如下:小于0:创建失败0: 创建成功,在子进程中返回0值大于0: 创建成功,在父进程中返回子进程id值-1:创建失败(2)wait()函数功能:父进程等待子进程终止,以便对子进程进行善后处理。
函数格式:int wait(int *statloc)参数定义:statloc 指出子进程终止状态码的位置。
若不关心子进程的终止状态,可传递一个空指针。
返回值:正常返回时,为终止子进程的PID;错误返回时为-1;其他为0。
操作系统进程控制实验报告一、实验目的操作系统进程控制是操作系统中的重要概念和核心功能之一。
本次实验的目的在于深入理解操作系统中进程的概念、状态及其转换,掌握进程创建、终止、阻塞和唤醒等操作的实现原理和方法,通过实际编程和调试,观察进程的行为和特性,从而提高对操作系统原理的理解和应用能力。
二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 C++,开发工具为 Visual Studio 2019。
三、实验原理(一)进程的概念进程是操作系统中进行资源分配和调度的基本单位,它包含了程序代码、数据、堆栈等资源。
进程具有独立性、动态性和并发性等特点。
(二)进程的状态进程的状态通常包括就绪态、运行态和阻塞态。
就绪态表示进程已具备运行条件,等待被调度;运行态表示进程正在 CPU 上执行;阻塞态表示进程因等待某个事件而暂停执行。
(三)进程控制的基本操作1、进程创建:通过系统调用创建新的进程,为其分配资源并初始化。
2、进程终止:当进程完成任务或出现异常时,结束其执行并回收资源。
3、进程阻塞:进程在等待某个事件时,主动进入阻塞态。
4、进程唤醒:当等待的事件发生时,将阻塞的进程唤醒,使其进入就绪态。
四、实验内容与步骤(一)进程创建1、编写 C++程序,使用系统提供的函数创建新的进程。
2、在新进程中执行特定的任务,例如打印输出信息。
```cppinclude <windowsh>include <iostream>int main(){STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si, sizeof(si));sicb = sizeof(si);ZeroMemory(&pi, sizeof(pi));//创建新进程if (!CreateProcess(NULL, //应用程序名称"C:\\Path\\To\\Your\\ChildProcessexe",//命令行参数NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)){std::cerr <<"CreateProcess failed Error code: "<<GetLastError()<< std::endl;return 1;}//等待子进程结束WaitForSingleObject(pihProcess, INFINITE);//关闭进程和线程句柄CloseHandle(pihProcess);CloseHandle(pihThread);return 0;}```(二)进程终止1、在创建的进程中设置条件,当满足条件时主动终止进程。
计算机操作系统实验二Windows任务管理器的进程管理实验二 Windows任务管理器的进程管理一实验目的1)在Windows 任务管理器中对程序进程进行响应的管理操作;2)熟悉操作系统进程管理的概念;3)学习观察操作系统运行的动态性能。
二实验环境需要准备一台运行Windows XP操作系统的计算机。
三背景知识Windows XP的任务管理器提供了用户计算机上正在运行的程序和进程的相关信息,也显示了最常用的度量进程性能的单位。
使用任务管理器,可以打开监视计算机性能的关键指示器,快速查看正在运行的程序的状态,或者终止已停止响应的程序。
也可以使用多个参数评估正在运行的进程的活动,以及查看CPU 和内存使用情况的图形和数据。
四实验内容与步骤启动并进入Windows环境,单击Ctrl + Alt + Del键,或者右键单击任务栏,在快捷菜单中单击“任务管理器”命令,打开“任务管理器”窗口。
当前机器中由你打开,正在运行的应用程序有:1) 实验二Windows 任务管理器的进程管理2) 常州大学—Windows Internet Explore3) 实验一Windows XP 系统管理4)可移动磁盘(H:)Windows“任务管理器”的窗口由_5_个选项卡组成,分别是:1) 应用程序2) 进程3) 性能4)联网当前“进程”选项卡显示的栏目分别是(可移动窗口下方的游标/箭头,或使窗口最大化进行观察) :1) 映像名称2) 用户名3) CPU4) 内存使用1. 使用任务管理器终止进程步骤1:单击“进程”选项卡,一共显示了__24_个进程。
请试着区分一下,其中:系统(SYSTEM) 进程有_14_个,填入表2-1中。
表2-1 实验记录映像名称用户名作用内存使用svchost.exe SYSTEM 用于执行dll文件 4988Kspoolsv.exe SYSTEM 管理所有本地和网络打 5544K印队列及控制所有打印工作lsass.exe SYSTEM 本地安全授权服务1460K services.exe SYSTEM 远程控制木马病毒3816Kwinlogon.exe SYSTEM 管理用户登录和退出5244Kcarss.exe SYSTEM 负责控制windows 12552K smss.exe SYSTEM 系统关键进程 500K CDAC11BA.exe SYSTEM 反复制保护软件1440K server.exe SYSTEM 用于Novell服务监听1196K MATLAB.exe SYSTEM 一种科学计算工程软件46576K MDM.exe SYSTEM 进行本地和远程调试 3532K service.exe SYSTEM 管理启动停止服务 3366K Inetinfo.exe SYSTEM 用于Debug调试除错 10236K system SYSTEM 系统进程 312K服务(SERVICE) 进程有_3_个,填入表2-2中。
实验2:Windows应用程序基础和进程控制实验二:Windows进程控制1. 实验目的每个进程都有一个独立的受到保护的地址空间,其他进程不能访问。
一个进程可以包含一个或更多的线程。
进程能够在其内部创建新的、独立的线程,并且管理对象间的通信和同步。
通过对Windows系统编程,进一步熟悉操作系统的基本概念,较好地理解Windows操作系统的系统结构和编程特点。
2. 进程控制Windows所创建的每个进程都从调用CreateProcess() API函数开始,该函数的任务是在对象管理器子系统内初始化进程对象。
每一进程都以调用ExitProcess()或TerminateProcess() API函数终止。
通常应用程序的框架负责调用ExitProcess()函数。
对C++运行库来说,这一调用发生在应用程序的main()函数返回之后,如果采用C运行库,则调用WinMain()函数。
通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows进程的生命周期。
2.1 进程控制相关的API基本的Win32进程管理函数是CreateProcess,它可以创建拥有单个线程的进程。
因为进程需要代码,所以有必要指定可执行程序文件名作为CreateProcess调用的一部分。
CreateProcess有10个参数支持其灵活性和强大功能。
该函数并不返回一个HANDLE,而是在一个结构(在调用中指定)中返回表示进程和线程的两个句柄。
2.1.1 创建进程CreateProcess()函数函数格式:BOOL CreateProcess(LPCTSTR lpApplicationName, LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles, DWORD dwCreationFlags,LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory,LPSTRATUPINFO lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation);参数:(1)lpszApplicationName和lpCommandLine指定了新进程将使用的可执行文件和传递给新进程的命令行字符串。
实验一、进程控制实验1.1 实验目的加深对于进程并发执行概念的理解。
实践并发进程的创建和控制方法。
观察和体验进程的动态特性。
进一步理解进程生命期期间创建、变换、撤销状态变换的过程。
掌握进程控制的方法,了解父子进程间的控制和协作关系。
练习 Linux 系统中进程创建与控制有关的系统调用的编程和调试技术。
1.2 实验说明1)与进程创建、执行有关的系统调用说明 进程可以通过系统调用fork()创建子进程并和其子进程并发执行.子进程初始的执行映像是父进程的一个复本.子进程可以通过 exec()系统调用族装入一个新的执行程序。
父进程可以使用 wait()或 waitpid()系统调用等待子进程的结束并负责收集和清理子进程的退出状态。
fork()系统调用语法:pid_t#include <unistd.h>fork(void);fork 成功创建子进程后将返回子进程的进程号,不成功会返回-1.exec 系统调用有一组 6 个函数,其中示例实验中引用了 execve 系统调用语法:#include <unistd.h>const char * envp[]);path 要装const char *argv[],int execve(const char *path,入的新的执行文件的绝对路径名字符串.argv[] 要传递给新执行程序的完整的命令参数列表(可以为空).envp[] 要传递给新执行程序的完整的环境变量参数列表(可以为空).Exec 执行成功后将用一个新的程序代替原进程,但进程号不变,它绝不会再返回到调用进程了。
如果 exec 调用失败,它会返回-1。
wait() 系统调用语法:#include <sys/types.h>pid_t#include <sys/wait.h>wait(int *status);status 用pid_t waitpid(pid_t pid,int *status,int option);于保留子进程的退出状态pid 可以为以下可能值:-1 等待所有 PGID 等于 PID 的绝对值的子进程1 等待所有子进程0 等待所有 PGID 等于调用进程的子进程>0 等待 PID 等于 pid 的子进程 option 规定了调用 waitpid 进程的行为:WNOHANG 没有子进程时立即返回WUNTRACED 没有报告状态的进程时返回wait 和 waitpid 执行成功将返回终止的子进程的进程号,不成功返回-1。
操作系统进程管理实验实验题目:(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)编制一段程序,使其实现进程的软中断通信。
实验步骤与调试过程Windows所创建的每个进程都是以调用CreateProcess()API函数开始和以调用ExitProcess()或TerminateProcess()API函数终止。
1. 创建进程本实验显示了创建子进程的基本框架。
该程序只是再一次地启动自身,显示它的系统进程ID和它在进程列表中的位置。
步骤1:登录进入Windows XP Professional。
步骤2:在“开始”菜单中单击“程序”→“Microsoft Visual Studio 6.0”→“Microsoft Visual C++ 6.0”命令,进入Visual C++窗口。
步骤3:新建Win32 Console Application项目proccreate,再新建C++文件proccreate,将清单2-1复制到文件中。
清单2-1创建子进程清单程序见下面的主要算法和程序清单步骤4:编译,链接,运行。
步骤6:在工具栏单击“Execute Program”(执行程序) 按钮,或者按Ctrl + F5键,或者单击“Build”菜单中的“Execute proccreate.exe”命令,执行proccreate.exe 程序。
步骤7:按Ctrl + S键可暂停程序的执行,按Ctrl + Pause (Break) 键可终止程序的执行。
清单2-1展示的是一个简单的使用CreateProcess() API函数的例子。
首先形成简单的命令行,提供当前的EXE文件的指定文件名和代表生成克隆进程的号码。
大多数参数都可取缺省值,但是创建标志参数使用了:CREATE_NEW_CONSOLE, // 使用新的控制台标志,指示新进程分配它自己的控制台,这使得运行示例程序时,在任务栏上产生许多活动标记。
然后该克隆进程的创建方法关闭传递过来的句柄并返回main() 函数。
在关闭程序之前,每一进程的执行主线程暂停一下,以便让用户看到其中的至少一个窗口。
CreateProcess() 函数有2个核心参数?本实验程序中设置的各个参数的值是:a.szFilename, // 产生这个EXE的应用程序的名称;b.szCmdLine, // 告诉其行为像一个子进程的标志;c.NULL, // 缺省的进程安全性;d.NULL, // 缺省的线程安全性;e.FALSE, // 不继承句柄;f.CREATE_NEW_CONSOLE, // 使用新的控制台;g.NULL, // 新的环境;h.NULL, // 当前目录I.&si, // 启动信息j.π // 返回的进程信息。
2. 正在运行的进程本实验的程序中列出了用于进程信息查询的API函数GetProcessVersion() 与GetVersionEx() 的共同作用,可确定运行进程的操作系统的版本号。
步骤8:新建Win32 Console Application项目version,再新建C++文件version,将清单2-2复制到文件中。
清单2-2使用进程和操作系统的版本信息清单程序见下面的主要算法和程序清单步骤9:单击“Build”菜单中的“Compile version.cpp”命令,再单击“是”按钮确认。
系统对version.cpp进行编译。
步骤10:编译完成后,单击“Build”菜单中的“Build version.exe”命令,建立version.exe可执行文件。
操作能否正常进行?如果不行,则可能的原因是什么?可以正常运行,如果不行,主要是代码中的标点符号的中英文之间的问题。
步骤11:在工具栏单击“Execute Program”(执行程序) 按钮,执行version.exe 程序。
运行结果:当前PID信息:4608, requires OS: 10当前操作系统版本:5.1系统提示信息:Task Manager should now now indicate thisprocess is high priority.清单2-2中的程序向读者表明了如何获得当前的PID和所需的进程版本信息。
为了运行这一程序,系统处理了所有的版本不兼容问题。
接着,程序演示了如何使用GetVersionEx() API函数来提取OSVERSIONINFOEX 结构。
这一数据块中包括了操作系统的版本信息。
其中,“OS : 5.1”表示当前运行的操作系统是:Windows XP 5.1清单2-2的最后一段程序利用了操作系统的版本信息,以确认运行的是Windows 。
代码接着将当前进程的优先级提高到比正常级别高。
步骤12:单击Ctrl + Alt + Del键,进入“Windows任务管理器”,在“应用程序”选项卡中右键单击“2-2”任务,在快捷菜单中选择“转到进程”命令。
在“Windows任务管理器”的“进程”选项卡中,与“2-2”任务对应的进程映像名称是VCSPAWN.EXE右键单击该进程名,在快捷菜单中选择“设置优先级”命令,可以调整该进程的优先级,如设置为“高”后重新运行2-2.exe程序,屏幕显示有变化吗?为什么?没有变化除了改变进程的优先级以外,还可以对正在运行的进程执行几项其他的操作,只要获得其进程句柄即可。
SetProcessAffinityMask() API函数允许开发人员将线程映射到处理器上;SetProcessPriorityBoost() API可关闭前台应用程序优先级的提升;而SetProcessWorkingSet() API可调节进程可用的非页面RAM的容量;还有一个只对当前进程可用的API函数,即SetProcessShutdownParameters() ,可告诉系统如何终止该进程。
3. 终止进程在清单2-3列出的程序中,先创建一个子进程,然后指令它发出“自杀弹”互斥体去终止自身的运行。
步骤13:新建Win32 Console Application项目procterm,再新建C++文件procterm,将清单2-3复制到文件中。
清单2-3 指令其子进程来“杀掉”自己的父进程清单程序见下面的主要算法和程序清单步骤14:单击“Build”菜单中的“Compile procterm.cpp”命令,再单击“是”按钮确认。
系统对procterm.cpp进行编译。
步骤15:编译完成后,单击“Build”菜单中的“Build procterm.exe”命令,建立procterm.exe可执行文件。
步骤16:在工具栏单击“Execute Program”按钮,执行procterm.exe程序。
实验结果1. 创建进程2. 正在运行的进程3. 终止进程主要算法和程序清单清单2-1创建子进程// proccreate项目# include <windows.h># include <iostream># include <cstdio>using namespace std;// 创建传递过来的进程的克隆过程并赋于其ID值void StartClone(int nCloneID){// 提取用于当前可执行文件的文件名TCHAR szFilename[MAX_PATH];:: GetModuleFileName(NULL, szFilename, MAX_PATH) ;// 格式化用于子进程的命令行并通知其EXE文件名和克隆IDTCHAR szCmdLine[MAX_PATH] ;sprintf(szCmdLine, "\"%s\" %d", szFilename, nCloneID) ;// 用于子进程的STARTUPINFO结构STARTUPINFO si;:: ZeroMemory(reinterpret_cast <void*> (&si) , sizeof(si) ) ;si.cb = sizeof(si) ; // 必须是本结构的大小// 返回的用于子进程的进程信息PROCESS_INFORMATION pi;// 利用同样的可执行文件和命令行创建进程,并赋于其子进程的性质BOOL bCreateOK = :: CreateProcess(szFilename, // 产生这个EXE的应用程序的名称szCmdLine, // 告诉其行为像一个子进程的标志NULL, // 缺省的进程安全性NULL, // 缺省的线程安全性FALSE, // 不继承句柄CREATE_NEW_CONSOLE, // 使用新的控制台NULL, // 新的环境NULL, // 当前目录&si, // 启动信息&pi) ; // 返回的进程信息// 对子进程释放引用if (bCreateOK){:: CloseHandle(pi.hProcess) ;:: CloseHandle(pi.hThread) ;}}int main(int argc, char* argv[] ){// 确定进程在列表中的位置int nClone(0) ;if (argc > 1){// 从第二个参数中提取克隆IDsscanf(argv[1] , "%d" , &nClone) ;}// 显示进程位置cout << "Process ID: "<< :: GetCurrentProcessId()<< ",clone ID: " << nClone<< endl;// 检查是否有创建子进程的需要const int c_nCloneMax = 10;if (nClone < c_nCloneMax){// 发送新进程的命令行和克隆号StartClone(++nClone) ;}// 在终止之前暂停一下(l/2秒):: Sleep(500) ;system("PAUSE");return 0;}清单2-2使用进程和操作系统的版本信息// version项目# include <windows.h># include <iostream>// 利用进程和操作系统的版本信息的简单示例int main(){// 提取这个进程的ID号DWORD dwIdThis = :: GetCurrentProcessId() ;// 获得这一进程和报告所需的版本,也可以发送0以便指明这一进程DWORD dwVerReq = :: GetProcessVersion(dwIdThis) ;WORD wMajorReq = (WORD) (dwVerReq > 16) ;WORD wMinorReq = (WORD) (dwVerReq & 0xffff) ;std :: cout << "Process ID: " << dwIdThis<< ", requires OS: " << wMajorReq << wMinorReq << std :: endl ;// 设置版本信息的数据结构,以便保存操作系统的版本信息OSVERSIONINFOEX osvix;:: ZeroMemory(&osvix, sizeof(osvix) ) ;osvix.dwOSVersionInfoSize = sizeof(osvix) ;// 提取版本信息和报告::GetVersionEx(reinterpret_cast < LPOSVERSIONINFO > (&osvix) ) ;std :: cout << "Running on OS: " << osvix.dwMajorVersion << "."<< osvix.dwMinorVersion << std :: endl;// 如果是NTS (Windows ) 系统,则提高其优先权if (osvix.dwPlatformId == VER_PLATFORM_WIN32_NT &&osvix.dwMajorVersion >= 5) {// 改变优先级:: SetPriorityClass(:: GetCurrentProcess() , // 利用这一进程HIGH_PRIORITY_CLASS) ; // 改变为highstd :: cout << "Task Manager should now now indicate this""process is high priority." << std :: endl;}}清单2-3 指令其子进程来“杀掉”自己的父进程// procterm项目# include <windows.h># include <iostream># include <stdio.h>static LPCTSTR g_szMutexName = "w2kdg.ProcTerm.mutex.Suicide";// 创建当前进程的克隆进程的简单方法void StartClone(){// 提取当前可执行文件的文件名TCHAR szFilename [MAX_PATH] ;:: GetModuleFileName(NULL, szFilename, MAX_PATH) ;// 格式化用于子进程的命令行,指明它是一个EXE文件和子进程TCHAR szCmdLine[MAX_PATH] ;:: sprintf(szCmdLine, "\" %s\" child",szFilename) ;// 子进程的启动信息结构STARTUPINFO si;:: ZeroMemory(reinterpret_cast <void* > (&si) , sizeof(si) ) ;si.cb = sizeof(si) ; // 应当是此结构的大小// 返回的用于子进程的进程信息PROCESS_INFORMATION pi;// 用同样的可执行文件名和命令行创建进程,并指明它是一个子进程BOOL bCreateOK = :: CreateProcess(szFilename, // 产生的应用程序名称(本EXE文件)szCmdLine, // 告诉我们这是一个子进程的标志NULL, // 用于进程的缺省的安全性NULL, // 用于线程的缺省安全性FALSE, // 不继承句柄CREATE_NEW_CONSOLE, // 创建新窗口,使输出更直观NULL, // 新环境NULL, // 当前目录&si, // 启动信息结构&pi ) ; // 返回的进程信息// 释放指向子进程的引用if (bCreateOK){:: CloseHandle(pi.hProcess) ;:: CloseHandle(pi.hThread) ;}}void Parent(){// 创建"自杀"互斥程序体HANDLE hMutexSuicide = :: CreateMutex(NULL, // 缺省的安全性TRUE, // 最初拥有的g_szMutexName) ; // 为其命名if (hMutexSuicide != NULL){// 创建子进程std :: cout << "Creating the child process." << std :: endl;:: StartClone() ;:: Sleep(5000);// 暂停(问:此时进程处于挂起态还是阻塞态?)// 指令子进程"杀"掉自身std :: cout <<"Telling the child process to quit."<< std :: endl;:: ReleaseMutex(hMutexSuicide);// 消除句柄:: CloseHandle(hMutexSuicide);}}void Child(){// 打开"自杀"互斥体HANDLE hMutexSuicide = :: OpenMutex(SYNCHRONIZE, // 打开用于同步FALSE, // 不需要向下传递g_szMutexName) ; // 名称if (hMutexSuicide != NULL){// 报告正在等待指令std :: cout << "Child waiting for suicide instructions. " << std :: endl;:: WaitForSingleObject(hMutexSuicide, INFINITE) ;// 准备好终止,清除句柄std :: cout << "Child quiting. " << std :: endl;:: CloseHandle(hMutexSuicide) ;}}int main(int argc, char* argv[] ){// 决定其行为是父进程还是子进程if (argc > 1 && :: strcmp(argv[1] , "child" ) == 0)Child() ;elseParent() ;return 0;}。