<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: perl pipes</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/7563.html</link>
    <description>Добрый день.&lt;br&gt;Возникла проблемма с pipe в перле. &lt;br&gt;есть код, в котором происходит fork на два процесса. в дочернем процессе происходит обработка некоторых команд и через pipe данные передаются родителю. примерно так&lt;br&gt;pipe(PARENT,CHILD);&lt;br&gt;PARENT-&amp;gt;autoflush(1);&lt;br&gt;my &#064;arr=();&lt;br&gt;$pid=fork;&lt;br&gt;&lt;br&gt;if($pid==0)&lt;br&gt;&#123;&lt;br&gt;  close $CHILD;&lt;br&gt;здесь формируется массив &#064;arr&lt;br&gt;  foreach my $send_msg (&#064;arr)&lt;br&gt;  &#123;  print PARENT $send_msg;&lt;br&gt;  &#125;&lt;br&gt;   close PARENT;&lt;br&gt;   exit;&lt;br&gt;&#125;&lt;br&gt;else&lt;br&gt;&#123;&lt;br&gt;   close PARENT;&lt;br&gt;   while(my $recv_msg=&amp;lt;CHILD&amp;gt;)&lt;br&gt;   &#123;&lt;br&gt;      push &#064;arr,$recv_msg;&lt;br&gt;   &#125;&lt;br&gt;  waitpid($pid,0);&lt;br&gt;&#125;&lt;br&gt;проблема собственно в том, что при больших размерах массива &#064;arr(килобайт 80) происходит зависание. точнее происходит следующее: чилд в цикле закладывает в пайп данные, после чего завершается. парент вычитывает данные из пайпа после завершения чилд процесса. при больших объемах информации переполняется пайп и чилд виснет. парент ждет завершения чилда и тоже висит.&lt;br&gt;&lt;br&gt;необходимо реализовать такую схему: чилд положил данные в пайп, парент увидел что д</description>

<item>
    <title>perl pipes (iliya)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/7563.html#9</link>
    <pubDate>Tue, 02 Sep 2008 13:20:02 GMT</pubDate>
    <description>еще раз спасибо за разъяснения :)&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>perl pipes (NuINu)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/7563.html#8</link>
    <pubDate>Tue, 02 Sep 2008 10:36:41 GMT</pubDate>
    <description> &lt;br&gt;&amp;gt;&amp;gt;он просто не имеет смысла! он как раз и устанавливает размер буфера &lt;br&gt;&amp;gt;&amp;gt;при котором происходит автоматический сброс буферов, при заполнении буфера размером 1. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;вот здесь я не очень понял, тоесть при таком подходе в пайп &lt;br&gt;&amp;gt;будет передаваться по одному байту за раз? &lt;br&gt;&amp;gt;&lt;br&gt;&lt;br&gt;суть (auttoflush)в том что данные будут передаваться каждый раз после print(вообщем после записи в пайп). если вывел 1 байт, передастся 1 байт.&lt;br&gt;вобщем если нужно поставь.&lt;br&gt;&lt;br&gt;только что бы это увидеть нужно вывод(отладочный) также сделать не буферизированным, если отладка идет stdout то так:&lt;br&gt;STDOUT-&amp;gt;autoflush(1);&lt;br&gt;</description>
</item>

<item>
    <title>perl pipes (NuINu)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/7563.html#7</link>
    <pubDate>Tue, 02 Sep 2008 10:24:57 GMT</pubDate>
    <description>&lt;br&gt;&amp;gt;&amp;gt;не знаю как у меня затесался этот код: &lt;br&gt;&amp;gt;&amp;gt;pipe(CHILD, PARENT); &lt;br&gt;&amp;gt;&amp;gt;CHILD-&amp;gt;autoflush(1);&lt;br&gt;&amp;gt;&amp;gt;но он совершенно не верен!!! &lt;br&gt;&amp;gt;&amp;gt;он просто не имеет смысла! он как раз и устанавливает размер буфера &lt;br&gt;&amp;gt;&amp;gt;при котором происходит автоматический сброс буферов, при заполнении буфера размером 1. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;вот здесь я не очень понял, тоесть при таком подходе в пайп &lt;br&gt;&amp;gt;будет передаваться по одному байту за раз? &lt;br&gt;&lt;br&gt;Скажем, так, я наврал. и перепутал логическую перемнную, с размером.&lt;br&gt;</description>
</item>

