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:我想我现在明白了,至少在我的程序按预期运行后是这样。非常感谢你!试图通过时