python:来自math和os模块的函数被EINTR中断

时间:2012-02-01 13:46:35

标签: python linux operating-system arm eintr

我在samsung 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'):

有关app的一些信息:它有3-7个线程,通过'serial'模块监听串口,使用gui实现通过c扩展包装directfb,我无法重现这个异常,它们是不可预测的。

我在python中搜索了EINTR异常,但只发现EINTR只能在慢速系统调用和python的模块socket,subprocess和另一个已经处理EINTR时发生。那我的应用程序会发生什么?为什么简单的数学函数调用可以随时中断程序,它根本不可靠。我只有建议:ulibc bug,kernel / hw处理bug。但这个建议并没有向我展示解决方案。

现在我在os模块的某些函数周围创建了wrap函数(在EINTR的情况下重启opertion),但是包装数学模块会增加执行时间2次。还有一个问题:如果数学可以比其他模块干预也可以以及如何获得可靠性?

P.S。我意识到库调用(例如libm)不是系统调用,为什么我有“中断系统调用”?

1 个答案:

答案 0 :(得分:0)

在uClibc(#4994)中有线程和EINTR的旧错误,它们在0.9.30中修复。该修复程序是针对pthreads进行测试的,所以我会通过tMC来建议你在构建uClibc时检查你如何配置线程。

您还可以尝试使用malloc-simple选项进行编译吗?它很慢,但是如果你的问题消失了,也可能会提出线程问题:

  

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

     

这仅使用mmap()系统调用来分配和释放内存,         并且根本不使用brk()系统调用,这样就可以了         选择内存非常有限的无MMU系统。这是100%         符合标准,线程安全,非常小,释放释放         内存回到操作系统,而不是保持在         进程的堆用于重新分配。它也很慢。