我的Perl程序挂起进程有问题,而且我认为只要将大量数据写入管道,我就已将其隔离。
以下是我认为与我的程序相关的所有代码。当程序挂起时,它挂起在ResponseConstructor.pm:print { $self->{writer} } $data;
的行上。
我已经使用不同的数据尺寸进行了测试,并且看起来并没有按照确切的大小进行测试。但是,它的大小可能会变得更大:大约32KB的大小有时可以工作,有时候不会。每次我尝试110KB字符串时都会失败。
我相信我也排除了数据的内容作为原因,因为相同的数据有时会导致挂起,而其他数据则没有。
这可能是我之前第一次在程序中使用过管道,所以我不确定下一步该尝试什么。有什么想法吗?
use POSIX ":sys_wait_h";
STDOUT->autoflush(1);
pipe(my $pipe_reader, my $pipe_writer);
$pipe_writer->autoflush(1);
my $pid = fork;
if ($pid) {
#I am the parent
close $pipe_writer;
while (waitpid(-1, WNOHANG) <= 0){
#do some stuff while waiting for child to send data on pipe
}
#process the data it got
open(my $fh, '>', "myoutfile.txt");
while ( my $line = <$pipe_reader>){
print $fh $line;
}
close $pipe_reader;
close $fh;
else {
#I am the child
die "cannot fork: $!" unless defined $pid;
close $pipe_reader;
my $response = ResponseConstructor->new($pipe_writer);
if ([a condition where we want to return small data]){
$response->respond('small data');
exit;
}
elsif ([a condition where we want to return big data]){
$response->respond('imagine this is a really big string');
}
}
ResponseConstructor.pm:
package ResponseConstructor;
use strict;
use warnings;
sub new {
my $class = shift;
my $writer = shift;
my $self = {
writer => $writer
};
bless($self, $class);
return($self);
}
#Writes the response then closes the writer (pipe)
sub respond {
my $self = shift;
my $data = shift;
print { $self->{writer} } $data;
close $self->{writer};
}
1;
答案 0 :(得分:2)
在返回数据时,您可能不应该忽略管道:您可以在管道上使用select
(而不是waitpid
)来查看在等待期间是否有任何数据要读取循环,但如果你真的想要一个更大的管道缓冲区,以便你可以一次读取它,你可以使用socketpair
而不是管道,然后你可以使用setsockopt
使缓冲区大到你需要它。