3

我在三星 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)不是系统调用,那么为什么我有“中断的系统调用”?

4

1 回答 1

0

EINTR他们在 0.9.30 中修复了线程和 uClibc (#4994) 中的一个旧错误。该修复已针对 pthreads 进行了测试,因此我将支持 tMC 的建议,以检查您在构建 uClibc 时如何配置线程。

您也可以尝试使用 malloc-simple 选项进行编译?它很慢,但是如果您的问题消失了,它也可能表明存在线程问题:

malloc-simple就像糖蜜一样简单而缓慢。它是为 uClibc 从头开始​​编写的,是最简单的(因此也是最小的)malloc 实现。

这仅使用mmap()系统调用来分配和释放内存,根本不使用brk()系统调用,使其成为内存非常有限的无 MMU 系统的不错选择。它 100% 符合标准、线程安全、非常小,并且会立即将释放的内存释放回操作系统,而不是将其保留在进程的堆中以进行重新分配。它也很慢。

于 2012-03-11T05:57:11.450 回答