Linux 版 (精华区)

发信人: netiscpu (夜☆星光点点☆), 信区: Linux
标  题: ◇ Fork  观念□清 II
发信站: 紫 丁 香 (Sun Nov  8 17:50:34 1998), 转信


寄信人: guest.bbs@hgluo.hust.edu.cn 
标  题: ◇ Fork  观念□清 II
发信站: 华南理工大学 BBS木棉站
日  期: Thu Feb 20 14:20:06 1997

注:
        以下文章转载自 bbs.ee.nthu programming 板精华区
> ========================================================================= <

发信人: LFalcon.bbs@bbs.secc.fju.edu.tw (笨鸟), 看板: programming
标  题: Multi-Client communication!
发信站: 辅大美少女梦工场 BBS 站 (Wed May 15 21:34:59 1996)
转信站: maple!news.ee.nthu!thccx4!news.cc.nctu!spring!aidebbs!info.svd.fju!fju

  目前正在发展Multi-Client Single-Server的communication
的网路程式。是以Socket-Based IPC来做的。但是对於
此种Multi-Client的作法正在抉择是要使用Single-Process Concurrent-Server
来做,或者是使用forking的方式来做。
  想请问一下各位先进:若要使用forking 的方式来做时,即fork(),
那麽所产生出来的child process是不是从程式的起点来执行?而对於
forking而言,是否可解释成Multi-Client vs Multi-Server?


> -------------------------------------------------------------------------- <

发信人: Chicken.bbs@cis.nctu.edu.tw (无敌喷饭鸡), 看板: programming
标  题: Re: Multi-Client communication!
发信站: 交大资科_BBS (Wed May 15 21:44:47 1996)
转信站: maple!news.ee.nthu!news.cis.nctu!cis_nctu

>   想请问一下各位先进:若要使用forking 的方式来做时,即fork(),
> 那麽所产生出来的child process是不是从程式的起点来执行?而对於
> forking而言,是否可解释成Multi-Client vs Multi-Server?

        不是... 是从你执行 fork() 的这个地方, 分成两个 process 同时
        并行...

        multi-server? 我想不算吧! 你 fork 出来的目的, 应该只是想和
        你的 client 建立一个专属的 TCP Link 吧! 每个 fork 出来的 process
        还是得靠 ipc 互相沟通, 这样仍然算是一个 server ..


> -------------------------------------------------------------------------- <

发信人: LFalcon.bbs@cis.nctu.edu.tw (笨鸟), 看板: programming
标  题: Re: Multi-Client communication!
发信站: 交大资科_BBS (Thu May 16 13:05:25 1996)
转信站: maple!news.ee.nthu!news.cis.nctu!cis_nctu

==> 在 Chicken@cis_nctu (无敌喷饭鸡) 的文章中提到:
> >   想请问一下各位先进:若要使用forking 的方式来做时,即fork(),
> > 那麽所产生出来的child process是不是从程式的起点来执行?而对於
> > forking而言,是否可解释成Multi-Client vs Multi-Server?
>         不是... 是从你执行 fork() 的这个地方, 分成两个 process 同时
>         并行...
        ^^^^^^^^那以以下这个程式来看呢?

                :
        if ((pid=fork())<0) {
                perror("fork");
                exit(-1);
        }
        do {
                :
                :
        } while(TRUE);

  是不是说child process建立出来之後,此child proc. 便会从 do-loop
这里做起呢?


> -------------------------------------------------------------------------- <

发信人: jackie.bbs@cis.nctu.edu.tw (狗脸岁月), 看板: programming
标  题: Re: Multi-Client communication!
发信站: 交大资科_BBS (Thu May 16 14:13:16 1996)
转信站: maple!news.ee.nthu!news.cis.nctu!cis_nctu

==> 在 LFalcon@cis_nctu (笨鸟) 的文章中提到:
> ==> 在 Chicken@cis_nctu (无敌喷饭鸡) 的文章中提到:
> >         不是... 是从你执行 fork() 的这个地方, 分成两个 process 同时
> >         并行...
>         ^^^^^^^^那以以下这个程式来看呢?
>                 :
>         if ((pid=fork())<0) {
>                 perror("fork");
>                 exit(-1);
>         }
>         do {
>                 :
>                 :
>         } while(TRUE);
>   是不是说child process建立出来之後,此child proc. 便会从 do-loop
> 这里做起呢?

        child process id > 0 , return value分别为
        parent 收到 child pid, 而child process 收到 0,
        所以 parent & child 都执行 do-while.


> -------------------------------------------------------------------------- <

发信人: Chicken.bbs@cis.nctu.edu.tw (无敌喷饭鸡), 看板: programming
标  题: Re: Multi-Client communication!
发信站: 交大资科_BBS (Thu May 16 15:18:42 1996)
转信站: maple!news.ee.nthu!news.cis.nctu!cis_nctu

> >         不是... 是从你执行 fork() 的这个地方, 分成两个 process 同时
> >         并行...
>         ^^^^^^^^那以以下这个程式来看呢?
>                 :
>         if ((pid=fork())<0) {
>                 perror("fork");
>                 exit(-1);
>         }
>         do {
>                 :
>                 :
>         } while(TRUE);
>   是不是说child process建立出来之後,此child proc. 便会从 do-loop
> 这里做起呢?

        不是... 你 call fork() 之後, 就已经分出一个 child process 了..
        child 会从 fork() return 的地方开始跑下去... parent 也是接著
        从同一个地方跑下去... 两者间唯一不同, 就是 fork() 的 return
        value... 所以你可以看到上面的这段 example, 是跟据 return value
        来判断这是个 child process 或是 parent process..


> -------------------------------------------------------------------------- <

发信人: LFalcon.bbs@cis.nctu.edu.tw (笨鸟), 看板: programming
标  题: Re: Multi-Client communication!
发信站: 交大资科_BBS (Thu May 16 21:51:34 1996)
转信站: maple!news.ee.nthu!news.cis.nctu!cis_nctu

    谢谢高手们的指导!如今我已经知道何谓forking了,但是实际在
使用fork()来做concurrent server时(socket-based IPC),发现会有
        <zombie> 的产生!说明一下,我写了部份程式如下:
                :
        slave_sd=accept(msd, NULL, NULL);
        if ((child=fork())==-1) {
                perror("fork");
                exit(-1);
        }
        if (child) {
                :
                read(slave_sd, buf, BUFSIZ);    <- 对client做读的动作
                :
                write(slave_sd, buf, sizeof(buf)); <-对client做写的动作
                :                  /* 中途client停止对本 server写入 */
           close(slave_sd);
           exit(0);
       }

    结果,等client那边停止送讯息给server後,以 ps 来看,竟产生zombie。
是不是能请先进解释一下,可谓zombie?


> -------------------------------------------------------------------------- <

发信人: jackie.bbs@cis.nctu.edu.tw (狗脸岁月), 看板: programming
标  题: Re: Multi-Client communication!
发信站: 交大资科_BBS (Thu May 16 23:02:34 1996)
转信站: maple!news.ee.nthu!news.cis.nctu!cis_nctu

==> 在 LFalcon@cis_nctu (笨鸟) 的文章中提到:
>     谢谢高手们的指导!如今我已经知道何谓forking了,但是实际在
> 使用fork()来做concurrent server时(socket-based IPC),发现会有
>         <zombie> 的产生!说明一下,我写了部份程式如下:
>                 :
>         slave_sd=accept(msd, NULL, NULL);
>         if ((child=fork())==-1) {
>                 perror("fork");
>                 exit(-1);
>         }
>         if (child) {
>                 :
>                 read(slave_sd, buf, BUFSIZ);    <- 对client做读的动作
>                 :
>                 write(slave_sd, buf, sizeof(buf)); <-对client做写的动作
>                 :                  /* 中途client停止对本 server写入 */
>            close(slave_sd);
>            exit(0);
>        }
>     结果,等client那边停止送讯息给server後,以 ps 来看,竟产生zombie。
> 是不是能请先进解释一下,可谓zombie?

        所谓 zombie process 就是 child process 比 parent process 先
        "死掉", 而parent 还未替它收□(即wait). 所以你用 ps 会看到 child
        process 的□体, 它本身也会占用一些 resource, 所以解决的方法是
        你可以fork() 2个以上的 child processes来处理要做的事, 而把parent
        process结束掉. 这样child processes 就会被system 的 init process
        (pid=1) 接管, 就不会有你说的那些问题了.




> -------------------------------------------------------------------------- <

发信人: LFalcon.bbs@cis.nctu.edu.tw (笨鸟), 看板: programming
标  题: Re: Multi-Client communication!
发信站: 交大资科_BBS (Thu May 16 23:29:40 1996)
转信站: maple!news.ee.nthu!news.cis.nctu!cis_nctu

