gpt4 book ai didi

Perl:将序列化哈希通过管道传递给 fork 进程

转载 作者:行者123 更新时间:2023-12-01 14:06:16 26 4
gpt4 key购买 nike

我不知道我的代码有什么问题。我正在尝试在父级内部序列化一个散列并将其通过管道传输到应该反序列化的 fork 。

#!/usr/bin/perl
use strict;
use warnings;
use Storable qw(freeze thaw);
use IO::Pipe;

my $pipe_to_fork = IO::Pipe->new();

my $fork = fork;
if ($fork == 0) { # actual fork scope
$pipe_to_fork->reader();
my $hash_serialized = <$pipe_to_fork>; # wait and retrieve the serialized hash from parent
chomp $hash_serialized;
my %hash_rebuild = %{thaw($hash_serialized)}; # deserialize the retrieved serialized hash
exit;
}

my %hash = ('key1' => "val1", 'key2' => "val2");

$pipe_to_fork->writer();
$pipe_to_fork->autoflush(1);

my $hash_serialized = freeze(\%hash); # serialize the hash
print $pipe_to_fork $hash_serialized."\n";
sleep 5;

exit;

...产生以下错误:

Can't use an undefined value as a HASH reference at ./fork_serialize.pl line 14, <GEN0> line 1.

管道有问题吗? thaw 似乎没有反序列化检索到的标量值。可能检索到的标量值不正确。

我已经尝试在没有 fork 或管道的情况下做一些半成品,它的工作原理:

#!/usr/bin/perl
use strict;
use warnings;
use Storable qw(freeze thaw);

my %hash = ('key1' => "value1", 'key2' => "value2");
my $hash_serialized = freeze(\%hash);
my %hash_rebuild = %{thaw($hash_serialized)};

print $hash_rebuild{'key2'}."\n";

没有太大的逻辑差异,他?如果有人能向我解释更多这种行为,那就太好了。

最佳答案

问题在于您正在尝试使用基于行的协议(protocol)(在写入端附加 "\n",在读取端使用 <>chomp)但您的数据不是文本并且可以包含自己的 "\n"所以您的读者看到第一个就停了下来。

您需要使用一些其他方法来发出序列化数据结束的信号,例如,您可以关闭写入​​端的管道并继续运行直到读取端的 EOF。事实上,Storable有一对专为这种情况设计的功能:store_fdfd_retrieve .他们将以一种在没有 EOF 的情况下检测结束的方式进行传输,因此您可以保持管道打开以进行更多传输。

这是使用 fd 的程序的核心版本来自 Storable 的功能:

if ($fork == 0) { # actual fork scope
$pipe_to_fork->reader();
my %hash_rebuild = %{fd_retrieve($pipe_to_fork)}; # deserialize the retrieved serialized hash
use Data::Dumper;$Data::Dumper::Useqq=1;print Dumper \%hash_rebuild;
exit;
}

my %hash = ('key1' => "val1", 'key2' => "val2");

$pipe_to_fork->writer();
$pipe_to_fork->autoflush(1);

store_fd(\%hash, $pipe_to_fork);

关于Perl:将序列化哈希通过管道传递给 fork 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19767072/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com