【Windows系统编程】02.进程与线程(一)-笔记

进程,进程对象

虚拟内存

进程不能执行代码,数据结构,三环PEB,0怀EPROCESS对进程进行管理

线程列表

线程才是真正执行代码

主线程:主函数

线程依赖于cpu时间片切换

单核,多核

主线程消息,进程销毁

int main()
{

	//该结构体指定创建进程时的主窗口的窗口工作站,桌面,标准句柄和外观
	STARTUPINFO StartupInfo = { sizeof(STARTUPINFO) };

	//该结构体包含有关新创建的进程及其主线程的信息
	PROCESS_INFORMATION ProcessInformation;

	//创建进程
	BOOL bRet = CreateProcess(L"F:\\ChinaNet-EDU.exe",     //文件路径
		NULL,                                 //命令行参数
		NULL,                                 //进程安全属性
		NULL,                                 //主线程安全属性
		FALSE,                                //进程句柄是否可继承
		NULL,                                 //控制优先级类和进程的创建标志
		NULL,                                 //指向新进程的环境块的指针
		NULL,                                 //进程当前目录的完整路径
		&StartupInfo,                         //指向STARTUPINFO或STARTUPINFOA的指针
		&ProcessInformation                    //指向PROCESS_INFORMATION结构的指针
	);

	if (!bRet) {
		std::cout << "CreateProcess Failed!" << std::endl;
	}
	else {
		std::cout << "进程句柄:" << ProcessInformation.hProcess << std::endl;
		std::cout << "线程句柄:" << ProcessInformation.hThread << std::endl;
		std::cout << "进程ID:" << ProcessInformation.dwProcessId << std::endl;
		std::cout << "主线程ID:" << ProcessInformation.dwThreadId << std::endl;
	}

	//关闭进程(只能关闭没有保护的进程)
	//TerminateProcess(ProcessInformation.hProcess, 0);

	//关闭线程
	TerminateThread(ProcessInformation.hThread, 0);

	//结束自己的进程:
	ExitProcess(0);

	system("pause");
	return 0;
}

上面介绍的关闭进程/线程都是通过自己创建进程,通过返回值得到的句柄

但是如果我们想结束不是我们自己创建的进程/线程,我们该如何拿到句柄,如何关闭?

//ID:5340
HANDLE hProcesss = OpenProcess(
  PROCESS_ALL_ACCESS,   //权限
  FALSE,                //可否继承
  5430                 //进程ID
  )
  if(hProcess==INVALID_HANDLE_VALUE){
    std::cout<<"OpenProcess Error Code:"<<GetLastError<<std::endl;
  }
  
  TerminateProcess(hProcess,0);

上述关闭进程,ID是在任务管理器中得到的,对于权限较低的进程,能够关掉

我们尝试关闭权限较高的进程的时候,会出错(拒绝访问了)

我们每次关闭进程,去看任务管理器实在是太2了,我们来看看如何找进程ID:

#include <TlHelp32.h>

int main(){
  
  	//创建进程快照
	HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);

	//遍历进程快照
	PROCESSENTRY32 lppe = { sizeof(PROCESSENTRY32) };
	//拿到第一个进程信息
	BOOL bRet = Process32First(hSnap, &lppe);
	while(bRet) {
		std::cout << lppe.szExeFile << ":" << lppe.th32ProcessID << std::endl;
		//字符串比较
		if (strcmp(lppe.szExeFile, "ChinaNet-EDU.exe") == 0) {
			//打开进程
			HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, lppe.th32ProcessID);
			//关闭进程
			BOOL Ret = TerminateProcess(hProcess, 0);
			if (!Ret) {
				std::cout<<"TerminateProcess "<<lppe.szExeFile<<"Failed Code :"<<std::endl;
			}
		}
		//继续找下一个进程
		bRet = Process32Next(hSnap, &lppe);
	}
  return 0;
}

上述都是进程相关,我们来看看线程相关:

#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>

DWORD ThreadCallBack(LPVOID lpThreadParameter) {
	int i = 0;
	while (true)
	{
		std::cout << "Thread:" << i++ << std::endl;
		Sleep(1000);
	}
}

