《Windows via C/C++》学习笔记 —— 作业

  跟进程一样,作业也只是一个容器(我个人的理解),只不过他是用来存放进程的容器而已,其作用就是给一组进程以同样的限制条件,这些限制条件包括基本限制、扩展基本限制、基本UI限制(用户界面限制)和安全性限制。至于这些限制都有具体数据结构,参看文档。

  作业容器的过程通常是:

  1、通过GreateJobObject函数创建,返回一个作业内核对象句柄。

  2、通过SetInformationJobObject函数对该作业设置限制,通过传递不同的参数,我们可以设置不同的限制。

  3、然后是把进程通过AssignProcessToJobObject函数分配到相应的作业容器中(注意一旦分配好之后就不能再分配给其它作业了,覆水难收啊!),该函数接收2个参数:作业对象句柄、进程对象句柄。

  4、可以通过使用 QueryInformationJobObject 函数来查看作业信息,通过传递不同的参数,我们可以查看该作业中的统计信息,它有哪些限制等等。

  5、使用完所有的任务后想要结束作业中的所有进程则可以通过TerminateJobObject终止所有进程从而关闭作业。

  关于作业还有一点就是如果作业中的所有进程都终止运行或者系统分配的CPU时间已经到期了,那么会提供作业通知信息,以便作业结束。

 

  关于作业的通知消息,本书上利用了“I/O完成端口”(I/O completion port)这种技术。下面得代码将一个hJob标识的作业和一个hIOCP标识的I/O完成端口关联了起来。通过使用SetInformationJobObject函数,将hJob和一个“作业关联完成端口”的结构的地址传递进去。 

JOBOBJECT_ASSOCIATE_COMPLETION_PORT joacp;  // 作业关联完成端口结构
joacp.CompletionKey = 1;    // 唯一标识作业的一个值
joacp.CompletionPort = hIOCP;   // I/O完成端口的句柄

//关联作业和I/0完成端口
SetInformationJobObject(hJob,  // 作业句柄
     JobObjectAssociateCompletionPortInformation,  // 表示要关联完成端口
     &joacp,   // 作业关联完成端口结构指针
     sizeof(jaocp));   // 结构的大小


  可以在程序中使用GetQueuedCompletionStatus函数取得一个I/O完成端口的信息。从而得到通知消息。

 

posted on 2008-07-29 23:11  小虎无忧  阅读(842)  评论(0编辑  收藏  举报

导航