代码改变世界

关于job对象

2009-12-09 16:35  Iron  阅读(573)  评论(0编辑  收藏  举报
最近在完善oj,今天在看到程序初始化检测部分时,有一点感觉很是别扭,看过windows核心编程第五版的朋友们应该都知道job对象吧,我在oj中控制子进程的执行便是用了此技术,但有个问题是,从visita以上的windows系统中,从资源管理器中启动程序的话,程序本身就关联了一个job对象,而job对象有个特点 就是如果一旦一个进程关联了job对象,那他的所有子进程以及孙进程。。。就都在此job的控制下了,而且不能再关联其他job对象的,这是很要命的。我的oj设计中主要是靠job来得到和控制子进程的运行状态和所用资源,如果不能子进程不能在我的规定的沙箱中运行,那就不妙了,看了windows核心编程后,知道从命令行启动程序是不会关联job对象 的,我利用了这个特性,在程序初始化中判断程序是否已经关联了job对象,即是判断程序是否从命令行启动的,如果不是,则要提示用户从命令行启动此程序。
今天有仔细看了一下CreateProcess函数,发现他的设置项中有一个CREATE_BREAKAWAY_FROM_JOB,如果设置了这项,则可以将子进程脱离父进程所处的job对象的环境中,但条件是父进程所关联的job对象必须设置了 JOB_OBJECT_LIMIT_BREAKAWAY_OK项,于是我写了一个简单的程序检测了一下资源管理器启动程序时创建的job对象是否设置了此项,经检测发现CREATE_BREAKAWAY_FROM_JOB好用,于是将自己的程序有小改了一下,去掉了程序初始化的时候判断是否处在job中的限制。