<item>
    <title>perl pipes (iliya)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/7563.html#6</link>
    <pubDate>Tue, 02 Sep 2008 09:51:17 GMT</pubDate>
    <description>&amp;gt;понятно что висит, вы записали один байт в W1 а в парент &lt;br&gt;&amp;gt;процессе ждете что вам придет целая строка из R1. либо пишите &lt;br&gt;&amp;gt;&quot;1&#092;n&quot; либо читайте один байт. &lt;br&gt;&lt;br&gt;СПАСИБО! человеческое и огромное :)))) я б быстрее организовал еще пару процессов и семафоры, что б родитель сигнализировал, что получены данные и чилд после этого отсылал следующую порцию, чем понял бы что дело в строках :)&lt;br&gt;лучше меньше, да лучше(с) как говорил вождь :)&lt;br&gt;&lt;br&gt;&amp;gt;и не заморачивайтесь размером буферов. не в них дело. &lt;br&gt;&lt;br&gt;угу.&lt;br&gt;&lt;br&gt;&amp;gt;не знаю как у меня затесался этот код: &lt;br&gt;&amp;gt;pipe(CHILD, PARENT); &lt;br&gt;&amp;gt;CHILD-&amp;gt;autoflush(1);&lt;br&gt;&amp;gt;но он совершенно не верен!!! &lt;br&gt;&amp;gt;он просто не имеет смысла! он как раз и устанавливает размер буфера &lt;br&gt;&amp;gt;при котором происходит автоматический сброс буферов, при заполнении буфера размером 1. &lt;br&gt;&lt;br&gt;вот здесь я не очень понял, тоесть при таком подходе в пайп будет передаваться по одному байту за раз?&lt;br&gt;&lt;br&gt;&amp;gt;но этот дескриптор на чтение, и устанавливать там размер буфера бессмысленно. &lt;br&gt;&amp;gt;надо было поставить: &lt;br&gt;&amp;gt;PARENT-&amp;gt;autoflush(1);&lt;br&gt;&lt;br&gt;это </description>
</item>

<item>
    <title>perl pipes (NuINu)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/7563.html#5</link>
    <pubDate>Tue, 02 Sep 2008 06:10:39 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&#125; &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;данный код уже висит. &lt;br&gt;&amp;gt;можно как-либо увеличить количество памяти, которое отводиться под пайпы? как я понимаю, &lt;br&gt;&amp;gt;оно всегда постоянно и равно, допустим, COUNT_MEM и если открывается пять &lt;br&gt;&amp;gt;пайпов то на каждый пайп отводится COUNT_MEM/5 byte. &lt;br&gt;&amp;gt;ps или я несу полную чушь? :))) &lt;br&gt;&amp;gt;please help :) &lt;br&gt;&amp;gt;pps. последнее, говорит child: &apos;602&apos;&#123;child&#125;, тоесть он отправил 602 сообщения в пайп. &lt;br&gt;&amp;gt;&lt;br&gt;&lt;br&gt;понятно что висит, вы записали один байт в W1 а в парент процессе ждете что вам придет целая строка из R1. либо пишите &quot;1&#092;n&quot; либо читайте один байт.&lt;br&gt;и не заморачивайтесь размером буферов. не в них дело.&lt;br&gt;не знаю как у меня затесался этот код:&lt;br&gt;pipe(CHILD, PARENT);&lt;br&gt;CHILD-&amp;gt;autoflush(1);&lt;br&gt;но он совершенно не верен!!!&lt;br&gt;он просто не имеет смысла! он как раз и устанавливает размер буфера при котором происходит автоматический сброс буферов, при заполнении буфера размером 1.&lt;br&gt;но этот дескриптор на чтение, и устанавливать там размер буфера бессмысленно.&lt;br&gt;надо было поставить:&lt;br&gt;PARENT-&amp;gt;autoflush(1</description>
</item>

<item>
    <title>perl pipes (iliya)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/7563.html#4</link>
    <pubDate>Mon, 01 Sep 2008 12:51:03 GMT</pubDate>
    <description>привет.&lt;br&gt;да, действительно. этот код рабочий!&lt;br&gt;и если в моем реальном коде оставить один пайп, то тоже все работает. но у меня немного другая ситуация. у меня четыре пайпа и вот примерно так это выглядит:&lt;br&gt;&lt;br&gt;#!/usr/bin/perl&lt;br&gt;&lt;br&gt;&lt;br&gt;use IO::File;&lt;br&gt;use File::Spec;&lt;br&gt;use POSIX;&lt;br&gt;use strict;&lt;br&gt;&lt;br&gt;sub print_arr &#123;&lt;br&gt;   my &#064;t = &#064;_;&lt;br&gt;   foreach my $l (&#064;t) &#123;&lt;br&gt;       print $l;&lt;br&gt;   &#125;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;pipe(CHILD, PARENT);&lt;br&gt;pipe(R1,W1);&lt;br&gt;pipe(R2,W2);&lt;br&gt;pipe(R3,W3);&lt;br&gt;R1-&amp;gt;autoflush(1);&lt;br&gt;R2-&amp;gt;autoflush(1);&lt;br&gt;R3-&amp;gt;autoflush(1);&lt;br&gt;CHILD-&amp;gt;autoflush(1);&lt;br&gt;my &#064;arr=();&lt;br&gt;my $delim = &apos;---------------------------------------------------------------------------&apos;.&quot;&#092;n&quot;;&lt;br&gt;print &quot;Single process work&#092;n&quot;;&lt;br&gt;my $pid=fork;&lt;br&gt;&lt;br&gt;if($pid==0) &#123;&lt;br&gt;   #Child work, children process read file, to arr, and send to parent&lt;br&gt;   close CHILD;close R1;close R2;close R3;&lt;br&gt;   print &quot;Child process work: $$&#092;n&quot;;&lt;br&gt;   #здесь формируется массив &#064;arr&lt;br&gt;   print W1 &quot;1&quot;;&lt;br&gt;   open(F_IN, &quot;&amp;lt;&quot;, &apos;/var/log/nortel/linuxbase.log&apos;);&lt;br&gt;   while(my $t = &amp;lt;F_IN&amp;gt;) &#123;&lt;br&gt;       push &#064;arr, $t;&lt;br&gt;   &#125;&lt;br&gt;   close(F_IN)</description>
