我在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)不是系统调用,为什么我有“中断系统调用”?
答案 0 :(得分:0)
在uClibc(#4994)中有线程和EINTR
的旧错误,它们在0.9.30中修复。该修复程序是针对pthreads进行测试的,所以我会通过tMC来建议你在构建uClibc时检查你如何配置线程。
您还可以尝试使用malloc-simple选项进行编译吗?它很慢,但是如果你的问题消失了,也可能会提出线程问题:
malloc-simple
像糖蜜一样简单而缓慢。它 是从头开始为uClibc写的,是最简单的 (因此最小)malloc实现。这仅使用
mmap()
系统调用来分配和释放内存, 并且根本不使用brk()
系统调用,这样就可以了 选择内存非常有限的无MMU系统。这是100% 符合标准,线程安全,非常小,释放释放 内存回到操作系统,而不是保持在 进程的堆用于重新分配。它也很慢。