📄 00000001.htm
字号:
从同一个地方跑下去... 两者间唯一不同, 就是 fork() 的 return <BR> value... 所以你可以看到上面的这段 example, 是跟据 return value <BR> 来判断这是个 child process 或是 parent process.. <BR> <BR> <BR>><I> -------------------------------------------------------------------------- < </I><BR> <BR>发信人: <A HREF="mailto:LFalcon.bbs@cis.nctu.edu.tw">LFalcon.bbs@cis.nctu.edu.tw</A> (笨鸟), 看板: programming <BR>标 题: Re: Multi-Client communication! <BR>发信站: 交大资科_BBS (Thu May 16 21:51:34 1996) <BR>转信站: maple!news.ee.nthu!news.cis.nctu!cis_nctu <BR> <BR> 谢谢高手们的指导!如今我已经知道何谓forking了,但是实际在 <BR>使用fork()来做concurrent server时(socket-based IPC),发现会有 <BR> <zombie> 的产生!说明一下,我写了部份程式如下: <BR> : <BR> slave_sd=accept(msd, NULL, NULL); <BR> if ((child=fork())==-1) { <BR> perror("fork"); <BR> exit(-1); <BR> } <BR> if (child) { <BR> : <BR> read(slave_sd, buf, BUFSIZ); <- 对client做读的动作 <BR> : <BR> write(slave_sd, buf, sizeof(buf)); <-对client做写的动作 <BR> : /* 中途client停止对本 server写入 */ <BR> close(slave_sd); <BR> exit(0); <BR> } <BR> <BR> 结果,等client那边停止送讯息给server後,以 ps 来看,竟产生zombie。 <BR>是不是能请先进解释一下,可谓zombie? <BR> <BR> <BR>><I> -------------------------------------------------------------------------- < </I><BR> <BR>发信人: <A HREF="mailto:jackie.bbs@cis.nctu.edu.tw">jackie.bbs@cis.nctu.edu.tw</A> (狗脸岁月), 看板: programming <BR>标 题: Re: Multi-Client communication! <BR>发信站: 交大资科_BBS (Thu May 16 23:02:34 1996) <BR>转信站: maple!news.ee.nthu!news.cis.nctu!cis_nctu <BR> <BR>==> 在 LFalcon@cis_nctu (笨鸟) 的文章中提到: <BR>><I> 谢谢高手们的指导!如今我已经知道何谓forking了,但是实际在 </I><BR>><I> 使用fork()来做concurrent server时(socket-based IPC),发现会有 </I><BR>><I> <zombie> 的产生!说明一下,我写了部份程式如下: </I><BR>><I> : </I><BR>><I> slave_sd=accept(msd, NULL, NULL); </I><BR>><I> if ((child=fork())==-1) { </I><BR>><I> perror("fork"); </I><BR>><I> exit(-1); </I><BR>><I> } </I><BR>><I> if (child) { </I><BR>><I> : </I><BR>><I> read(slave_sd, buf, BUFSIZ); <- 对client做读的动作 </I><BR>><I> : </I><BR>><I> write(slave_sd, buf, sizeof(buf)); <-对client做写的动作 </I><BR>><I> : /* 中途client停止对本 server写入 */ </I><BR>><I> close(slave_sd); </I><BR>><I> exit(0); </I><BR>><I> } </I><BR>><I> 结果,等client那边停止送讯息给server後,以 ps 来看,竟产生zombie。 </I><BR>><I> 是不是能请先进解释一下,可谓zombie? </I><BR> <BR> 所谓 zombie process 就是 child process 比 parent process 先 <BR> "死掉", 而parent 还未替它收□(即wait). 所以你用 ps 会看到 child <BR> process 的□体, 它本身也会占用一些 resource, 所以解决的方法是 <BR> 你可以fork() 2个以上的 child processes来处理要做的事, 而把parent <BR> process结束掉. 这样child processes 就会被system 的 init process <BR> (pid=1) 接管, 就不会有你说的那些问题了. <BR> <BR> <BR> <BR> <BR>><I> -------------------------------------------------------------------------- < </I><BR> <BR>发信人: <A HREF="mailto:LFalcon.bbs@cis.nctu.edu.tw">LFalcon.bbs@cis.nctu.edu.tw</A> (笨鸟), 看板: programming <BR>标 题: Re: Multi-Client communication! <BR>发信站: 交大资科_BBS (Thu May 16 23:29:40 1996) <BR>转信站: maple!news.ee.nthu!news.cis.nctu!cis_nctu <BR> <BR>==> 在 jackie@cis_nctu (狗脸岁月) 的文章中提到: <BR>><I> 所谓 zombie process 就是 child process 比 parent process 先 </I><BR>><I> "死掉", 而parent 还未替它收□(即wait). 所以你用 ps 会看到 child </I><BR> ^^^^^^^ <BR> 如果说在我的parent process中使用wait(),应该是会造成 <BR>Blocking吧!而不把child process结束掉,又会占据resource。此时 <BR>在两难的情况之下,使用原parent当server便显得没有效率。 <BR> 据jackie兄你所说,在child process中加入另一个fork(), <BR>如此的话是不是原parent的service便无法发挥了?有没有办法可 <BR>以在不结束parent的情况下,判断child是否已结束了,然後再将 <BR>此结束的child process kill掉,且在该「判断」中能作到Non-blocking? <BR> <BR> <BR> <BR>><I> -------------------------------------------------------------------------- < </I><BR> <BR>发信人: <A HREF="mailto:LFalcon.bbs@cis.nctu.edu.tw">LFalcon.bbs@cis.nctu.edu.tw</A> (笨鸟), 看板: programming <BR>标 题: Re: Multi-Client communication! <BR>发信站: 交大资科_BBS (Thu May 16 23:51:13 1996) <BR>转信站: maple!news.ee.nthu!news.cis.nctu!cis_nctu <BR> <BR>==> 在 Chicken@cis_nctu (无敌喷饭鸡) 的文章中提到: <BR>><I> if (child) { </I><BR>><I> > : </I><BR>><I> > read(slave_sd, buf, BUFSIZ); <- 对client做读的动作 </I><BR>><I> > : </I><BR>><I> > write(slave_sd, buf, sizeof(buf)); <-对client做写的动作 </I><BR>><I> > : /* 中途client停止对本 server写入 */ </I><BR>><I> > close(slave_sd); </I><BR>><I> > exit(0); </I><BR>><I> > } </I><BR>><I> 我想你是 if (child) 这行写错了... 我猜你要的应该是 if (!child) .. </I><BR>><I> 不过只看片断, 我也不大确定就是了. 先跟你讲什麽是 zombie... </I><BR> 喔!对不起,是写错了!应该是 if (!child) {...} <BR> 对!现在所使用的就是client专门作r/w,而由server来做select的动作。 <BR>而对於产生zombie时,我所遇到的问题...就贴在上一封罗! <BR> <BR> <BR>><I> -------------------------------------------------------------------------- < </I><BR> <BR>发信人: <A HREF="mailto:jackie.bbs@cis.nctu.edu.tw">jackie.bbs@cis.nctu.edu.tw</A> (狗脸岁月), 看板: programming <BR>标 题: Re: Multi-Client communication! <BR>发信站: 交大资科_BBS (Fri May 17 02:24:18 1996) <BR>转信站: maple!news.ee.nthu!news.cis.nctu!cis_nctu <BR> <BR>==> 在 LFalcon@cis_nctu (笨鸟) 的文章中提到: <BR>><I> ==> 在 jackie@cis_nctu (狗脸岁月) 的文章中提到: </I><BR>><I> > 所谓 zombie process 就是 child process 比 parent process 先 </I><BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -