⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000001.htm

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -