进程创建:
1 #include <windows.h>
#include <stdio.h> int main()
{
// 创建打开系统自带记事本进程
STARTUPINFO si1 = {sizeof(si1)};
PROCESS_INFORMATION pi1;
char * szCmdLine1 = "notepad";
if(::CreateProcess(NULL, szCmdLine1, NULL, NULL, FALSE, NULL, NULL, NULL, &si1, &pi1))
printf("Create notepad process successfully!\n"); // 新建一个cmd进程窗口
char* szCmdLine2 = "cmd";
STARTUPINFO si2 = {sizeof(si2)};
PROCESS_INFORMATION pi2;
si2.dwFlags = STARTF_USESHOWWINDOW; // 指定wShowWindow成员有效
si2.wShowWindow = TRUE; // 此成员设为TRUE的话则显示新建进程的主窗口,FALSE不显示 BOOL bRet = ::CreateProcess(
NULL, // 不在此指定可执行文件的文件名
szCmdLine2, // 命令行参数
NULL, // 默认进程安全性
NULL, // 默认线程安全性
FALSE, // 指定当前进程内的句柄不可以被子进程继承
CREATE_NEW_CONSOLE, // 为新进程创建一个新的控制台窗口,如果为NULL,不会创建新的窗口
NULL, // 使用本进程的环境变量
NULL, // 使用本进程的驱动器和目录
&si1,
&pi2); if (bRet)
{
// 既然不使用两个句柄,最好是立刻将它们关闭
::CloseHandle(pi2.hThread);
::CloseHandle(pi2.hProcess);
printf("新进程的进程ID号:%d\n", pi2.dwProcessId);
printf("新进程的主线程ID号:%d\n", pi2.dwThreadId);
} return ;
}

运行效果:

 进程快照
1 #include <windows.h>
#include <TLHELP32.H> // 声明快照函数的头文件
#include <stdio.h> int main()
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32); // 给系统内的所有进程拍一个快照--改函数用于获取系统指定进程的快照,也可以传入不同参数获取被这些进程使用的堆、模块和线程的快照
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, );
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot 调用失败!\n");
return -;
} // 遍历进程快照,轮流显示每个进程的信息
BOOL bMore = ::Process32First(hProcessSnap, &pe32);
while(bMore)
{
printf("进程名称:%s\n", pe32.szExeFile);
printf("进程ID号:%u\n\n", pe32.th32ProcessID);
bMore = ::Process32Next(hProcessSnap, &pe32);
} // 不要忘记清除掉snapshot 对象
::CloseHandle(hProcessSnap);
return ;
}

注释:
CreateToolhelp32Snapshot 用于获取系统内指定进程的快照,也可以获取被这些进程使用的堆、模块和线程的快照。函数的具体用法是。
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, // 用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等
DWORD th32ProcessID // 一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取当前进程快照时可以设为0
);
本函数不仅可以获取进程列表,也可以用来获取线程和模块等对象的列表。dwFlags 参数指定了获取的列表的类型,其值可以是:
TH32CS_SNAPHEAPLIST 枚举 th32ProcessID 参数指定的进程中的堆。
TH32CS_SNAPMODULE 枚举 th32ProcessID 参数指定的进程中的模块。
TH32CS_SNAPPROCESS 枚举系统范围内的进程,此时 th32ProcessID 参数被忽略。
TH32CS_SNAPTHREAD 枚举系统范围内的线程,此时 th32ProcessID 参数被忽略。
函数执行成功将返回一个快照句柄,否则返回 INVALID_HANDLE_VALUE(即-1) 。
从快照列表中获取进程信息需要使用 Process32First 和 Process32Next 函数, 函数的每次调用仅返回一个进程的信息。Process32First 函数用来进行首次调用,以后的调用由
Process32Next 函数循环完成,直到所有的信息都被获取为止。当不再有剩余信息的时候,函数返回 FALSE,所以程序中使用下面的循环结构来获取进程列表。
BOOL bMore = ::Process32First(hProcessSnap, &pe32);
while(bMore)
{ // 在这里处理返回到 PROCESSENTRY32 中的进程信息
bMore = ::Process32Next(hProcessSnap, &pe32);
}

运行效果:

终止进程:

终止进程也就是结束程序的执行,让它从内存中卸载。进程终止的原因可能有 4 种:
(1)主线程的入口函数返回。
(2)进程中一个线程调用了 ExitProcess 函数,该函数只能终止当前进程。
(3)此进程中的所有线程都结束了。
(4)其他进程中的一个线程调用了 TerminateProcess 函数。

终止当前进程:
void ExitProcess(UINT uExitCode); // 参数uExitCode 为此程序的退出代码。 终止其他进程:
BOOL TerminateProcess(
HANDLE hProcess, // 要结束的进程(目标进程)的句柄
UINT uExitCode // 指定目标进程的退出代码,你可以使用GetExitCodeProcess 取得一个进程的退出代码
);

  在对一个进程操作前, 必须首先取得该进程的进程句柄。 CreateProcess 函数创建进程后会返回一个进程句柄,而对于一个已经存在的进程,只能使用 OpenProcess 函数来取得这个进程
