Perl 如何为每个哈希键分叉一个子进程?

Perl 如何为每个哈希键分叉一个子进程?,perl,fork,Perl,Fork,我有一个散列,当我尝试为每个散列键创建一个子进程时,它的行为与我期望的不一样 请建议更改? 假设$pid不小于0。 foreach $elem(keys %hash) { $pid = fork(); if ($pid) { push @pids, $pid; print "in parent $$\n"; } else { print "in child $$\n"; } } 在执行子

我有一个散列,当我尝试为每个散列键创建一个子进程时,它的行为与我期望的不一样

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

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

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

在执行子进程时,不要忘记退出,否则子进程也将执行fork,并且创建的进程总数将高于预期

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
    }
}
foreach$elem(键%hash)
{
$pid=fork();
如果($pid)
{
推送@pid,$pid;
打印“在父$$\n中”;
}
其他的
{ 
打印“在子$$\n中”;

退出(0);#您应该检查
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。谢谢JIMBO让它可读。@RobEarl没有出口0,它将继续创建子进程的子进程,所以我做了一些实验,最后在打印到子进程后使用出口0。@mkp欢迎使用堆栈溢出!如果有答案解决了您的问题,那么表示感谢的方式是单击向上投票箭头和绿色复选标记以接受答案。还请注意,您认为
$pid
从不表示失败是一种危险的假设。在Perl中,
fork
在失败时返回未定义的值。总是,总是,总是检查对操作系统服务(如
fork
op)的系统调用的返回值en
exec
,等等。否则,当假设失败时,您可能会遇到奇怪的错误。@Greg Bacon先生,我自己解决了这个问题,没有任何帮助,在别人回答之前,除了您,我非常感谢您让它可读,我会记住您的建议
fork
在失败时返回未定义的值,但是t这种情况被归为0返回到子进程。我已经在上面对添加进行了评论,这解决了我的问题。但非常感谢。