📄 00000001.htm
字号:
><I> > "死掉", 而parent 还未替它收□(即wait). 所以你用 ps 会看到 child </I><BR>><I> ^^^^^^^ </I><BR>><I> 如果说在我的parent process中使用wait(),应该是会造成 </I><BR>><I> Blocking吧!而不把child process结束掉,又会占据resource。此时 </I><BR>><I> 在两难的情况之下,使用原parent当server便显得没有效率。 </I><BR>><I> 据jackie兄你所说,在child process中加入另一个fork(), </I><BR>><I> 如此的话是不是原parent的service便无法发挥了?有没有办法可 </I><BR>><I> 以在不结束parent的情况下,判断child是否已结束了,然後再将 </I><BR>><I> 此结束的child process kill掉,且在该「判断」中能作到Non-blocking? </I><BR> <BR> 一般我们写daemon有下面几个steps: <BR> <BR> 1. call fork() and have the parent exit. <BR> ^^^^^^^^^^^^^ <BR> <BR> 2. setsid() to create a new session. <BR> <BR> 3. chdir("/") . <BR> <BR> 4. set the file mode creation mask to 0. <BR> <BR> 5. unneeded file descriptors should be closed. <BR> <BR> step 1 & 2 就是跟 process group and session 有关, <BR> 我们把parent结束掉, 然後产生一个新的process group, <BR> 而某个child process 就变成该新的 process group leader, <BR> session leader, 并且不受 terminal的控制. 其时这时候这个 <BR> leader才是我们所要用的server, 它负责 dispatch tasks. <BR> 原来那个parent只是做一些initial 动作而以,不干正事的. <BR> <BR> 详细情况你可参考 "Advanced programming in the UNIX environment" <BR> chapter 13 p.419. <BR> <BR> <BR>><I> -------------------------------------------------------------------------- < </I><BR> <BR>发信人: <A HREF="mailto:Thinker.bbs@bbs.yzit.edu.tw">Thinker.bbs@bbs.yzit.edu.tw</A> (我狂 我笑 我傲 *), 看板: programming <BR>标 题: Re: Multi-Client communication! <BR>发信站: 元智工学院风之塔BBS (Fri May 17 13:03:14 1996) <BR>转信站: maple!news.ee.nthu!news.cis.nctu!news.cc.nctu!news.ncu!news.yzit!yzit_ <BR> <BR>狗脸岁月 (<A HREF="mailto:jackie.bbs@cis.nctu.edu.tw)">jackie.bbs@cis.nctu.edu.tw)</A> 提到: <BR>∶<I> ==> 在 LFalcon@cis_nctu (笨鸟) 的文章中提到: </I><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>∶<I> 所谓 zombie process 就是 child process 比 parent process 先 </I><BR>∶<I> "死掉", 而parent 还未替它收□(即wait). 所以你用 ps 会看到 child </I><BR>∶<I> process 的□体, 它本身也会占用一些 resource, 所以解决的方法是 </I><BR>∶<I> 你可以fork() 2个以上的 child processes来处理要做的事, 而把parent </I><BR>∶<I> process结束掉. 这样child processes 就会被system 的 init process </I><BR>∶<I> (pid=1) 接管, 就不会有你说的那些问题了. </I><BR>这样的方法不是很好, 如果还 fork 新的 process 时, 不就又要重复一次.... <BR>比较好的方法是去 catch SIGCHLD ..... <BR>当一个 child process 结束时, 会进入 zombie 的状态.... <BR>这时侯就是 child status 改变了, 在进入 zombie 後, child process 会产生 <BR>SIGCHLD 的 signal ....... <BR>所以你只要 catch 这个 signal 了, 就可以知道有任何一个 child 的 status 改变了.. <BR>这时, 你只要在 catching function 中, 叫用 wait3 就可以知道是发生什麽事了... <BR>并且会消除 zombie .... <BR>如果不知道我所说的这个 system call 要怎麽用, 同样建议你去找找 <BR>Advanced Programming in the UNIX Environment <BR> <BR> <BR>><I> -------------------------------------------------------------------------- < </I><BR> <BR>发信人: <A HREF="mailto:LFalcon.bbs@bbs.secc.fju.edu.tw">LFalcon.bbs@bbs.secc.fju.edu.tw</A> (笨鸟), 看板: programming <BR>标 题: Re: Multi-Client communication! <BR>发信站: 辅大美少女梦工场 BBS 站 (Fri May 17 18:33:53 1996) <BR>转信站: maple!news.ee.nthu!thccx4!news.cc.nctu!spring!aidebbs!info.svd.fju!fju <BR> <BR>【 在 <A HREF="mailto:Thinker.bbs@bbs.yzit">Thinker.bbs@bbs.yzit</A> (我狂 我笑 我傲 *) 的大作中提到: 】 <BR>∶<I> 这样的方法不是很好, 如果还 fork 新的 process 时, 不就又要重复一次.... </I><BR>∶<I> 比较好的方法是去 catch SIGCHLD ..... </I><BR> ^^^^^^^^^^^^^^^^^^那我的parent process要如何 <BR>去得到那个signal呢?喔! 对了,我希望此时parent process能够处 <BR>於non-blocking 的状态。 <BR> <BR> <BR> <BR> <BR>><I> -------------------------------------------------------------------------- < </I><BR> <BR>发信人: <A HREF="mailto:Thinker.bbs@bbs.yzit.edu.tw">Thinker.bbs@bbs.yzit.edu.tw</A> (我狂 我笑 我傲 *), 看板: programming <BR>标 题: Re: Multi-Client communication! <BR>发信站: 元智工学院风之塔BBS (Sat May 18 07:20:49 1996) <BR>转信站: maple!news.ee.nthu!news.csie.nctu!news.cc.nctu!news.Edu.TW!news.ncu!ne <BR> <BR>笨鸟 (<A HREF="mailto:LFalcon.bbs@bbs.secc.fju.edu.tw)">LFalcon.bbs@bbs.secc.fju.edu.tw)</A> 提到: <BR>∶<I> 【 在 <A HREF="mailto:Thinker.bbs@bbs.yzit">Thinker.bbs@bbs.yzit</A> (我狂 我笑 我傲 *) 的大作中提到: 】 </I><BR>∶<I> : 这样的方法不是很好, 如果还 fork 新的 process 时, 不就又要重复一次.... </I><BR>∶<I> : 比较好的方法是去 catch SIGCHLD ..... </I><BR>∶<I> ^^^^^^^^^^^^^^^^^^那我的parent process要如何 </I><BR>∶<I> 去得到那个signal呢?喔! 对了,我希望此时parent process能够处 </I><BR>∶<I> 於non-blocking 的状态。 </I><BR>如何去 caught , 去查查我提到的那本书会有详细的资料..... <BR>当你 caught 之後, 如果你的 catching function 被执行的话... <BR>代表你己有 child process 的 status 改变了, 例如变成 zombie .... <BR>所以你只要呼叫 wait or wait3 之类的... 就会立刻传回 exit code or status .. <BR>不会造成 block 的情形... <BR> <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -