当前位置: 技术问答>linux和unix
将SIGCHLD设置为忽略,但又想调用wait,怎么办?
来源: 互联网 发布时间:2017-03-03
本文导语: 我的程序是一个网络服务程序,主进程在监听一个端口,收到新连接后,就fork一个子进程,由子进程处理这个连接、处理业务,父进程继续监听。 这个服务程序,对性能、并发的要求比较高,所以将在父进程里将SIG...
我的程序是一个网络服务程序,主进程在监听一个端口,收到新连接后,就fork一个子进程,由子进程处理这个连接、处理业务,父进程继续监听。
这个服务程序,对性能、并发的要求比较高,所以将在父进程里将SIGCHLD设置为忽略。
本来,这个方案没有什么问题,这个服务程序也用了很长时间,经受住了考验。
现在有新需求了,问题也来了:
在子进程处理的业务中,需要调用system函数,执行几个Shell命令;但是system函数的实现中就调用了wait函数(也可能是waitpid),因此每次调用system都会在终端输出一段话,大意是“已经将SIGCHLD设置为忽略,但是又调用了wait函数....”,更要命的是 这个systen调用导致子进程异常、退出。
请问,有什么方法避免上述情况呢?
这个服务程序,对性能、并发的要求比较高,所以将在父进程里将SIGCHLD设置为忽略。
本来,这个方案没有什么问题,这个服务程序也用了很长时间,经受住了考验。
现在有新需求了,问题也来了:
在子进程处理的业务中,需要调用system函数,执行几个Shell命令;但是system函数的实现中就调用了wait函数(也可能是waitpid),因此每次调用system都会在终端输出一段话,大意是“已经将SIGCHLD设置为忽略,但是又调用了wait函数....”,更要命的是 这个systen调用导致子进程异常、退出。
请问,有什么方法避免上述情况呢?
|
试试 pipe + fork + execve 吧,不知道行不行...
|
用 popen 或者 fork + exec 试试。
|
改需求真要命。
那你现在还必须SIGCHLD设置为忽略吗?如果是的话,那只能放弃system,改用fork+execl来处理。
那你现在还必须SIGCHLD设置为忽略吗?如果是的话,那只能放弃system,改用fork+execl来处理。