当前位置: 技术问答>linux和unix
守护进程和fork()以及管道通信的结合
来源: 互联网 发布时间:2016-06-05
本文导语: 描述得有点长,希望大家耐心地看完。。。 有这么一个结构: 进程A:调用了daemon()函数,脱壳成为守护进程。 然后调用fork()函数,执行execlp()开启一子进程B。此时父进程即A本身并没有退出,而是通过管...
描述得有点长,希望大家耐心地看完。。。
有这么一个结构:
进程A:调用了daemon()函数,脱壳成为守护进程。
然后调用fork()函数,执行execlp()开启一子进程B。此时父进程即A本身并没有退出,而是通过管道与子进程B通信(心跳检测)。
子进程B:随便一个可以长久运行的独立程序。其中包含了管道通信模块,即程序一旦开启,立即通过管道取得与进程A的通信。
实际上这个结构的目的就是:通过A来监控B。
现在的问题是:
单独运行A,即调用daemon()后,不调用fork(),execlp()开启子进程B.CPU利用率正常。
单独运行B,即不通过A来开启B。B的本身没有问题,正常。CPU利用率 2%左右。
通过A开启B,并通过管道通信。CPU利用率达100%!!!!
去除管道通信模块,即单纯地利用A开启B,CPU利用率仍100%!!!
A中去除daemon()函数,即以普通程序形态开启B,CPU利用率正常!添加管道通信模块也没什么影响。
先开启A程序(精灵形态,即包含daemon()函数),并开启通信模块。单独运行B,开启通信模块与A取得通信。CPU利用率也正常!
我是不是可以得出:在A的精灵形态中开启子进程B是有问题的(至少表现是这样!)
难道在一个精灵形态的进程中利用fork()开启另外一个子程序,对这个子进程有什么特别限制???因为A的精灵形态中开启另外一个子进程C却没这个问题!
谁能救救我????崩溃了都
有这么一个结构:
进程A:调用了daemon()函数,脱壳成为守护进程。
然后调用fork()函数,执行execlp()开启一子进程B。此时父进程即A本身并没有退出,而是通过管道与子进程B通信(心跳检测)。
子进程B:随便一个可以长久运行的独立程序。其中包含了管道通信模块,即程序一旦开启,立即通过管道取得与进程A的通信。
实际上这个结构的目的就是:通过A来监控B。
现在的问题是:
单独运行A,即调用daemon()后,不调用fork(),execlp()开启子进程B.CPU利用率正常。
单独运行B,即不通过A来开启B。B的本身没有问题,正常。CPU利用率 2%左右。
通过A开启B,并通过管道通信。CPU利用率达100%!!!!
去除管道通信模块,即单纯地利用A开启B,CPU利用率仍100%!!!
A中去除daemon()函数,即以普通程序形态开启B,CPU利用率正常!添加管道通信模块也没什么影响。
先开启A程序(精灵形态,即包含daemon()函数),并开启通信模块。单独运行B,开启通信模块与A取得通信。CPU利用率也正常!
我是不是可以得出:在A的精灵形态中开启子进程B是有问题的(至少表现是这样!)
难道在一个精灵形态的进程中利用fork()开启另外一个子程序,对这个子进程有什么特别限制???因为A的精灵形态中开启另外一个子进程C却没这个问题!
谁能救救我????崩溃了都
|
把代码贴上来...
|
顶
关注
关注
|
楼主,换个顺序看下。
先fork出B,然后再使A成为守护进程。
先fork出B,然后再使A成为守护进程。
|
你程序B的log打印到什么地方去了?
|
楼主就是想AB都是守护进程吧?
|
你还不如用Socket来通信算了
|
用WAITPID的方式也可以吧,用管道写的是不是有点复杂了?
把代码拿来看看嘛
把代码拿来看看嘛
|
那你还顺序测了没?用管道通信就可以实现了啊
|
我估计楼主管道未设置正确,导致管道出现死循环,以至CPU100%。本人曾写过相似的守护进程,在进程里调用Java虚拟机,并通过管道来通讯。
|
strace跟一下试试。