windows 核心编程第五章:演示作业的使用及获取统计信息

news/2024/9/18 14:50:55/ 标签: windows

演示作业的使用及获取统计信息

演示作业的使用及获取统计信息

文章目录

  • 演示作业的使用及获取统计信息
  • 演示作业的使用及获取统计信息


演示作业的使用及获取统计信息

/*
演示作业的使用及获取统计信息
*/#include <stdio.h>
#include <Windows.h>
#include <tchar.h>
#include <strsafe.h>
#include <malloc.h> // for _alloca函数
#include <locale.h> 	
void EnumProcessIdsInJob(HANDLE hJob);//获取作业中当前的进程ID集
void StartRestrictedProcess();//利用作业对象对进程进程管理的演示int _tmain()
{_tsetlocale(LC_ALL, TEXT("chs"));StartRestrictedProcess();return (0);
}
//获取作业中当前的进程ID集
void EnumProcessIdsInJob(HANDLE hJob)
{//先假设作业中的进程不会超过10个const int MAM_PROCESS_IDS = 10;//计算结构体和ID集所需的控件大小DWORD cb = sizeof(JOBOBJECT_BASIC_PROCESS_ID_LIST) + (MAM_PROCESS_IDS - 1) * sizeof(DWORD);//分配内存,注意_allocal是在栈(而不是堆上分配的,所有不需要释放)PJOBOBJECT_BASIC_PROCESS_ID_LIST pjobpil =(PJOBOBJECT_BASIC_PROCESS_ID_LIST)_alloca(cb);//估计最多的线程数pjobpil->NumberOfAssignedProcesses = MAM_PROCESS_IDS;//查询QueryInformationJobObject(hJob, JobObjectBasicProcessIdList, pjobpil, cb, &cb);//显示进程ID集for (DWORD x = 0; x < pjobpil->NumberOfProcessIdsInList; x++){_tprintf(TEXT("process %d(ID = %d)\n"), x + 1, pjobpil->ProcessIdList[x]);}
}
//利用作业对象对进程进程管理的演示
void StartRestrictedProcess()
{//检查进程是否已经包含在作业中// 如果已经关联。就没犯法在换到另外一个作业对象中去/*屏蔽测试BOOL bInJob = FALSE;IsProcessInJob(GetCurrentProcess(), NULL, &bInJob);if (bInJob){_tprintf(_T("Process already in a job\n"));return;}*///创建作业内核对象HANDLE hJob = CreateJobObject(NULL,TEXT("MyRestrictedProcessJob"));//在作业中放入线程对象的一些限制规则//首先,设置基本限制JOBOBJECT_BASIC_LIMIT_INFORMATION jobli = { 0 };//进程总是运行在“空闲”优先级jobli.PriorityClass = IDLE_PRIORITY_CLASS;//该作业对象在用户模式下不能超过1ms的cpu时间jobli.PerJobUserTimeLimit.QuadPart = 1000 * 10000I64;//10000tick = 10000*100ns = 1ms//这里只增加了两个限制jobli.LimitFlags =JOB_OBJECT_LIMIT_PRIORITY_CLASS |JOB_OBJECT_LIMIT_JOB_TIME;SetInformationJobObject(hJob, JobObjectBasicLimitInformation,&jobli, sizeof(jobli));//其次,设置UI限制JOBOBJECT_BASIC_UI_RESTRICTIONS jobuir;jobuir.UIRestrictionsClass = JOB_OBJECT_UILIMIT_NONE;//初始化为0//进程不能访问用户对象(比如窗口句柄)jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_HANDLES;//进程不能关闭系统jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_EXITWINDOWS;SetInformationJobObject(hJob, JobObjectBasicUIRestrictions, &jobuir, sizeof(jobuir));//创建子进程并加入作业对象中//Note:进程被创建后,其线程要立刻挂起。再加入作业对象前,不能指向任何代码//这里作业对象的要求,否则,进程指向的那部分代码可能就不受作业对象的限制STARTUPINFO si = { sizeof(si) };PROCESS_INFORMATION pi;TCHAR szCmdLine[8];_tcscpy_s(szCmdLine, _countof(szCmdLine), TEXT("CMD"));BOOL bResult = CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE,CREATE_SUSPENDED | CREATE_NEW_CONSOLE,NULL, NULL, &si, &pi);//将子进程加入到作业对象中//注意:当创建子进程时,子进程会自动加入到父进程所父的作业对象中AssignProcessToJobObject(hJob, pi.hProcess);//限制可以回复子进程的主线程,开始执行代码ResumeThread(pi.hThread);CloseHandle(pi.hThread);//枚举作业对象中的进程IDEnumProcessIdsInJob(hJob);//等待子进程结束或者作业对象所分配的cpu时间被用完HANDLE h[2];h[0] = pi.hProcess;h[1] = hJob;DWORD dw = WaitForMultipleObjects(2, h, FALSE, INFINITE);switch (dw - WAIT_OBJECT_0){case 0:_tprintf(_T("The process has terminated...\n"));break;case 1:_tprintf(_T("All of the job's allotted CPU time was used...\n"));break;}FILETIME CreationTime;FILETIME ExitTime;FILETIME KernelTime;FILETIME UserTime;TCHAR szInfo[MAX_PATH];GetProcessTimes(pi.hProcess, &CreationTime, &ExitTime,&KernelTime, &UserTime);StringCchPrintf(szInfo, _countof(szInfo),TEXT("Kernel = %u|User = %u\n"),KernelTime.dwLowDateTime / 10000,UserTime.dwLowDateTime / 10000);CloseHandle(pi.hProcess);CloseHandle(hJob);_tprintf(szInfo);_tsystem(_T("pause"));return;
}