int main()
{
  	//用于接收线程ID
	DWORD dwThreadID;
	//创建线程
	HANDLE hThread = CreateThread(
		NULL,           //安全属性,结构体里面有一个成员,决定线程句柄是否可以继承
		NULL,           //堆栈大小,如果为NULL,则分配默认大小
		ThreadCallBack, //指向有线程执行的应用程序定义函数的指针
		NULL,           //指向由线程执行的应用程序传给线程的变量指针
		NULL,           //控制线程创建的标志:立即执行或挂起等状态
		&dwThreadID     //指向接收线程表示符的变量指针
	);

	int i = 0;
	while (true)
	{
		std::cout << "Main:" << i++ << std::endl;
		Sleep(1000);
	}

	system("pause");
	return 0;
}

线程

主线程挂掉了,子线程必挂

  • 挂起线程:

    SuspendThread(hThread);
    
  • 唤醒线程:

     ResumeThread(
    	HANDLE hThread   //线程句柄
    );
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/75453.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT等人工智能编写文章的内容今后将成为常态

BuzzFeed股价上涨200%可能标志着“转向人工智能”媒体趋势的开始。 周四&#xff0c;一份内部备忘录被华尔街日报透露BuzzFeed正计划使用ChatGPT聊天机器人-风格文本合成技术来自OpenAI&#xff0c;用于创建个性化盘问和将来可能的其他内容。消息传出后&#xff0c;BuzzFeed的…

【数据结构与算法】十大经典排序算法-归并排序

&#x1f31f;个人博客&#xff1a;www.hellocode.top &#x1f3f0;Java知识导航&#xff1a;Java-Navigate &#x1f525;CSDN&#xff1a;HelloCode. &#x1f31e;知乎&#xff1a;HelloCode &#x1f334;掘金&#xff1a;HelloCode ⚡如有问题&#xff0c;欢迎指正&#…

地理数据的双重呈现:GIS与数据可视化

前一篇文章带大家了解了GIS与三维GIS的关系&#xff0c;本文就GIS话题带大家一起探讨一下GIS和数据可视化之间的关系。 GIS&#xff08;地理信息系统&#xff09;和数据可视化在地理信息科学领域扮演着重要的角色&#xff0c;它们之间密切相关且相互增强。GIS是一种用于采集、…

unity新输入系统的简单使用(New InputSystem)

1、在包管理器 unity注册表中下载安装InputSystem 2、给玩家添加组件PlayerInput&#xff0c;点击CreatAction,创建一个InputAct InputAct,这是玩家的输入文件&#xff0c;在里面可以设置玩家输入 3、使用 例如玩家控制角色移动 在InputAct中&#xff0c;默认已经设置好了移…

誉天HCIP-Datacom课程简介

HCIP-Datacom课程介绍&#xff1a;HCIP-Datacom分为一个核心技术方向&#xff1a;HCIP-Datacom-Core Technology H12-821 &#xff08;核心技术&#xff09;六个可选子方向&#xff1a;HCIP-Datacom-Advanced Routing & Switching Technology H12-831 &#xff08;高级路…

用Node.js吭哧吭哧撸一个运动主页

简单唠唠 某乎问题&#xff1a;人这一生&#xff0c;应该养成哪些好习惯&#xff1f; 问题链接&#xff1a;https://www.zhihu.com/question/460674063 如果我来回答肯定会有定期运动的字眼。 平日里也有煅练的习惯&#xff0c;时间久了后一直想把运动数据公开&#xff0c;…

Ant Design Mobile是什么?

在当今的数字时代&#xff0c;移动应用程序和网页设计已经成为各行各业的重要组成部分。用户界面的设计直接影响到用户体验和产品的成功。为了帮助设计师在移动设计领域更好&#xff0c;Antdesignmobile应运而生。Antdesignmobile是蚂蚁金服的移动UI设计语言和框架&#xff0c;…

网络通信TCP/IP协议逐层分析数据链路层(第四十课)

