- 作业
终止作业中的所有线程windows没有维护进程之间的父子关系,意思就是,即使父进程终止运行,子进程仍然继续运行。 windows提供了一个作业内核对象,它允许我们将进程组合在一起并创建一个“沙箱”来限制进程能够做什么。最好将作业对象想象成一个进程容器。某些时候,创建只包含一个进程的作业同样非常有用,因为这样可以对进程施加平时不能施加的限制。 IsProcessInJob是验证当前进程是否在一个现有作业的控制之下,如果一个进程已经与一个作业关联,就无法将当前进程或者它的任何子进程从作业中去除 CreateJobObject-------创建一个新的作业内核对象 OpenJobObject------打开一个已命名的作业内核对象 限制作业中的进程的行为(沙箱): SetInformationJobObject--------设置作业限制类型 UserHandleGrantAccess--------对作业开放一定的访问权限或者限制 QueryInformationJobObject--------查询作业施加限制的信息 将进程放入作业中: AssignProcessToJobObject---------将进程显式放入作业中。查询作业统计信息Visual Studio中是多进程协作的,所以没有使用作业这个功能,所以你会发现,VS没有一个简单的办法来停止正在进行中的构建(build),因为非常难知道,哪些进程是从它生成的第一个进程生成的。 TerminateJobObject----------杀死作业内部所有进程作业通知向QueryInformationJobObject函数中传递JOBOBJECT_ACCOUNTING_INFORMATION,还有各种参数参考MSDN问题引入:我们想知道作业中的进程何时终止,或者所有已分配的CPU时间是否已经到期,等。 CPU时间是否已经到期: 如果作业中的进程尚未用完已经分配的CPU时间,作业对象就处于未触发状态。一旦时间用完,windows就会强行杀死作业中的进程并触发作业对象,所以可以通过WaiteForSingleObject来等待,可以通过SetInformationJobObject来设置作业CPU时间。 还有更高级的通知,需要利用I/O完成端口对象与作业对象进行关联。使用过程
(1)创建作业
HANDLE CreateJobObject(
PSECURITY_ATTRIBUTES psa;
PCTSTR pszName
);
(2)创建进程
(3)把新建的进程放入到作业中:
BOOL AssignProcessToJobObject(
HANDLE hJob, //建的作业
HANDLE hProcess //新建的进程
);
对作业进程的限制
(1)基本限制和扩展基本限制,用于防止作业中的进程垄断系统资源;
(2) 基本的UI限制,用于限制作业中的进程修改用户界面;
(3)安全性限制,防止作业中的进程访问保密资源.
需调用下面的这个函数:
BOOL SetInfoMationJobObject
(
HANDLE hJob, //标示要限制的作业
JOBOBJECTINFOCLASS JobObjectInfomationClass, //枚举要使用的限制类型
PVOID pJobObjectInfomation, //包含限制设置值的数据结构的地址
DWORD cbJobObjectInfomationLength //用语指明该结构的大小
);
查询限制信息
BOOL QueryInformationJobObject
(
HANDLE hJob,
JOBOBJECTINFOCLASS JobObjectInformationClass,
PVOID pvJobObjectInformation,
DWORD cbJobObjectInformationLength,
PDWORD pdwReturnLength
);