演示完毕,大家可以上机实验
在这里插入图片描述


http://www.ppmy.cn/news/1516718.html

相关文章

HBase原理和操作

目录 一、HBase在Zookeeper中的存储元数据信息集群状态信息 二、HBase的操作Web Console命令行操作 三、HBase中数据的保存过程 一、HBase在Zookeeper中的存储 元数据信息 HBase的元数据信息是HBase集群运行所必需的关键数据&#xff0c;它存储在Zookeeper的"/hbase&quo…

ARM32开发——(七)GD32F4串口引脚_复用功能_查询

1. GD32F4串口引脚查询 TX RX CK CTS RTS USART0 PA9,PA15,PB6 PA10,PB3,PB7 PA8 PA11 PA12 USART1 PA2,PD5 PA3,PD6 PA4,PD7 PA0,PD3 PA1,PD4 USART2 PB10,PC10,PD8 PB11,PC5,PD9 PB12,PC12,PD10 PB13,PD11 PB14,PD12 UART3 PA0,PC10 PA1,PC11 …

kafka 入门

kafka 有分区和副本的概念&#xff0c;partition 3 表示有3个分区&#xff0c;replication 2 表示有2个副本 通过 --describe --topic test命令可以知道 test这个 主题的分区和副本情况&#xff0c;途中的replicas 表示 其他副本分区的情况&#xff0c;如第一条&#xff0c;t…

【运筹学】【数据结构】【经典算法】最小生成树问题及贪心算法设计

1 知识回顾 我们已经讲过最小生成树问题的基础知识&#xff0c;我们现在想要利用贪心算法解决该问题。我们再来回顾一下最小生成树问题和贪心算法的基础知识。 最小生成树问题就是从某个图中找出总权重最小的生成树。 贪心算法是一种算法设计范式&#xff0c;每一步都选…

深度学习学习经验——全连接神经网络(FCNN)

什么是全连接神经网络&#xff1f; 全连接神经网络&#xff08;FCNN&#xff09;是最基础的神经网络结构&#xff0c;它由多个神经元组成&#xff0c;这些神经元按照层级顺序连接在一起。每一层的每个神经元都与前一层的每个神经元连接。 想象你在参加一个盛大的晚会&#xf…

Vue中的this.$emit()方法详解【父子组件传值常用】

​在Vue中&#xff0c;this.$emit()方法用于触发自定义事件。它是Vue实例的一个方法&#xff0c;可以在组件内部使用。 使用this.$emit()方法&#xff0c;你可以向父组件发送自定义事件&#xff0c;并传递数据给父组件。父组件可以通过监听这个自定义事件来执行相应的逻辑。 …

问界M7 Pro这招太狠了,直击理想L6/L7要害

文 | AUTO芯球 作者 | 雷慢 李想的理想估计要失眠了&#xff0c;为什么啊&#xff1f; 前有L6悬架薄如铁片被曝光&#xff0c;被车主们骂了个狗血淋头&#xff0c; 现在又来个问界M7 Pro版&#xff0c; 24.98万的后驱智驾版就上华为ADS主视觉智驾了&#xff0c; 两个后驱&…

TMDOG的微服务之路_07——初入微服务,NestJS微服务快速入门

TMDOG的微服务之路_07——初入微服务&#xff0c;NestJS微服务快速入门 博客地址&#xff1a;TMDOG的博客 在前几篇博客中&#xff0c;我们探讨了如何在 NestJS 中的一些基础功能&#xff0c;并可以使用NestJS实现一个简单的单体架构后端应用。本篇博客&#xff0c;我们将进入…