==> 在 jackie@cis_nctu (狗脸岁月) 的文章中提到:
>         所谓 zombie process 就是 child process 比 parent process 先
>         "死掉", 而parent 还未替它收□(即wait). 所以你用 ps 会看到 child
                                        ^^^^^^^
    如果说在我的parent process中使用wait(),应该是会造成
Blocking吧!而不把child process结束掉,又会占据resource。此时
在两难的情况之下,使用原parent当server便显得没有效率。
  据jackie兄你所说,在child process中加入另一个fork(),
如此的话是不是原parent的service便无法发挥了?有没有办法可
以在不结束parent的情况下,判断child是否已结束了,然後再将
此结束的child process kill掉,且在该「判断」中能作到Non-blocking?



> -------------------------------------------------------------------------- <

发信人: LFalcon.bbs@cis.nctu.edu.tw (笨鸟), 看板: programming
标  题: Re: Multi-Client communication!
发信站: 交大资科_BBS (Thu May 16 23:51:13 1996)
转信站: maple!news.ee.nthu!news.cis.nctu!cis_nctu

==> 在 Chicken@cis_nctu (无敌喷饭鸡) 的文章中提到:
>          if (child) {
> >                 :
> >                 read(slave_sd, buf, BUFSIZ);    <- 对client做读的动作
> >                 :
> >                 write(slave_sd, buf, sizeof(buf)); <-对client做写的动作
> >                 :                  /* 中途client停止对本 server写入 */
> >            close(slave_sd);
> >            exit(0);
> >        }
>         我想你是 if (child) 这行写错了... 我猜你要的应该是 if (!child) ..
>         不过只看片断, 我也不大确定就是了. 先跟你讲什麽是 zombie...
  喔!对不起,是写错了!应该是 3;1mif (!child) {...}0m
  对!现在所使用的就是client专门作r/w,而由server来做select的动作。
而对於产生zombie时,我所遇到的问题...就贴在上一封罗!


> -------------------------------------------------------------------------- <

发信人: jackie.bbs@cis.nctu.edu.tw (狗脸岁月), 看板: programming
标  题: Re: Multi-Client communication!
发信站: 交大资科_BBS (Fri May 17 02:24:18 1996)
转信站: maple!news.ee.nthu!news.cis.nctu!cis_nctu

==> 在 LFalcon@cis_nctu (笨鸟) 的文章中提到:
> ==> 在 jackie@cis_nctu (狗脸岁月) 的文章中提到:
> >         所谓 zombie process 就是 child process 比 parent process 先
> >         "死掉", 而parent 还未替它收□(即wait). 所以你用 ps 会看到 child
>                                         ^^^^^^^
>     如果说在我的parent process中使用wait(),应该是会造成
> Blocking吧!而不把child process结束掉,又会占据resource。此时
> 在两难的情况之下,使用原parent当server便显得没有效率。
>   据jackie兄你所说,在child process中加入另一个fork(),
> 如此的话是不是原parent的service便无法发挥了?有没有办法可
> 以在不结束parent的情况下,判断child是否已结束了,然後再将
> 此结束的child process kill掉,且在该「判断」中能作到Non-blocking?

        一般我们写daemon有下面几个steps:

        1. call fork() and have the parent exit.
                                   ^^^^^^^^^^^^^

        2. setsid() to create a new session.

        3. chdir("/") .

        4. set the file mode creation mask to 0.

        5. unneeded file descriptors should be closed.

        step 1 & 2 就是跟 process group and session 有关,
        我们把parent结束掉, 然後产生一个新的process group,
        而某个child process 就变成该新的 process group leader,
        session leader, 并且不受 terminal的控制. 其时这时候这个
        leader才是我们所要用的server, 它负责 dispatch tasks.
        原来那个parent只是做一些initial 动作而以,不干正事的.

        详细情况你可参考 "Advanced programming in the UNIX environment"
        chapter 13 p.419.


> -------------------------------------------------------------------------- <

发信人: Thinker.bbs@bbs.yzit.edu.tw (我狂 我笑 我傲 *), 看板: programming
标  题: Re: Multi-Client communication!
发信站: 元智工学院风之塔BBS (Fri May 17 13:03:14 1996)
转信站: maple!news.ee.nthu!news.cis.nctu!news.cc.nctu!news.ncu!news.yzit!yzit_

