首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python:数学和os模块中的函数被EINTR中断

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

Stack Overflow用户
提问于 2012-02-01 21:46:35
回答 1查看 343关注 0票数 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编写的,在一些神秘的情况下会引发以下异常:

1)异常:

代码语言:javascript
复制
 File "./dfbUtils.py", line 3209, in setItemData
ValueError: (4, 'Interrupted system call')

代码:

代码语言:javascript
复制
currentPage=int(math.floor(float(rowId)/self.pageSize))==self.selectedPage

2)异常:

代码语言:javascript
复制
File "./terminalGlobals.py", line 943, in getFirmawareName
OSError: [Errno 4] Interrupted system call: 'firmware'

代码:

代码语言:javascript
复制
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的调用)不是系统调用,那么为什么我有“中断的系统调用”?

EN

回答 1

Stack Overflow用户

发布于 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%符合标准,线程安全,非常小,并且立即释放释放的内存回操作系统,而不是将其保留在进程堆中以进行重新分配。它也非常慢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9096796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档