僵死进程问题...
在做一个服务器程序,要求每秒能接受很多的并发连接
我的处理方式是:主进程LISTEN,ACCEPT后FORK子进程进行处理,主进程继续LISTEN
问题是服务器主进程要一直运行,以保证监听,
这样它FORK的子进程运行结束后,会变成僵死进程
试过的处理方式
1.主进程WAIT,WAITPID....问题是这种方法会使主进程阻塞,使服务器监听效率大大降低
2.signal(SIGCHLD,SIG_IGN)...不大起作用
3.<UNIX高级编程>中的双FORK方法...还是不起作用
我用的REDHAT9.0,VIRTUAL PC虚拟机
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
双 fork(),没有同时运行 strace 吧?
waitpid只是在响应子进程退出的信号的时候调用就可以了
至少,waitpid可以不阻塞调用
知之为知之,不知为不知,在自己还没有明白之前,请不要误导别人
创建子进程后,在子进程中关闭倾听套接字,父进程关闭连接套接字
然后子进程自己exit就行了
不会的,只要子进程使用exit()调用退出就行。记住和父进程有关的所有描述符都必须关闭。
你是怎么结束子进程的阿?
如果用exit(0),我想可能发生僵死,你改用_exit(0);
因为如果用exit(0)的话父进程也会被杀掉,这样就会出现僵死,但用_exit(0)就只杀掉子进程而不会杀掉父进程。
你试一试。
还有你用信号的话,SIG_IGN是父进程忽略此信号,所以还是会发生僵死的,你可以写一个函数扑捉此信号然后处理它,使父进程不会因此而中止而导致其他子进程僵死。