2013-07-04 20 views
2

我有一个散列,当我尝试为每个散列键创建一个子进程时,它的行为并不像我期望的那样。如何为每个哈希键派生一个子进程?

请建议更改? 假设$pid是从不小于0

foreach $elem(keys %hash) 
{ 
    $pid = fork(); 

    if ($pid) 
    { 
     push @pids, $pid; 
     print "in parent $$\n"; 
    } 
    else 
    { 
     print "in child $$\n"; 
    } 
} 
+0

什么是不工作? – RobEarl

+1

好的,这已完成。它只需要在子进程中使用exit 0,让JIMBO使它可读。 – pkm

+0

@RobEarl没有退出0,它将继续创建子进程的子进程,所以我做了一些实验,最终在子进程中使用0退出后退出。 – pkm

回答

5

当执行子,不要忘记退出,否则子进程也将执行该叉,和创建的进程的总数将是高于预期。

foreach $elem(keys %hash) 
{ 
    $pid = fork(); 

    if ($pid) 
    { 
     push @pids, $pid; 
     print "in parent $$\n"; 
    } 
    else 
    { 
     print "in child $$\n"; 
     exit(0); #<--- add this or exec external program 
    } 
} 
+0

'fork'在失败时返回未定义的值,但是这种情况是被0归入子进程。 –

+0

我已经评论过以上关于添加和解决我的问题。但非常感谢。 – pkm

1

你应该检查,看看是否fork()工作:

foreach $elem(keys %hash) 
{ 
    $pid = fork(); 

    if(! defined($pid)){ 
     die "could not fork\n"; 
    } 

    if ($pid) 
    { 
     push @pids, $pid; 
     print "in parent $$\n"; 
    } 
    else 
    { 
     print "in child $$\n"; 
    } 
} 
+0

非常感谢...但我自己做了,并在上面评论。 – pkm

相关问题