Ethernet Ⅱ帧,也称为Ethernet V2帧,是如今局域网里最常见的以太帧,是以太网事实标准。如今大多数的TCP/IP应用(如HTTP、FTP、SMTP、POP3等)都是采用Ethernet II帧承载。 1、MAC地址概述 -MAC地址,即以太网地址,用来标识一个以太网上的某个单独设备或一组设备 -长度…

认识excel篇3之数据的有效性(数据验证)

数据有效性不仅能够对单元格的输入数据进行条件限制&#xff0c;还可以在单元格中创建下拉列表菜单方便用户选择输入。如果没有做数据验证&#xff0c;单元格内默认可以输入任意类型的数据。数据验证就是限制单元格输入数据&#xff08;必须输入符合要求的才能输入&#xff09;…

Spring Boot+Redis 实现消息队列实践示例

Spring BootRedis 实现一个轻量级的消息队列 文章目录 Spring BootRedis 实现一个轻量级的消息队列0.前言1.基础介绍2.步骤2.1. 引入依赖2.2. 配置文件2.3. 核心源码 4.总结答疑 5.参考文档6. Redis从入门到精通系列文章 0.前言 本文将介绍如何利用Spring Boot与Redis结合实现…

Docker容器与虚拟化技术:Docker资源控制、数据管理

目录 一、理论 1.资源控制 2.Docker数据管理 二、实验 1.Docker资源控制 2.Docker数据管理 三、问题 1.docker容器故障导致大量日志集满&#xff0c;造成磁盘空间满 2、当日志占满之后如何处理 四、总结 一、理论 1.资源控制 (1) CPU 资源控制 cgroups&#xff0…

数据结构:堆的实现

1.堆的概念 如果有一个关键码的集合 K { k1 &#xff0c;k2 &#xff0c;k3 &#xff0c;…&#xff0c;kn }&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中&#xff0c;并且 k(i) < k(i*21) 和 k(i) < k(i*22)&#xff0c; i 0 &#xff…

BUUCTF [安洵杯 2019]easy_serialize_php 1 详细讲解

题目来自buuctf&#xff0c;这是一题关于php序列化逃逸的题 1. 题目 题目给出的代码 <?php$function $_GET[f];function filter($img){$filter_arr array(php,flag,php5,php4,fl1g);$filter /.implode(|,$filter_arr)./i;return preg_replace($filter,,$img); }if($_S…

炬芯科技发布全新第二代智能手表芯片,引领腕上新趋势!

2023年7月&#xff0c;炬芯科技宣布全新第二代智能手表芯片正式发布。自2021年底炬芯科技推出第一代的智能手表芯片开始便快速获得了市场广泛认可和品牌客户的普遍好评。随着技术的不断创新和突破&#xff0c;为了更加精准地满足市场多元化的变幻和用户日益增长的体验需求&…

localhost:8080 is already in use

报错原因&#xff1a;本机的8080端口号已经被占用。因为机器的空闲端口号是随机分配的&#xff0c;而idea默认启动的端口号是8080,所以是存在这种情况。 对于这个问题&#xff0c;我们只需要重启idea或者修改项目的启动端口号即可。 更推荐第二种。对于修改项目启动端口号&…

vscode | linux | c++ intelliense 被弃用解决方案

每日一句&#xff0c;vscode用的爽是爽&#xff0c;主要是可配置太强了。如果也很会研究&#xff0c;可以直接去咸鱼接单了 废话少说&#xff0c;直接整。 用着用着说是c intelliense被弃用&#xff0c;很多辅助功能无法使用&#xff0c;像查看定义、查看引用、函数跳转、智能提…

Unity智慧园区夜景制作

近期使用Unity做了一个智慧园区场景的demo&#xff0c;初步了解了3D开发的一些步骤和知识&#xff0c;以下为制作的步骤&#xff0c;比较简略&#xff0c;备忘&#xff1a; 1. 制作前的设计分析&#xff1a; 1. 分析日光角度&#xff0c;阴影长度&#xff0c;效果 2. 分析冷暖…

前后端分离------后端创建笔记(10)用户修改

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…