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

[求救命!] 守护进程的一个问题
今天纠结了一天的一个问题,
在Linux上实现了一个服务端程序,用以响应网页端(Web)的请求。
但是客户要求启停该服务端需要使用一个运维程序来操作。
于是又需要编写一个运维程序,其中还包括一些端口监控,日志查看等内容。
而如果单说原来的服务端,服务端监听端口9000来处理网页端发送来的报文,同时在生命周期内会等待一个"X"的键盘输入来关闭。
例如:

Create Event Thread...
Send Msg to create TaskEventThread...
CreateTaskEvent:F001 send...
CreateTaskEvent:F00100000000--F001
CreateTaskEvent:L001 send...
CreateTaskEvent:L00100000000--L001
Input 'X' to ExitServer...

如上,而运维程序启停服务端的界面如下:

*****进程操作(后台)*********************
**输入R=Replay(刷新), X=Exit(退出)
****************************************
主程序当前状态:

  是否运行:
          尚未运行


----------------------------------------
S: 启动服务端主程序
Q: 退出进程操作
>>

为了"即使运维程序关闭,也不影响服务端的运行"的效果,于是做法如下:

在输入"S"的时候,运维程序(进程A)使用fork创建一个子进程(进程B)
子进程(进程B)中再使用fork来创建一个守护进程(进程C)
守护进程(进程C)来启动服务端程序,
同时由于守护进程的特性,进程B会终结
而这不影响用户继续使用运维程序(进程A)来进行别的例如监控或者日志查看的操作。

本来是一目了然的情况,但是却出现了令人费解的地方
以上述的方式启动的服务端程序
使用ps -e | grep 命令可以看到进程已经启动,并且与终端无关(守护进程)
使用netstat -anp | grep 命令也可以看到进程在监听9000端口
按说应该没有任何问题,但是实际情况是
A:网页端发送的报文(Request),服务端可以收到
B:服务端处理报文一切正常
C:服务端返回处理结果报文(Result)
D:(关键在这里)从服务端日志来看,其发送出去的"处理结果报文"一切正常,但是实际上网页端接收到的却是一些乱七八糟的东西,里面甚至有网页端曾经发送过去的Request报文,导致网页端无法解析报文!


而另一个情况是,如果不使用守护进程的办法,例如直接在用户需要启动服务端的时候
调用system("/home/user/server.exe")函数来启动服务端程序
这样做的结果会导致运维程序的界面跳转到服务端等待"X"输入的界面, 
也就是说启动了服务端之后除了输一个"X"来关闭服务端从而回到运维程序以外别的什么都做不了


但是使用这个办法的话,服务端响应报文却是正常的!!

情况就是上面这样,觉得似乎就是守护进程引起的问题,但是了解的十分有限,望各位大神拉小弟一把
性命攸关啊性命攸关
------解决方案--------------------
这个貌似和守护进程没关系吧,netstat 你查看的只有守护在监听9000吗?