博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows编程之作业篇
阅读量:7227 次
发布时间:2019-06-29

本文共 1242 字,大约阅读时间需要 4 分钟。

hot3.png

    因为Windows没有维护进程中父子关系(仅仅在创建子进程的一瞬间具有父子关系),所以想通过父进程来控制子进程是很困难的。为此,Windows推出了一个特殊的内核对象---作业(Job),作业就像是一个天然“沙箱”,可以对其中的进程进行时间、内存以及权限等限制。

  •     作业使用步骤
    1. 首先需要创建作业内核对象,通过一下函数来创建作业内核对象
      HANDLE CreateJobObject(  PSECURITY_ATTRIBUTES pas,  PCTSTR pszName);

      与其他内核对象一样的,第一个参数用于指定作业对象的安全信息,以及是否可继承

    2. 其次,是对作业中的进程进行设限,具体通过SetInformationJobObject()来实现

      BOOL SetInformationJobObject(  HANDLE hJob,  JOBOBJECTINFOCLASS JobObjectInformationClass,  PVOID pJobObjectInformation,  DWORD cbJobObjectInformationSize);

      第一个参数用于指定设限的作业,第二个参数用于指定设限的类型,第三个参数用于指向存储具体设限内容的数据结构,第四个参数表示此数据结构的大小。具体内容请参看

    3. 设置好限制之后,我们需要创建进程,就像平常一样创建进程,但是需要设置CREATE_SUSPENDED这个标志。如果不设置,子进程会在创建完成后立即开始执行代码,即逃离沙箱,如果想真正的限制住它,就需要让它在创建完成后不执行任何代码,再通过AssignProcessToJobObject()将进程放入沙箱(作业)

      BOOL AssignProcessToJobObject(  HANDLE hJob,  HANDLE hProcess);

                 

    4. 当进程创建完成并放入作业中后,我们需要将挂起的进程恢复运行,通过ResumeThread()即可

      DWORD WINAPI ResumeThread(  HANDLE hThread);

               

    5. 最后,想要在作业所属进程中知道子进程何时结束,可以简单地用WaitForSingleObject()来获取进程内核对象的触发状态。对于内核对象而言,拥有触发与未触发两个状态,当达到触发状态时,WaitForSingleObject()会捕捉到并返回。而对于进程内核对象而言,只有当进程结束时它的内存对象才会变成触发状态。

      DWORD WaitForSingleObject(   HANDLE hHandle,  DWORD dwMilliseconds);

                    

  • PS:当设置的时间限制和内存限制太小,会出现参数错误而导致设限失败,而如果内存限制小于进程需要的内存空间时,会出现应用程序错误   

  • PS:具体参考代码请前往  处,如有错误,敬请指出~

转载于:https://my.oschina.net/u/3281747/blog/1421943

你可能感兴趣的文章
【JSConf EU 2018】主题总结 (部分主题已有中文文章)
查看>>
JavaScript面向对象名词详解
查看>>
Java设计模式学习 - 责任链模式
查看>>
JVM,DVM,ART
查看>>
webgl滤镜--会呼吸的痛
查看>>
用Go语言实现微信支付SDK
查看>>
oauth2在php实践
查看>>
LeetCode.914 卡牌分组
查看>>
填坑app:compileDebugJavaWithJavac
查看>>
Android 100+行实现本地跳一跳辅助(不需要连接电脑)
查看>>
位状态的使用
查看>>
面试技术题笔记
查看>>
Myth源码解析系列之一-项目简介
查看>>
JS易混淆的方法整理
查看>>
iOS下JS与OC互相调用(八)--Cordova详解+实战
查看>>
七牛实时音视频云视频连线demo(web部分)
查看>>
Netty源码分析(六):SelectedSelectionKeySetSelector
查看>>
forEach,for...of,map与asycn/await
查看>>
springboot 2 Hikari 多数据源配置问题(dataSourceClassName or jdbcUrl is required)
查看>>
Golang数据库编程之GORM模型定义与数据库迁移
查看>>