我在三星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编写的,在一些神秘的情况下会引发以下异常:
1)异常:
File "./dfbUtils.py", line 3209, in setItemData
ValueError: (4, 'Interrupted system call')代码:
currentPage=int(math.floor(float(rowId)/self.pageSize))==self.selectedPage2)异常:
File "./terminalGlobals.py", line 943, in getFirmawareName
OSError: [Errno 4] Interrupted system call: 'firmware'代码:
for fileName in os.listdir('firmware'):关于app的一些信息:它有3-7个线程,通过“串行”模块监听串口,使用通过封装directfb的c扩展实现的gui,我不能重现这种异常,它们是不可预测的。
我在谷歌上搜索了python中的EINTR异常,但只发现EINTR只能在缓慢的系统调用和python的模块套接字、子进程和另一个进程EINTR上发生。那么在我的应用程序中会发生什么呢?为什么简单的数学函数调用可以随时中断程序,这是完全不可靠的。我只有一些建议: ulibc bug,kernel/hw处理bug。但是这些建议并没有给我提供解决方案。
现在我在os模块的一些函数周围创建了包装函数(在EINTR的情况下重新启动操作),但是包装数学模块会增加2倍的执行时间。这里还有另一个问题:如果数学可以比其他模块更好地中断,那么如何获得可靠性?
附注:我意识到库调用(例如对libm的调用)不是系统调用,那么为什么我有“中断的系统调用”?
发布于 2012-03-11 13:57:11
uClibc (#4994)中的线程和EINTR有一个老的bug,他们在0.9.30中修复了这个bug。这个修复是针对uClibc进行测试的,因此我赞同tMC的建议,即在构建pthread时检查您是如何配置线程的。
您还可以尝试使用malloc-simple选项进行编译?它很慢,但是如果你的问题消失了,它可能也会暗示线程问题:
malloc-simple非常简单,像糖浆一样慢。它是为uClibc从头开始编写的,是最简单的(因此也是最小的) malloc实现。
它只使用mmap()系统调用来分配和释放内存,而根本不使用brk()系统调用,因此对于内存非常有限的无内存系统来说,它是一个很好的选择。它100%符合标准,线程安全,非常小,并且立即释放释放的内存回操作系统,而不是将其保留在进程堆中以进行重新分配。它也非常慢。
https://stackoverflow.com/questions/9096796
复制相似问题