Windows进程的创建与销毁
### Windows进程的创建与销毁 #### 一、进程的基本概念 在深入了解Windows进程的创建与销毁之前,我们首先需要理解什么是进程以及它在操作系统中的作用。简单来说,进程是正在运行的一个程序实例,每个进程都有自己的内存空间和系统资源。在Windows系统中,进程的管理和控制主要依赖于内核提供的各种服务。 #### 二、进程的创建 在Windows系统中,创建一个新的进程通常涉及到`CreateProcess`函数的使用。该函数允许开发者指定要执行的应用程序路径、命令行参数等信息,并返回进程的信息。 ```cpp // 示例代码:创建一个新的进程 void CreateProgress() { char szCommandLine[] = "cmd"; STARTUPINFO si = { sizeof(si) }; PROCESS_INFORMATION pi; si.dwFlags = STARTF_USESHOWWINDOW; // 设置启动窗口显示方式 si.wShowWindow = TRUE; // 默认为TRUE则显示窗口 BOOL bRet = ::CreateProcess( NULL, // 应用程序路径,如果为NULL则使用szCommandLine中的完整路径 szCommandLine, // 命令行参数 NULL, // 进程安全属性 NULL, // 线程安全属性 FALSE, // 继承句柄标志 CREATE_NEW_CONSOLE, // 创建新控制台 NULL, // 新环境变量 NULL, // 新工作目录 &si, &pi); // 进程信息结构体 if (bRet) { // 成功创建后关闭句柄并输出进程ID和线程ID ::CloseHandle(pi.hThread); ::CloseHandle(pi.hProcess); printf("进程ID:%d\n", pi.dwProcessId); printf("线程ID:%d\n", pi.dwThreadId); } } ``` #### 三、进程的销毁 进程的销毁通常指的是终止一个已经存在的进程。在Windows中,可以通过`TerminateProcess`函数来实现这一操作。该函数接收一个指向进程的句柄和一个退出代码作为参数。 ```cpp // 示例代码:根据进程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; } void TerminateProcessFromId1() { DWORD dwId; printf("请输入要终止的进程ID:\n"); scanf("%u", &dwId); if (TerminateProcessFromId(dwId)) { printf("终止成功\n"); } else { printf("终止失败\n"); } } ``` #### 四、挂起和激活主线程 除了创建和销毁进程之外,还需要了解如何控制进程中的线程行为,例如挂起和激活主线程。这可以通过`SuspendThread`和`ResumeThread`两个函数来实现。 - `SuspendThread`: 挂起一个线程。 - `ResumeThread`: 恢复一个线程。 这些函数通常用于调试目的或需要暂停线程执行的特殊场景。 #### 五、查看系统进程列表 为了更好地理解和监控进程的行为,可以利用Windows自带的工具(如任务管理器)来查看当前系统中运行的所有进程。此外,也可以编写程序来获取进程列表,例如使用`CreateToolhelp32Snapshot`函数结合`Process32First`和`Process32Next`来遍历所有进程。 ```cpp // 示例代码:查找并打印所有进程信息 int find() { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(pe32); HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) { printf("CreateToolhelp32Snapshot失败\n"); return -1; } BOOL bMore = ::Process32First(hProcessSnap, &pe32); while (bMore) { printf("进程名:%s\n", pe32.szExeFile); printf("ID:%u\n\n", pe32.th32ProcessID); bMore = ::Process32Next(hProcessSnap, &pe32); } ::CloseHandle(hProcessSnap); } ``` 通过上述代码示例,我们可以看到如何使用Windows API来创建、销毁进程,以及如何控制线程的状态。这些技术对于开发复杂的多进程或多线程应用程序至关重要。同时,掌握这些API的使用方法也有助于提高对Windows操作系统内部机制的理解。
//
#include <iostream.h>
#include "stdafx.h"
#include <windows.h>
#include <tlhelp32.h> // 声明快照函数的头文件
#include <stdio.h>
int find(){
PROCESSENTRY32 pe32;
// 在使用这个结构之前,先设置它的大小
pe32.dwSize = sizeof(pe32);
// 给系统内的所有进程拍一个快照
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
printf(" CreateToolhelp32Snapshot调用失败! \n");
return -1;
}
// 遍历进程快照,轮流显示每个进程的信息
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);
}
///////////////////////////////////////////////////////////////
// 02ExitThread.cpp文件
class CMyClass
{
public:
CMyClass() { printf(" Constructor\n"); }
~CMyClass() { printf(" Destructor\n"); }
};
///////////////////////////////////////////////////////////////
// 02TerminateProcess.cpp文件
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;
}
剩余10页未读,继续阅读
- 粉丝: 0
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 云计算,搭建分布式,然后实现Titantic数据集训练、分类的的代码
- 同城宠物照看-JAVA-基于Spring Boot的同城宠物照看系统的设计与实现(毕业论文)
- 云计算,实现中文字频统计代码,课程设计
- weixin138社区互助养老+ssm(论文+源码)-kaic.zip
- 扶贫助农系统-JAVA-基于spring boot扶贫助农系统设计与实现(毕业论文)
- 母婴护理知识共享-JAVA-基于SpringBoot+vue 的母婴护理知识共享系统(毕业论文)
- 番茄叶片图像病害多标签分类,约5600张数据
- 影音互动科普网站-JAVA-基于SpringBoot的哈利波特书影音互动科普网站设计与实现(毕业论文)
- 航空散货调度-JAVA-基于SpringBoot的航空散货调度系统设计与实现(毕业论文)
- 基于Python Scrapy的贝壳找房爬虫程序
- zigbee CC2530无线自组网协议栈实现一个协调器+多个终端的通讯及控制.zip
- 校园二手物品交易-JAVA-基于springBoot的校园二手物品交易系统的设计与实现(毕业论文)
- 计算机视觉项目:Swin-Transformer 【tiny、small、base】模型实现的图像识别项目:番茄病害图像分类
- 功能完善的电商数据智能爬虫采集系统项目全套技术资料.zip
- 青少年心理健康教育网-JAVA-基于springboot的青少年心理健康教育网站的设计与实现(毕业论文)
- 密评流程及商密应用方案解析
- 1
- 2
- 3
前往页