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

我有三星SoC s3c6410(ARM11)上的Linux板。 我使用buildroot构buildrootfs: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 conditons提出这个例外:

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线程,通过“串行”模块监听串行端口,使用gui实现通过c扩展包裹directfb,我不能再现这个例外,他们是不可预知的。

我在Python中searchEINTRexception,但只发现EINTR只能在缓慢的系统调用和python的模块套接字,subprocess中发生,而另一个已经处理EINTR。 那么我的应用程序会发生什么? 为什么简单的math函数调用可以随时中断程序,一点也不可靠。 我只有build议:ulibc错误,kernel / hw处理错误。 但是这个build议并没有给我解决scheme。

现在我在os模块的某些函数的周围创build了包装函数(在EINTR的情况下重新启动opertion),但是包装math模块会增加2次执行时间。 还有另外一个问题:如果math可以互相比较其他模块也可以和如何得到可靠性?

PS我意识到库调用(以libm为例)不是系统调用,所以为什么我有“中断系统调用”?

在uClibc(#4994)中有一个线程和EINTR的旧bug,它们在0.9.30中被修正。 该修补程序是针对pthreads进行测试的,所以我会通过tMC来检查建立uClibc时如何配置线程的建议。

你也可以尝试使用malloc-simple选项编译? 这很慢,但如果你的问题消失了,它也可能暗示了线程问题:

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

这只使用mmap()系统调用来分配和释放内存,并且完全不使用brk()系统调用,因此对于内存非常有限的无MMU系统来说,这是一个很好的选择。 它符合100%标准, 线程安全 ,非常小,并将释放的内存立即释放回操作系统,而不是将其保留在进程的重新分配堆中。 这也是非常缓慢。