日期:2014-05-16  浏览次数:20660 次

将SIGCHLD设置为忽略,但又想调用wait,怎么办?
我的程序是一个网络服务程序,主进程在监听一个端口,收到新连接后,就fork一个子进程,由子进程处理这个连接、处理业务,父进程继续监听。

这个服务程序,对性能、并发的要求比较高,所以将在父进程里将SIGCHLD设置为忽略。

本来,这个方案没有什么问题,这个服务程序也用了很长时间,经受住了考验。

现在有新需求了,问题也来了:
在子进程处理的业务中,需要调用system函数,执行几个Shell命令;但是system函数的实现中就调用了wait函数(也可能是waitpid),因此每次调用system都会在终端输出一段话,大意是“已经将SIGCHLD设置为忽略,但是又调用了wait函数....”,更要命的是 这个systen调用导致子进程异常、退出。

请问,有什么方法避免上述情况呢?

------解决方案--------------------
试试 pipe + fork + execve 吧,不知道行不行...
------解决方案--------------------
用 popen 或者 fork + exec 试试。
------解决方案--------------------
改需求真要命。

那你现在还必须SIGCHLD设置为忽略吗?如果是的话,那只能放弃system,改用fork+execl来处理。