请教关于fork的CHLD问题

请教关于fork的CHLD问题

#!usr/bin/perl -w
# file test.pl

use strict;

my $count = 10;

defined (my $child = fork) or die "Can't fork!\n";
if ($child) {
        $SIG{CHLD} = sub { exit 0 };
        print "I'm the parent\n";
        sleep;
} else {
        while($count){
                print "I'm the child $count\n";
                $count--;
        }       
        exit 0;
}

我设想当中,应该是主进程打印"I'm the parent", 然后sleep;
子进程打印完"I'm the child" 后退出,并发送CHLD信号给主进程
主进程接受到CHLD信号后也退出

可是在ActivePerl 5.10+WinXP SP2 下运行结果不对,程序打印完后就一直死在那里了,不会退出,这是为什么?应该怎么改吗?还是我理解有问题?
首先signal handler定义的位置错了;
其次对chld信号的理解不正确;


QUOTE:
原帖由 Nosferatu 于 2008-5-24 23:03 发表
首先signal handler定义的位置错了;
其次对chld信号的理解不正确;

能给个例子吗?
不妨给我以上程序改写一下,谢谢


[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
$SIG{CHLD} = sub { print "Child died \n" };
defined ( my $pid = fork() ) or die "Fail to fork $!\n";
if ( $pid ) {
                print "Parent waiting for child $pid to terminate\n";
}else {
                print "I am child \n";
}

还有ms windows下面的信号处理机制不是很完善(一般推荐是$SIG{CHLD}='IGNORE';也就是不处理信号),上述代码在Linux上运行是没有问题的,在xp下运行有问题


QUOTE:
原帖由 churchmice 于 2008-5-25 01:36 发表
还有ms windows下面的信号处理机制不是很完善(一般推荐是$SIG{CHLD}='IGNORE';也就是不处理信号),上述代码在Linux上运行是没有问题的,在xp下运行有问题

嗯,谢谢!
把$SIG写在外面我也试过,不行
后来仔细看network-programming-with-perl.pdf的时候发现,作者也的确提到,在windows下面子进程结束时不给parent发CHLD的
看来得想起他办法了
Thank u anyway~!