做了一个数据采集箱的项目。在调试过程中发现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杀掉,再重新执行。毕竟出现连续阻塞的概率还是很低的。
现在这样虽然系统能够正常运行了,但终究觉得不怎么好,想弄明白到底什么原因导致的这个问题。
没有遇到过这样问题system这个系统调用本身开销就比较大,试试popen函数试试
问题就在于fork本身,如果你linux内核中vfork不是fork实现的,可以考虑自己用vfork写exec试试,也可以试试我上面说的堵塞SIGCHLD,如果你不在意system的返回值
用HI3521,同样遇到了这样的问题,请问楼主,你的问题解决没有,system调用,ps子进程已经运行,但主进程一直阻塞无法退出