Perl 多叉和IO:管道

Perl 多叉和IO:管道,perl,pipe,Perl,Pipe,我试图构建一个程序,创建一些分叉,并将分叉的结果写回主程序。因此,我尝试使用 如前所述,要保存这些管道,但我在读取它们时仍然遇到问题,因为程序在得到答案之前退出。问题是您正在分叉多个子进程,但试图对所有子进程使用相同的管道 reader方法将$pipe转换为可以从中读取数据的IO::pipe::End对象,因此第一个子对象连接正确。但是您随后在同一个$pipe上再次调用reader,并抛出错误,因为它不再是正确类的对象 您只需为每个子进程创建一个新管道: sub fork_requests {

我试图构建一个程序,创建一些分叉,并将分叉的结果写回主程序。因此,我尝试使用


如前所述,要保存这些管道,但我在读取它们时仍然遇到问题,因为程序在得到答案之前退出。

问题是您正在分叉多个子进程,但试图对所有子进程使用相同的管道

reader
方法将
$pipe
转换为可以从中读取数据的
IO::pipe::End
对象,因此第一个子对象连接正确。但是您随后在同一个
$pipe
上再次调用
reader
,并抛出错误,因为它不再是正确类的对象

您只需为每个子进程创建一个新管道:

sub fork_requests {

    for my $feature ( @features ) {

        my $pipe = IO::Pipe->new;
        my $pid;

        if ( $pid = fork ) {
            $pipe->reader;
            print while <$pipe>;
        }
        elsif ( defined $pid ) {
            $pipe->writer;
            # some calculations . . .
            print $pipe $calcresults;
            exit;
        }
    }

}
输出

A
B
C
D
E

问题是您正在分叉多个子进程,但试图对所有子进程使用相同的管道

reader
方法将
$pipe
转换为可以从中读取数据的
IO::pipe::End
对象,因此第一个子对象连接正确。但是您随后在同一个
$pipe
上再次调用
reader
,并抛出错误,因为它不再是正确类的对象

您只需为每个子进程创建一个新管道:

sub fork_requests {

    for my $feature ( @features ) {

        my $pipe = IO::Pipe->new;
        my $pid;

        if ( $pid = fork ) {
            $pipe->reader;
            print while <$pipe>;
        }
        elsif ( defined $pid ) {
            $pipe->writer;
            # some calculations . . .
            print $pipe $calcresults;
            exit;
        }
    }

}
输出

A
B
C
D
E

问题是您正在分叉多个子进程,但试图对所有子进程使用相同的管道

reader
方法将
$pipe
转换为可以从中读取数据的
IO::pipe::End
对象,因此第一个子对象连接正确。但是您随后在同一个
$pipe
上再次调用
reader
,并抛出错误,因为它不再是正确类的对象

您只需为每个子进程创建一个新管道:

sub fork_requests {

    for my $feature ( @features ) {

        my $pipe = IO::Pipe->new;
        my $pid;

        if ( $pid = fork ) {
            $pipe->reader;
            print while <$pipe>;
        }
        elsif ( defined $pid ) {
            $pipe->writer;
            # some calculations . . .
            print $pipe $calcresults;
            exit;
        }
    }

}
输出

A
B
C
D
E

问题是您正在分叉多个子进程,但试图对所有子进程使用相同的管道

reader
方法将
$pipe
转换为可以从中读取数据的
IO::pipe::End
对象,因此第一个子对象连接正确。但是您随后在同一个
$pipe
上再次调用
reader
,并抛出错误,因为它不再是正确类的对象

您只需为每个子进程创建一个新管道:

sub fork_requests {

    for my $feature ( @features ) {

        my $pipe = IO::Pipe->new;
        my $pid;

        if ( $pid = fork ) {
            $pipe->reader;
            print while <$pipe>;
        }
        elsif ( defined $pid ) {
            $pipe->writer;
            # some calculations . . .
            print $pipe $calcresults;
            exit;
        }
    }

}
输出

A
B
C
D
E

如果我在for循环中创建管道,这不会覆盖我的旧管道吗?我想并行运行5个fork,所以所有5个fork都需要回写到同一个管道,而不能在同一个管道上同时读取多个子进程。管道只能有两端。在读取句柄之前,您可能需要将其保存在数组中,但您对应用程序的描述还不够清楚。实际上,
fork
ed位是并行运行的,“main”位在启动子项后立即开始读取输入。@Sobrique:可能,但只是使用和在引擎盖下,但使它看起来比它真正的混乱得多。如果你坚持使用便利模块,你就不会学到基本原理。@Borodin:我想我现在明白了,至少在我的程序按预期运行后是这样。非常感谢你!如果我在for循环中创建管道,这不会覆盖我的旧管道吗?我想并行运行5个fork,所以所有5个fork都需要回写到同一个管道,而不能在同一个管道上同时读取多个子进程。管道只能有两端。在读取句柄之前,您可能需要将其保存在数组中,但您对应用程序的描述还不够清楚。实际上,
fork
ed位是并行运行的,“main”位在启动子项后立即开始读取输入。@Sobrique:可能,但只是使用和在引擎盖下,但使它看起来比它真正的混乱得多。如果你坚持使用便利模块,你就不会学到基本原理。@Borodin:我想我现在明白了,至少在我的程序按预期运行后是这样。非常感谢你!如果我在for循环中创建管道,这不会覆盖我的旧管道吗?我想并行运行5个fork,所以所有5个fork都需要回写到同一个管道,而不能在同一个管道上同时读取多个子进程。管道只能有两端。在读取句柄之前,您可能需要将其保存在数组中,但您对应用程序的描述还不够清楚。实际上,
fork
ed位是并行运行的,“main”位在启动子项后立即开始读取输入。@Sobrique:可能,但只是使用和在引擎盖下,但使它看起来比它真正的混乱得多。如果你坚持使用便利模块,你就不会学到基本原理。@Borodin:我想我现在明白了,至少在我的程序按预期运行后是这样。非常感谢你!如果我在for循环中创建管道,这不会覆盖我的旧管道吗?我想并行运行5个fork,所以所有5个fork都需要回写到同一个管道,而不能在同一个管道上同时读取多个子进程。管道只能有两端。在读取句柄之前,您可能需要将其保存在数组中,但您对应用程序的描述还不够清楚。实际上,
fork
ed位是并行运行的,“main”位在启动子项后立即开始读取输入。@Sobrique:可能,但只是使用和在引擎盖下,但使它看起来比它真正的混乱得多。如果你坚持使用便利模块,你就不会学到基本原理。@Borodin:我想我现在明白了,至少在我的程序按预期运行后是这样。非常感谢你!试图通过时