mac OS X上的资源限制(setrlimit)

时间:2013-02-02 00:25:29

标签: macos resources

我正在尝试了解如何在Mac OS X中为该进程中的进程设置资源限制(我有10.6)。在CentOS上,以下测试程序(python3.3)按照我的预期工作:

import resource
import signal

def confirm(prompt, instructions='(y)es or (n)o only, please.'):
    while True:
        ok = input(prompt)
        if ok in ('y', 'ye', 'yes'):
            return True
        if ok in ('n', 'no'):
            return False
        print(instructions)

def handle_cpu_soft_limit(signal, frame):
    print('CPU soft limit reached.')
    if not confirm('Do you want to continue anyway? (y/n): '):
        raise ResourceWarning()

def long_function():
        a = 0
        while True:
            a += 1
            a -= 1

def main():
    # set soft limit to 1 second, hard limit to 5 seconds (CPU time)
    resource.setrlimit(resource.RLIMIT_CPU, (1, 5))
    # set handler for soft CPU limit signal
    signal.signal(signal.SIGXCPU, handle_cpu_soft_limit)
    # do some busy work
    try:
        long_function()
    except ResourceWarning:
        print('Stopping now before being forced.')

if __name__ == '__main__':
    main()

程序将CPU时间燃烧,直到达到软限制(1秒,元组中的第一个元素传递给resource.setrlimit())。程序捕获操作系统发送的信号(在本例中为SIGXCPU)并询问我是否要继续。在CentOS(或其他Linux)上,如果我说是,它将在一秒间隔内再次询问我,直到达到硬限制(5秒),此时操作系统将终止进程。在Mac OS X上,我仍然可以获得并处理SIGXCPU信号,但是我再也没有得到信号,即使达到了硬限制,也不会终止该过程。这可能与this question的提问者所经历的内容有关,也可能与之无关。

Mac OS X上setrlimit的手册页说明如下:

  

资源限制被指定为软限制和硬限制。当超出软限制时,进程可能会收到一个信号(例如,如果超出了cpu时间或文件大小),但它将被允许继续执行,直到达到硬限制(或修改其资源限制)。 / p>

...实际上是来自setrlimit上的BSD 4.2手册页。然而,当达到硬限制时,程序似乎永远不会获得SIGKILL。我搜索了google和SO以获取有关mac setrlimit的信息,但没有找到太多有用的信息。我有两个问题:

  1. 这种行为(特别是mac os X忽略了对进程的硬性限制)是否打算并在任何地方记录?我在python中写了我的例子,但同样的事情发生在C(我可以根据请求发布一些测试代码),所以这不是语言错误。

  2. 有没有办法让这段代码在linux和mac上表现相同?或者我应该像软限制一样对待软限制吗?

0 个答案:

没有答案