system函数阻塞问题 讨论

justgg 2014-07-08 06:30:52
去年做了一个数据采集箱的项目。在调试过程中发现system函数容易出现阻塞,导致线程一直阻塞住。后来我单独写了一个main函数,来测试system函数。结果发现,system函数运行几十次到几千次后就可能会出现阻塞的情况。当时很费解,就自己实现了一个system函数(通过fork + execl 函数 实现),结果发现一样会出现阻塞的情况,后来跟踪后发现,问题出在fork函数。

按说调用fork 函数会返回两次,分别返回父进程 和 子进程。我出现的情况是,父进程正常返回子进程的pid号,但是子进程没有返回。fork函数只返回了一次。 然后父进程就阻塞在waitpid这个函数这里了。通过ps命令,可以看到子进程是已经建立了,kill 子进程的pid后,waitpid函数可以返回了。

我感觉像是fork函数出问题了,但是fork函数自己没法实现。

系统内核是2.6.24.
板子是arm平台的,主控是his3515.

这个问题到现在还困扰着我。后来实在没办法,我就结合alarm函数来处理了,用自己重写的system函数,执行的时候,同时设定好alarm的超时时间,由超时函数处理,时间超过了预设的超时时间,就把子进程的pid杀掉,再重新执行。毕竟出现连续阻塞的概率还是很低的。

现在这样虽然系统能够正常运行了,但终究觉得不怎么好,想弄明白到底什么原因导致的这个问题。

想问问这边牛人们,有没有碰到过类似的问题,你们如何处理的呢?谢谢!
...全文
2803 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jim138 2015-12-24
  • 打赏
  • 举报
回复
用HI3521,同样遇到了这样的问题,请问楼主,你的问题解决没有,system调用,ps子进程已经运行,但主进程一直阻塞无法退出。
9527 2014-07-10
  • 打赏
  • 举报
回复
问题就在于fork本身,如果你linux内核中vfork不是fork实现的,可以考虑自己用vfork写exec试试,也可以试试我上面说的堵塞SIGCHLD,如果你不在意system的返回值
loe 2014-07-09
  • 打赏
  • 举报
回复
没有遇到过这样问题system这个系统调用本身开销就比较大,试试popen函数试试
9527 2014-07-09
  • 打赏
  • 举报
回复
有遇到,也最终没有好的解决方法。 可以尝试屏蔽SIGCHLD试试
justgg 2014-07-09
  • 打赏
  • 举报
回复
系统资源是没问题的。确实popen一样的会出问题的。
mymtom 2014-07-09
  • 打赏
  • 举报
回复
是不是系统资源不够啊
mymtom 2014-07-09
  • 打赏
  • 举报
回复
引用 2 楼 mxgsgtc 的回复:
没有遇到过这样问题system这个系统调用本身开销就比较大,试试popen函数试试
popen一样用fork+exec啊

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