实验一、进程的创建和撤销

news/2024/12/27 13:23:25

一.实验目的

(1)       加深对进程概念的理解和进程创建与撤消算法;

(2)       进一步认识并发执行的实质。

二.实验内容

1)进程管理认识:通过windows “任务管理器”观察进程的状态,进行进程的创建、切换和撤销。

 

2)进程创建与撤销:通过系统调用编程实现进程的创建与撤销功能,并在屏幕上观察进程活动的结果。

三.实验步骤

(1)       任务分析

   以下是创建进程的关键知识:

    进程创建和撤销需要调用CreateProcess()和TerminateProcess()CreateProcess()实际上是运行一个新的可执行程序,这里,需要设置其必备的参数。而终止进程则首先是要找到运行进程的句柄,然后终止该进程。

(2)       程序设计:

a.总体设计:

通过main()函数调用两个函数void startprocess()和函数void stop_process()。主要是在main()函数中用while循环和开关语句switch选择序号对其进行控制,可以先创建进程并观察然后在选择序号终止该进程。

b.具体实现:  首先我们必须知道函数CreateProcess()的参数定义(类型和名称),共10个参数,其函数原型为

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   

  );  

其中第二个参数lpCommandLine参数允许调用者向新应用程序发送数据;STARTUPINFO所必需的,用于在必要时指明新应用程序的主窗口的外观. lpProcessInformation用于调用的结果块和发送新应用程序的进程和主线程的句柄和ID号。其他参数可以按缺省值为空。

判断创建进程是否成功,若不成功,输出创建不成功并返回;若成功则显示程序并获得句柄,以方便终止句柄。在终止进程过程中,若句柄不为空,调用TerminateProcess()进一步判断。

其函数原型

BOOL   TerminateProcess(  

      HANDLE   hProcess,   //   handle   to   the   process  

      UINT   uExitCode        

  );  

 

(3)       程序结果:打印程序的输出结果(表明对应的数据)或主要界面图。

  开始时的界面:(如图所示)

 

  

输入序号1后 产生的结果:

 

接着输入序号2后该进程被撤销后的结果:

 

输入序号3退出程序:

(4)       调试与测试:

如果进入主界面时,直接执行序号2终止进程:

 

上述结果表明 由于事先没有创建进程,所以句柄为空,无法终止进程。

四.实验总结

首先查看任务管理器进程的动态,并新建和关闭进程观察。接着是要创建进程和撤销进程,首要工作是我们得弄清楚两个系统函数CreateProcess()和TerminateProcess()入口参数的类型和函数,弄明白这些关键因素,然后就是如何将它们组织起来,我用的控制台下的switch语句来控制到底进行哪种操作。通过这次试验,我们加深了平时学习的理论知识和实践的联系,并加深了印象。不过,我觉得这次试验如果能够用MFC的消息触发更加直观,有些参数弄的还是不太明白,还需要多多努力。

五.附录源代码

#include <iostream>

#include <windows.h>

using namespace std;

HANDLE m_hPro;

void startprocess()//创建进程

{

       STARTUPINFO si;//必备的参数设置

 int n=1;

 memset(&si,0,sizeof(STARTUPINFO));

 si.cb=sizeof(STARTUPINFO);

 si.dwFlags=STARTF_USESHOWWINDOW;

 si.wShowWindow=SW_SHOW;

 PROCESS_INFORMATION pi;

 if(!CreateProcess(NULL,"C://Program       Files//Internet Explorer//iexplore.exe",NULL,NULL,false,0,NULL,NULL,&si,&pi))

 {

  cout <<"Create Process Fail!" <<endl;

  exit(1);

 }

 else

 {

  cout <<"Create Process Success!" <<endl; 

  m_hPro=pi.hProcess;

 

 }

 

}

 

void stop_process()

{

       if(m_hPro)

       {

              if(!TerminateProcess(m_hPro,0))

              {

                     //终止出现错误,显示错误信息

                     LPVOID lpMsgBuf;

                     FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |

                                          FORMAT_MESSAGE_FROM_SYSTEM |

                                          FORMAT_MESSAGE_IGNORE_INSERTS,

                                          NULL,

                                          GetLastError(),

                                          MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),

                                          (LPTSTR) &lpMsgBuf,

                                          0,

                                          NULL );

             

              }

              else

              {

             

                     cout<<"TerminateProcess sucess"<<endl;

              }

              m_hPro=NULL;

       }

       else

       { cout<<"null m_hPro"<<endl;

       }

}

int main()

{

       while(1){

       cout<<"请输入序号"<<endl;

       cout<<"1 创建进程  2 终止进程  3退出"<<endl;

       int i;

       cin>>i;

  switch(i)

       {

       case 1:startprocess();break;

       case 2:stop_process();break;

       case 3:exit(1);

       }

       }

   return(0);

}

 

 

 


http://www.niftyadmin.cn/n/2278894.html

相关文章

asp.net三层架构详解

一、数据库 /**/ /* DBMS name: Microsoft SQL Server 2000 */ /**/ if exists (select 1 from sysobjects where id object_id(newsContent) and type U) drop table newsContent go /**/ /* Table: newsContent …

apache无法启动的诸多解决办法----不妨一试啊

一&#xff1a;来自百度 win下面apache无法启动的诸多解决办法 1.网上邻居->本地连接->属性->internet协议(TCP/IP)->属性->高级->wins标签->去掉启用LMhosts查询前的勾. 2.控制面版->windows防火墙->高级标签->本地连接设置->服务的标签里…

Mysql入门基本命令

mysql入门命令2007-08-25 12:481、登录数据库命令&#xff1a;mysql -u username -p描述&#xff1a;输入命令回车&#xff0c;即可输入密码了。密码验证通过即可进入数据库了。2、查看数据状态命令&#xff1a;show database;描述&#xff1a;该命令会显示现存的所有数据库。3…

C++priemer 参考答案 仅供参考呃

习题3.14 读入一段文本到vector对象,每个单词存储为vector中的一个元素.把vector对象中每个单词转化为大写字母.输出vector对象中转化后的元素,每八个单词为一行输出. #include<iostream> #include<vector> #include<string> using namespace std; int main…

C++ primer 第十章参考答案 10.9

习题10.9 编写程序统计并输出所读入的单词出现的次数 方法一&#xff1a; #include<iostream> #include<vector> #include<map> #include<string> using namespace std; int main() { map<string,int> word_count; string word; while(…

文件的基本操作 C语言版

文件的写操作&#xff1a; void CMYCFileView::OnFileWrite() { // TODO: Add your command handler code here //打开文件 FILE *pFile fopen("111.txt","w"); //写入操作 fwrite("http://www.baidu.com",1,strlen("http://www.ba…

区分文本文件和二进制文件

区分文本文件和二进制文件 当按文本方式向文件中写入数据时&#xff0c;一旦遇到“换行”字符&#xff08;ASCII码为10&#xff09;,则会转换为“回车-换行”&#xff08;ASCII码为13、10&#xff09;。在读取文件时&#xff0c;一旦遇到“回车-换行”的组合&#xff08;连续的…