<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: fork, pipe, передача сложных данных между процессами</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8435.html</link>
    <description>Хотелось бы понять, как более рациональней, чем представлено ниже в примере, передать сложную структуру данных между процессами perl?&lt;br&gt;В примере я кодировал структуру perl-данных при помощи модуля Storable и далее преобразовывал все это дело посредством join( &apos;_&apos;, unpack( &quot;C*&quot;, ) ) в строку, состоящую из кодов ASCII, разделенных символом &quot;_&quot;. Все это дело, конечно, работает, но получается, что в трубе по факту гоняется больше чем нужно данных (в 3-4 раза).&lt;br&gt;&lt;br&gt;&#091;code&#093;&lt;br&gt;#!/usr/bin/perl&lt;br&gt;&lt;br&gt;use strict;&lt;br&gt;use warnings;&lt;br&gt;&lt;br&gt;use Storable;&lt;br&gt;use IO::Pipe;&lt;br&gt;use IO::Handle;&lt;br&gt;use Data::Dumper;&lt;br&gt;&lt;br&gt;# создаем трубу&lt;br&gt;my $pipe = IO::Pipe-&amp;gt;new();&lt;br&gt;&lt;br&gt;# делаем fork&lt;br&gt;my $pid = fork();&lt;br&gt;&lt;br&gt;# дочка&lt;br&gt;if( $pid == 0 ) &#123;&lt;br&gt;   # тут мы пишем в трубу&lt;br&gt;   $pipe-&amp;gt;writer();&lt;br&gt;   $pipe-&amp;gt;autoflush( 1 );&lt;br&gt;&lt;br&gt;   foreach( 1..10 ) &#123;&lt;br&gt;      # создаем ссылку на хэш&lt;br&gt;      my $data = &#123; pid =&amp;gt; $$, data =&amp;gt; $_ &#125;;&lt;br&gt;&lt;br&gt;      # пересылаем в трубу закодированный в строку хэш&lt;br&gt;      print $pipe &#091;b&#093;join( &apos;_&apos;, unpack( &quot;C*&quot;, Storable::freeze( $data ) ) ) . &quot;&#092;n&quot;&#091;/b&#093;;&lt;br&gt;</description>

<item>
    <title>fork, pipe, передача сложных данных между процессами (jr)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8435.html#2</link>
    <pubDate>Fri, 18 Sep 2009 07:19:23 GMT</pubDate>
    <description>&amp;gt;use Storable qw(store_fd fd_retrieve); &lt;br&gt;&amp;gt;      store_fd $data, $pipe; &lt;br&gt;&amp;gt;   until ( eof $pipe ) &#123; &lt;br&gt;&amp;gt;      my $data = fd_retrieve($pipe); &lt;br&gt;&lt;br&gt;Спасибо! Сам почему-то не увидел в доке этого...&lt;br&gt;</description>
</item>

<item>
    <title>fork, pipe, передача сложных данных между процессами (ACCA)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8435.html#1</link>
    <pubDate>Fri, 18 Sep 2009 00:18:16 GMT</pubDate>
    <description>#!/usr/bin/perl&lt;br&gt;use strict;&lt;br&gt;use warnings;&lt;br&gt;&lt;br&gt;use Storable qw(store_fd fd_retrieve);&lt;br&gt;use IO::Pipe;&lt;br&gt;use IO::Handle;&lt;br&gt;use Data::Dumper;&lt;br&gt;&lt;br&gt;# создаем трубу&lt;br&gt;my $pipe = IO::Pipe-&amp;gt;new();&lt;br&gt;&lt;br&gt;# делаем fork&lt;br&gt;my $pid = fork();&lt;br&gt;&lt;br&gt;# дочка&lt;br&gt;if( $pid == 0 ) &#123;&lt;br&gt;   # тут мы пишем в трубу&lt;br&gt;   $pipe-&amp;gt;writer();&lt;br&gt;   $pipe-&amp;gt;autoflush( 1 );&lt;br&gt;&lt;br&gt;   foreach( 1..10 ) &#123;&lt;br&gt;      # создаем ссылку на хэш&lt;br&gt;      my $data = &#123; pid =&amp;gt; $$, data =&amp;gt; $_ &#125;;&lt;br&gt;&lt;br&gt;      # пересылаем в трубу закодированный в строку хэш&lt;br&gt;      store_fd $data, $pipe;&lt;br&gt;&lt;br&gt;      # sleep на 0.3 секунды&lt;br&gt;      select undef, undef, undef, 0.3;&lt;br&gt;   &#125;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;# родитель&lt;br&gt;else &#123;&lt;br&gt;   unless( defined $pid ) &#123;&lt;br&gt;      die &apos;Cannot fork&apos;;&lt;br&gt;   &#125;&lt;br&gt;&lt;br&gt;   # тут мы читаем из трубы&lt;br&gt;   $pipe-&amp;gt;reader();&lt;br&gt;&lt;br&gt;   until ( eof $pipe ) &#123;&lt;br&gt;      my $data = fd_retrieve($pipe);&lt;br&gt;&lt;br&gt;      # выводим то, что пришло от дочки&lt;br&gt;      print Dumper $data;&lt;br&gt;   &#125;&lt;br&gt;&#125;&lt;br&gt;</description>
</item>

</channel>
</rss>
