您的位置:程序门 -> c/c++ -> c++ 语言



50分问一个select的简单问题,可能只是概念有点混淆,快速结贴,可加上100分


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


50分问一个select的简单问题,可能只是概念有点混淆,快速结贴,可加上100分[已结贴,结贴人:shuchao]
发表于:2007-04-12 20:35:50 楼主
做一个监控服务器,有2个运行模式:
1.被动接受监控客户端传过来的监控指令,然后根据指令的不同调用不同的程序对本机的不同服务进行监控,然后返回监控结果。调用的方式通过fork子进程,然后再在子进程中EXEC就行。然后父子之间通过管道,由子写到标准输出,父通过管道接受标准输出。
2,定时调用本机所有服务的检查程序对所有服务检查一遍,然后向监控客户端返回监控结果。实际上同样也是fork子进程,然后再在子进程中EXEC。然后父子之间通过管道,由子写到标准输出,父通过管道接受标准输出。

现在不解的是,怎样用select实现主进程同时接受客户端tcp连接,又能接受子进程的管道的标准输出。现在考虑的是在服务器建好tcp   listen   socket时就用(因为要用select接受tcp连接),但是我只知道,当时如果有确定的描述符的话,用select很好做,但是当时只知道一个listen   socket,而管道那些都还不确定,难道select还可以在后面在逐渐添加描述符?那整个执行的框架是什么?有人能写个框架代码么?
搞定了100分没说的
发表于:2007-04-12 21:36:191楼 得分:0
如果熟悉   c++,用   ace   或者   libevent   好了。

socket   和   pipe   都是一个   int   型的   fd,用   fd_set   加入   fd_set   中,然后   select   就行了,没有区别。
发表于:2007-04-12 22:04:472楼 得分:0
监控服务器,,。
帮顶下
发表于:2007-04-12 22:13:453楼 得分:0
首先谢谢两位的回答,我用过select,但是现在问题是,当你调用select时,是在管道fd的数目都还不确定的情况下,因为此时没有连接,不知道EXEC什么程序,这种情况下怎么select呢?
发表于:2007-04-12 23:01:004楼 得分:50
什么时候   fork   子进程,必然是一个特定的时间点。在这一点时间上你的   select   必然不处于阻塞状态(除非是多线程,你可以选择在决定   fork   的线程中利用   raise   或者其他手段打断阻塞的   select),因此此时你可以创建管道,加入   fd_set,重新   select。

从宏观看问题可能很模糊,从细节分析就会清楚的。画时序图吧。
发表于:2007-04-13 09:05:055楼 得分:0
用ace启多线程做为不同的服务   根据接受的客户端要求run你的子线程     觉得应该可以实现的


快速检索

最新资讯
热门点击