</item>

<item>
    <title>perl pipes (NuINu)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/7563.html#3</link>
    <pubDate>Wed, 27 Aug 2008 09:39:43 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt;            &lt;br&gt;&amp;gt;&amp;gt;   may need to set $&amp;#124; to flush your &lt;br&gt;&amp;gt;&amp;gt;WRITEHANDLE after each command, depending on the application. &lt;br&gt;&amp;gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;как это вообще у тебя работает??? ты печатаешь в хендл для чтения! &lt;br&gt;&amp;gt;&amp;gt;&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;суть не в том! это я на форуме печатаю в хендл для &lt;br&gt;&amp;gt;чтения :)) спасибо за поправку конечно :) &lt;br&gt;&amp;gt;но хотелось бы ответа по теме вопроса :) &lt;br&gt;&lt;br&gt;У меня ничего не виснет, файл кило 100 улетат мгновенно. ничего не переполняется.&lt;br&gt;вот слегка модифицированый(до рабочего) твой же код:&lt;br&gt;#!/usr/bin/perl&lt;br&gt;&lt;br&gt;&lt;br&gt;use IO::File;&lt;br&gt;use File::Spec;&lt;br&gt;&lt;br&gt;use strict;&lt;br&gt;&lt;br&gt;sub print_arr &#123;&lt;br&gt;    my &#064;t = &#064;_;&lt;br&gt;    foreach my $l (&#064;t) &#123;&lt;br&gt;print $l;&lt;br&gt;    &#125;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;pipe(CHILD, PARENT);&lt;br&gt;CHILD-&amp;gt;autoflush(1);&lt;br&gt;my &#064;arr=();&lt;br&gt;my $delim = &apos;---------------------------------------------------------------------------&apos;.&quot;&#092;n&quot;;&lt;br&gt;print &quot;Single process work&#092;n&quot;;&lt;br&gt;my $pid=fork;&lt;br&gt;&lt;br&gt;if($pid==0) &#123;&lt;br&gt;    #Child work, children process read file, to arr, and send to parent&lt;br&gt;    close CHILD;&lt;br&gt;    print &quot;Child process work: $$&#092;n&quot;;&lt;br&gt;    #зд</description>
</item>

<item>
    <title>perl pipes (iliya)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/7563.html#2</link>
    <pubDate>Wed, 27 Aug 2008 07:58:22 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;            &lt;br&gt;&amp;gt;   cesses, deadlock can occur unless you are very &lt;br&gt;&amp;gt;careful.  In addition, note that Perl&apos;s pipes use IO buffering, &lt;br&gt;&amp;gt;so you &lt;br&gt;&amp;gt;            &lt;br&gt;&amp;gt;   may need to set $&amp;#124; to flush your &lt;br&gt;&amp;gt;WRITEHANDLE after each command, depending on the application. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;как это вообще у тебя работает??? ты печатаешь в хендл для чтения! &lt;br&gt;&amp;gt;&lt;br&gt;&lt;br&gt;суть не в том! это я на форуме печатаю в хендл для чтения :)) спасибо за поправку конечно :)&lt;br&gt;но хотелось бы ответа по теме вопроса :) &lt;br&gt;</description>
</item>

<item>
    <title>perl pipes (NuINu)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/7563.html#1</link>
    <pubDate>Tue, 26 Aug 2008 19:13:59 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;$pid=fork; &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;if($pid==0) &lt;br&gt;&amp;gt;&#123; &lt;br&gt;&amp;gt;  close $CHILD; &lt;br&gt;&amp;gt;здесь формируется массив &#064;arr &lt;br&gt;&amp;gt;  foreach my $send_msg (&#064;arr) &lt;br&gt;&amp;gt;  &#123;  print PARENT $send_msg; &lt;br&gt;&amp;gt;  &#125; &lt;br&gt;&amp;gt;&lt;br&gt;&lt;br&gt;pipe READHANDLE,WRITEHANDLE&lt;br&gt;               Opens a pair of connected pipes like the corresponding system call.  Note that if you set up a loop of piped pro-&lt;br&gt;               cesses, deadlock can occur unless you are very careful.  In addition, note that Perl&apos;s pipes use IO buffering, so you&lt;br&gt;               may need to set $&amp;#124; to flush your WRITEHANDLE after each command, depending on the application.&lt;br&gt;&lt;br&gt;как это вообще у тебя работает??? ты печатаешь в хендл для чтения!&lt;br&gt;</description>
</item>

</channel>
</rss>
