如何检测os.system的内存限制
我现在正在使用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系统上可用。
你可以查看低字节来了解信号是什么,并用它来判断进程被杀死或退出的原因。