狗脸岁月 (jackie.bbs@cis.nctu.edu.tw) 提到:
: ==> 在 LFalcon@cis_nctu (笨鸟) 的文章中提到:
: >     谢谢高手们的指导!如今我已经知道何谓forking了,但是实际在
: > 使用fork()来做concurrent server时(socket-based IPC),发现会有
: >         <zombie> 的产生!说明一下,我写了部份程式如下:
: >                 :
: >         slave_sd=accept(msd, NULL, NULL);
: >         if ((child=fork())==-1) {
: >                 perror("fork");
: >                 exit(-1);
: >         }
: >         if (child) {
: >                 :
: >                 read(slave_sd, buf, BUFSIZ);    <- 对client做读的动作
: >                 :
: >                 write(slave_sd, buf, sizeof(buf)); <-对client做写的动作
: >                 :                  /* 中途client停止对本 server写入 */
: >            close(slave_sd);
: >            exit(0);
: >        }
: >     结果,等client那边停止送讯息给server後,以 ps 来看,竟产生zombie。
: > 是不是能请先进解释一下,可谓zombie?
:         所谓 zombie process 就是 child process 比 parent process 先
:         "死掉", 而parent 还未替它收□(即wait). 所以你用 ps 会看到 child
:         process 的□体, 它本身也会占用一些 resource, 所以解决的方法是
:         你可以fork() 2个以上的 child processes来处理要做的事, 而把parent
:         process结束掉. 这样child processes 就会被system 的 init process
:         (pid=1) 接管, 就不会有你说的那些问题了.
这样的方法不是很好, 如果还 fork 新的  process 时, 不就又要重复一次....
比较好的方法是去 catch SIGCHLD .....
当一个 child process 结束时, 会进入 zombie 的状态....
这时侯就是 child status 改变了, 在进入 zombie 後, child process 会产生
SIGCHLD 的 signal .......
所以你只要 catch 这个 signal 了, 就可以知道有任何一个 child 的 status 改变了..
这时, 你只要在 catching function 中, 叫用 wait3 就可以知道是发生什麽事了...
并且会消除 zombie ....
如果不知道我所说的这个 system call 要怎麽用, 同样建议你去找找
Advanced Programming in the UNIX Environment


> -------------------------------------------------------------------------- <

发信人: LFalcon.bbs@bbs.secc.fju.edu.tw (笨鸟), 看板: programming
标  题: Re: Multi-Client communication!
发信站: 辅大美少女梦工场 BBS 站 (Fri May 17 18:33:53 1996)
转信站: maple!news.ee.nthu!thccx4!news.cc.nctu!spring!aidebbs!info.svd.fju!fju

【 在 Thinker.bbs@bbs.yzit (我狂 我笑 我傲 *) 的大作中提到: 】
: 这样的方法不是很好, 如果还 fork 新的  process 时, 不就又要重复一次....
: 比较好的方法是去 catch SIGCHLD .....
                ^^^^^^^^^^^^^^^^^^那我的parent process要如何
去得到那个signal呢?喔! 对了,我希望此时parent process能够处
於non-blocking 的状态。




> -------------------------------------------------------------------------- <

发信人: Thinker.bbs@bbs.yzit.edu.tw (我狂 我笑 我傲 *), 看板: programming
标  题: Re: Multi-Client communication!
发信站: 元智工学院风之塔BBS (Sat May 18 07:20:49 1996)
转信站: maple!news.ee.nthu!news.csie.nctu!news.cc.nctu!news.Edu.TW!news.ncu!ne

笨鸟 (LFalcon.bbs@bbs.secc.fju.edu.tw) 提到:
: 【 在 Thinker.bbs@bbs.yzit (我狂 我笑 我傲 *) 的大作中提到: 】
: : 这样的方法不是很好, 如果还 fork 新的  process 时, 不就又要重复一次....
: : 比较好的方法是去 catch SIGCHLD .....
:                 ^^^^^^^^^^^^^^^^^^那我的parent process要如何
: 去得到那个signal呢?喔! 对了,我希望此时parent process能够处
: 於non-blocking 的状态。
如何去 caught , 去查查我提到的那本书会有详细的资料.....
当你 caught 之後, 如果你的 catching function 被执行的话...
代表你己有 child process 的 status 改变了, 例如变成 zombie ....
所以你只要呼叫 wait or wait3 之类的... 就会立刻传回 exit code or status ..
不会造成 block 的情形...

--
m;32m※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: mtlab.hit.edu.cn]
--

                              Enjoy Linux!
                          -----It's FREE!-----

※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: mtlab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:207.419毫秒