如何检测os.system的内存限制

3 投票
2 回答
1282 浏览
提问于 2025-04-17 05:31

我现在正在使用os.fork和os.system命令来设置和运行一些程序。我通过resource.setrlimit设置了时间和内存限制,这看起来运行得不错。不过,每个程序因为内存限制崩溃的方式都不一样——比如,Python程序会抛出一个MemoryError,而C++程序可能会出现bad alloc等错误。

我想知道的是,怎么才能检测到一个os.system命令是因为内存限制而结束的,而不是因为超时或其他原因。我尝试了以下方法,但没有成功:

try:
    status = os.system(command)
except MemoryError:
    # Never actually makes it here...

补充说明: 目前我只关心Unix系统。

2 个回答

0

像这样的系统调用不太可能会把返回值搞混了,也不会主动抛出异常。

你需要自己使用 subprocess 模块来处理这个问题:http://docs.python.org/library/subprocess.html#module-subprocess

不过,根据你所调用的系统功能,有时候你可能不知道它是不是因为内存错误而失败,除非它明确告诉你出错了。

0

可以查看这个链接:http://blog.tsul.net/2008/04/ossystem-and-its-return-value.html

在Windows系统上,system()和wait()这两个函数似乎总是返回0。

而在Unix或Mac系统上,system()会返回一个包含进程ID和退出状态的元组:这是一个16位的数字,低字节表示杀死进程的信号编号,高字节表示退出状态(如果信号编号为0的话);如果生成了核心文件,低字节的高位会被设置为1。这个功能在Macintosh和Unix系统上可用。

你可以查看低字节来了解信号是什么,并用它来判断进程被杀死或退出的原因。

撰写回答