сделать буфер настолько большим, насколько вам нужно.

я проблема с зависшими процессами в моей программе на Perl, и я думаю, что изолировал ее, когда записываю значительные объемы данных в канал.

Ниже приведен весь код, который, я думаю, имеет отношение к моей программе. Когда программа зависает, она висит на строке в ResponseConstructor.pm:print { $self->{writer} } $data;.

Я проверил с разными размерами данных, и они не выглядят точными. Тем не менее, это может стать более вероятным с размером: иногда размеры около 32 КБ работают, иногда нет. Каждый раз, когда я пробовал строку размером 110 КБ, она терпела неудачу.

Я считаю, что я также исключилсодержание данных в качестве причины, потому что одни и те же данные иногда вызывают зависание, а в других случаях нет.

Вероятно, это первый раз, когда я использовал каналы в программе раньше, поэтому я не уверен, что делать дальше. Есть идеи?

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;

Ответы на вопрос(1)

Ваш ответ на вопрос