我在三星 SoC s3c6410 (ARM11) 上有 linux 板。我使用 buildroot 构建 rootfs:Python 2.7.1,uClibc-0.9.31。Linux 内核:Linux buildroot 2.6.28.6 #177 Mon Oct 3 12:50:57 EEST 2011 armv6l GNU/Linux
我的应用程序是用 python 编写的,在某些 mysterios 条件下会引发以下异常:
1) 例外:
File "./dfbUtils.py", line 3209, in setItemData
ValueError: (4, 'Interrupted system call')
代码:
currentPage=int(math.floor(float(rowId)/self.pageSize))==self.selectedPage
2) 例外:
File "./terminalGlobals.py", line 943, in getFirmawareName
OSError: [Errno 4] Interrupted system call: 'firmware'
代码:
for fileName in os.listdir('firmware'):
关于应用程序的一些信息:它有 3-7 个线程,通过“串行”模块侦听串行端口,使用通过包含 directfb 的 c 扩展实现的 gui,我无法重现此异常,它们是不可预测的。
我在 python 中搜索了 EINTR 异常,但只发现 EINTR 只能发生在慢速系统调用和 python 的模块套接字、子进程和另一个已经是进程 EINTR 的情况下。那么在我的应用程序中会发生什么?为什么简单的数学函数调用可以随时中断程序,一点都不可靠。我只有建议:ulibc 错误、内核/硬件处理错误。但是这个建议并没有告诉我解决方案。
现在我围绕 os 模块中的一些函数创建了包装函数(在 EINTR 的情况下重新启动操作),但是包装数学模块会使执行时间增加 2 倍。还有一个问题:如果数学可以比其他模块也可以中断,那么如何获得可靠性?
PS我意识到库调用(例如对libm)不是系统调用,那么为什么我有“中断的系统调用”?