免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: picbhan
打印 上一主题 下一主题

关于perl fork [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-03-26 19:31 |只看该作者
估计Linux是报错,父进程还能继续往下走,而window是直接父进程死了。。

论坛徽章:
0
12 [报告]
发表于 2013-03-27 09:32 |只看该作者
回复 11# toniz


    发现windows下的fork和waitpid与unix下的差别很大,估计实现细节不同。比如下面的代码:
  1. use POSIX ":sys_wait_h";
  2. my %children;
  3. my $count = 0;

  4. $SIG{CHLD} = sub {
  5.     while ((my $pid = waitpid(-1, WNOHANG)) > 0) {
  6.         if ($children{$pid}) {
  7.             delete $children{$pid};
  8.             $count--;
  9.             print "$pid reaped. count is $count.\n";
  10.         }
  11.     }
  12. };

  13. my $num = 0;
  14. while ($num++ < 34) {
  15.     my $pid = fork();
  16.     until (defined $pid) {
  17.         print "Failed to fork, num is $num, count is $count, try to reap zombies.\n";
  18.         sleep 5 if $count;
  19.         print "Zombies reaped, count is $count, try to fork again.\n";
  20.         $pid = fork();
  21.     }
  22.     $children{$pid} = 1;
  23.    
  24.     if ($pid == 0) {
  25.         sleep 5;
  26.         exit 0;
  27.     }
  28.     $count++;
  29. }
  30. $num = 0;
  31. while ($count) {
  32.     $num++; print "sleep 50. num is $num, count is $count.\t";
  33.     sleep 50;
  34. }
复制代码
在windows下竟然无法正常收割,unix下则可以。

论坛徽章:
0
13 [报告]
发表于 2013-03-28 17:30 |只看该作者
回复 12# picbhan


    WINDOW没怎么弄过。不过你可以先确认下是信号捕捉的问题,还是进程收割的问题。改成print看看CHLD有没触发。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP