为什么os.nice(10)在OS X上会失败?

0 投票
2 回答
602 浏览
提问于 2025-04-20 22:56

为什么在 OS X 上使用 os.nice(10) 会出现 OSError: [Errno 1] Operation not permitted 的错误呢?这个是在普通用户账户下运行的:

$ python
…
>>> os.nice(10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 1] Operation not permitted

具体信息:

  • Python 版本:2.7.2
  • 操作系统版本:OS X 10.8.4

2 个回答

1

检查一下你的 PRIO_MAX 值是什么,以及普通用户可以使用哪些优先级。

除了超级用户以外的用户只能改变自己拥有的进程的优先级,并且只能在 0 到 PRIO_MAX(20)之间逐渐增加他们的“nice 值”。

https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man8/renice.8.html

4

正如Lukas Graf所指出的,os.nice是用来增加优先级的,而不是直接设置它。

这似乎是一个OS X的错误,当你在优先级为20或更高时调用nice就会触发这个问题:

nice -n 20 python -c 'import os; os.nice(10)'

这个会失败,而

nice -n 19 python -c 'import os; os.nice(10)'

这个则可以正常工作。一个简单的C程序也会遇到同样的问题:

#include <unistd.h>
#include <string.h>

int main() {
    if(nice(10) < 0)
        perror("nice");
}

如果你用nice -n 20 ./test来运行它,会打印出错误,但如果用nice -n 19 ./test来运行,就能成功。


原因是优先级20超出了nice API支持的最大优先级(NZERO)。OS X的nice工具使用setpriority,所以它会忽略这个限制,但nice的C函数(Python直接使用的)是会考虑这个限制的。如果进程的优先级是20或更高,nice会试图把优先级设置为19,但这是不被允许的(因为这会提高进程的优先级,而只有特权用户才能这样做)。

这是一个奇怪的错误,但只要不使用优先级20,就能轻松避免。

撰写回答