的访问权限,函数用法如下:

 HANDLE OpenProcess(
    DWORD dwDesiredAccess, // 想得到的访问权限,可以是PROCESS_ALL_ACCESS等
    BOOL bInheritHandle,   // 指定返回的句柄是否可以被继承
    DWORD dwProcessId      // 指定要打开的进程的ID 号
  );

 一般使用下面的代码来终止一个进程:
 BOOL TerminateProcessFromId(DWORD dwId)
 {
    BOOL bRet = FALSE;
   // 打开目标进程,取得进程句柄
   HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwId);
   if(hProcess != NULL)
   { // 终止进程

    bRet = ::TerminateProcess(hProcess, 0);
   }
   CloseHandle(hProcess);
   return bRet;
}

Win32进程创建、进程快照、进程终止用例的更多相关文章

  1. Linux-进程描述(4)之进程优先级与进程创建执行

    进程优先级 进程cpu资源分配就是指进程的优先权(priority).优先权高的进程有优先执行权利. 权限与优先级.权限(privilege)是指在多用户计算机系统的管理中,某个特定的用户具有特定的系 ...

  2. C#进程创建监控

    关于c#进程创建监控的文章大多都是“遍历一次进程用if去判断存在或否”这样的方法,我觉得体验不是很好.这几天写的一个软件正好需要实时监控进程创建的模块,在网上找到了很不错的方法,整理一下分享出来给大家 ...

  3. c++并发编程之进程创建(给那些想知道细节的人)

    关于多进程创建,此处只讲解一个函数fork(). 1.进程创建 先上代码: #include"iostream" #include<unistd.h> //unix标准 ...

  4. 【进程/作业】篇章一:Linux进程及其管理(进程的管理基础)

    概述:监控系统各方面的性能,保障各类服务的有序运行,是运维工作的重要组成部分,本篇就介绍一次常用的系统监控命令和相关的参数说明 具体包含以下几部分: 1.进程的管理基础 ,主要是讲一下概念性的东西 2 ...

  5. 进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端

    摘要:本文主要介绍进程的基本属性,基本属性包含:进程ID.父进程ID.进程组ID.会话和控制终端. 进程基本属性 1.进程ID(PID) 函数定义:      #include <sys/typ ...

  6. Linux系统编程之进程控制(进程创建、终止、等待及替换)

    进程创建 在上一节讲解进程概念时,我们提到fork函数是从已经存在的进程中创建一个新进程.那么,系统是如何创建一个新进程的呢?这就需要我们更深入的剖析fork函数. 1.1 fork函数的返回值 调用 ...

  7. Win32之创建进程

    CreateProcess函数介绍 BOOL CreateProcessA( LPCSTR lpApplicationName, //可执行文件的名称完整的路径+程序名字) LPSTR lpComma ...

  8. Win32之进程创建过程

    0x01. 什么是进程? 进程提供程序所需要的资源,如:数据.代码等等 进程扮演的角色仅仅是为当前程序提供资源,或者代码,这就是进程所提供的,当时程序运行的状态和进程没有关系,进程可以看做空间的概念 ...

  9. Delphi 使用CreateProcess创建进程并弹出进程PID值 (转)

    var  ExeName:PChar;  StartupInfo:TStartupInfo;  ProcessInfo:TProcessInformation;begin  FillChar(Proc ...

随机推荐

  1. 【μ'sic forever♪♪♪】μ's Final Love Live周年纪念

    一.正文 “切なくて时をまきもどしてみるかい?No no no……いまが最高!” 转眼就是一周年了,其实fl后入坑的我在这里怀念显得有些无病呻吟.但我也有想说的话,说给重要的人听. “ほのかな予感から ...

  2. bzoj1151 动物园

    Description 新建的圆形动物园是亚太地区的骄傲.圆形动物园坐落于太平洋的一个小岛上,包含一大圈围栏,每个围栏里有一 种动物.如下图所示: 你是动物园的公共主管.你要做的是,让每个来动物园的人 ...

  3. ThreadLocal 详解

    什么是ThreadLocal 根据JDK文档中的解释:ThreadLocal的作用是提供线程内的局部变量,这种变量在多线程环境下访问时能够保证各个线程里变量的独立性. 从这里可以看出,引入Thread ...

  4. ASP.NET Core 中的框架级依赖注入

    https://tech.io/playgrounds/5040/framework-level-dependency-injection-with-asp-net-core 作者: Gunnar P ...

  5. 基于Servlet+JSP+JavaBean开发模式的用户登录注册

    http://www.cnblogs.com/xdp-gacl/p/3902537.html 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBea ...

  6. 导入导出CSV

    const string dataPath = @"D:\Users\jin_h\Documents\Visual Studio 2013\Projects\ConsoleApplicati ...

  7. 区别ES3ES5和ES6this的指向问题。区分普通函数和箭头函数中this的指向问题

    ES3 ES5this的指向问题 this指的是该函数被调用的对象 var foo = function () { this.a = 'a', this.b = 'b', this.c = { a: ...

  8. DIV+javascript实现首尾相连循环滚动效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. IIS7.0下 HTTP 错误 404.15 - Not Found 请求筛选模块被配置为拒绝包含的查询字符串过长的请求

    IIS7.0下 HTTP 错误 404.15 - Not Found 请求筛选模块被配置为拒绝包含的查询字符串过长的请求   IIS7.0下查询条件太多时,会报错,因为IIS 7对于Query Str ...

  10. [Go] 反射 - reflect.ValueOf()

    类型 和 接口 由于反射是基于类型系统(type system)的,所以先简单了解一下类型系统. 首先 Golang 是一种静态类型的语言,在编译时每一个变量都有一个类型对应,例如:int, floa ...