基于改进YOLOv8的景区行人检测算法

贵向泉, 刘世清, 李立, 秦庆松, 李唐艳. 基于改进YOLOv8的景区行人检测算法[J]. 计算机工程, 2024, 50(7): 342-351. DOI: 10.19678/j.issn.10 原文链接如下&#xff1a;基于改进YOLOv8的景区行人检测算法https://www.ecice06.com/CN/rich_html/10.19678/j.issn.1000-3428.006…

解决Element-plus中Carousel(走马灯)图片无法正常加载的bug

前言&#xff1a; 最近帮助朋友解决了一个使用Element-plus中Carousel&#xff08;走马灯&#xff09;图片无法正常加载的bug&#xff0c;经过笔者的不断努力终于实现了&#xff0c;现在跟大家分享一下&#xff1a; 朋友原来的代码是这样的&#xff1a; <template><…

【计算机网络】电路交换、报文交换、分组交换

电路交换&#xff08;Circuit Switching&#xff09;&#xff1a;通过物理线路的连接&#xff0c;动态地分配传输线路资源 ​​​​

依靠 VPN 生存——探索 VPN 后利用技术

执行摘要 在这篇博文中,Akamai 研究人员强调了被忽视的 VPN 后利用威胁;也就是说,我们讨论了威胁行为者在入侵 VPN 服务器后可以用来进一步升级入侵的技术。 我们的发现包括影响 Ivanti Connect Secure 和 FortiGate VPN 的几个漏洞。 除了漏洞之外,我们还详细介绍了一组…

SpringBoot集成kafka-获取生产者发送的消息(阻塞式和非阻塞式获取)

说明 CompletableFuture对象需要的SpringBoot版本为3.X.X以上&#xff0c;需要的kafka依赖版本为3.X.X以上&#xff0c;需要的jdk版本17以上。 1、阻塞式&#xff08;等待式&#xff09;获取生产者发送的消息 生产者&#xff1a; package com.power.producer;import org.ap…

Linux的进程详解(进程创建函数fork和vfork的区别,资源回收函数wait,进程的状态(孤儿进程,僵尸进程),加载进程函数popen)

目录 什么是进程 Linux下操作进程的相关命令 进程的状态&#xff08;生老病死&#xff09; 创建进程系统api介绍&#xff1a; fork() 父进程和子进程的区别 vfork() 进程的状态补充&#xff1a; 孤儿进程 僵尸进程 回收进程资源api介绍&#xff1a; wait() waitpid…

VastBase——全局性能调优

目录 一、系统资源调优 1.内存和CPU 2.网络 3.I/O 二、查询最耗性能的SQL 三、分析作业是否被阻塞 背景&#xff1a;影响性能的因素 系统资源 数据库性能在很大程度上依赖于磁盘的I/O和内存使用情况。为了准确设置性能指标&#xff0c;用户需要了解Vastbase部署硬件的基本…

深信服研发面试经验分享

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…

在Spring Boot项目中集成Geth(Go Ethereum)

在Spring Boot项目中集成Geth&#xff08;Go Ethereum&#xff09;客户端&#xff0c;通常是为了与以太坊区块链进行交互。以下是一些基本的步骤和考虑因素&#xff0c;帮助你在Spring Boot应用程序中集成Geth。 安装Geth 首先&#xff0c;你需要在你的机器上安装Geth。你可以从…

k8s备份etcd3.5

一、思路 1、创建nfs存储类,用作存储备份数据<略> 2、制作用于备份的镜像文件 3、指定cronjob 二、制作镜像 ## dockerfile文件# cat Dockerfile FROM dhub.kubesre.xyz/centos:7 ADD etcdv359.tar / RUN mkdir /snapshot# docker build -t registry.k8s.io/etcd:3.…

ST表模板

P3865 【模板】ST 表 && RMQ 问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路:区间最大值&#xff0c;模板题。 int n,m; int arr[100005]; int f[100005][25]; (1<<20)1e6 void init(){ o(nlogn)for(int i1;i<…

爆改YOLOv8|利用SENetV2改进yolov8,暴力涨点

1&#xff0c;本文介绍 本文探讨了将 SENetV2 的稠密聚合层与 SE 模块结合&#xff0c;应用于 YOLOv8&#xff0c;以提升特征表达能力和目标检测性能。SENetV2 通过 Squeeze-and-Excitation&#xff08;SE&#xff09;模块优化通道和全局特征&#xff0c;从而提高分类准确率。…