多谢两位

2009/8/3 Lin <[email protected]>

> 我这有一个比较实用的例子...
>
> #!/usr/bin/perl
> # achech.com
> my $PID       = $$;
> my $THREAD    = $$;
> my $COUNT     = 0;
> my $CONNECT   = 10;
> my @kids      = ();
> my $parentpid = 0;
> ##########
> &Init();
> &Forker($CONNECT);
> while (1) {
>     $COUNT++;
>     if ($parentpid) {
>         &Running();
>     }
>     else {
>         &Reaper();
>     }
> }
> exit 0;
> ##########
>
> sub Init {
>     &debug(__LINE__,"Init...");
>     # 将需要重用的信息在这里初始化吧...
> }
>
> sub Forker {
>     my $clients = shift;
>     my $i       = 0;
>     while ( $i++ < $clients ) {
>         my $newpid = fork();
>         if ( !defined $newpid ) {
>             die "fork() error: $!\n";
>         }
>         elsif ( $newpid == 0 ) {
>             $parentpid = $THREAD;
>             $THREAD    = $$;
>             @kids      = ();
>             last;
>         }
>         else {
>             &debug(__LINE__,"*进程 $$ 创建线程 $newpid");
>             push( @kids, $newpid );
>         }
>     }
> }
>
> sub Running {
>     &debug(__LINE__,"  +线程 $$ 等待接收");
>     # 在这里执行任务...
>     my $sec = int(rand(10));
>     &debug(__LINE__,"    TODO: 随机停顿 $sec 秒");
>     sleep($sec);
>     # 任务结束...
>     &debug(__LINE__,"  +线程 $$ 处理完毕");
> }
>
> sub Reaper {
>     while ( my $kid = shift(@kids) ) {
>         &debug(__LINE__,"*进程 $$ 回收线程 $kid");
>         my $reaped = waitpid( $kid, 0 );
>         unless ( $reaped == $kid ) {
>             &debug(__LINE__,"waitpid $reaped: $?");
>         }
>     }
> }
>
> sub debug{
>     printf("[%04d] %s %s\n",shift,scalar(localtime(time)),shift);
> }
>
> >
>


-- 
…………………………………………
              Ericzhao

Email:   [email protected]
MSN:    [email protected]
BLOG:   share82.freebsder.info

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛“PerlChina Mongers 讨论组”论坛。
 要在此论坛发帖,请发电子邮件到 [email protected]
 要退订此论坛,请发邮件至 [email protected]
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

回复