3

最近、2 つのプロセス間で通信したいときに (pipe |-) を使用すると問題が発生しました。基本的に、子プロセスは、親プロセスが満たしたほど速く STDIN を処理できませんでした。これにより、親は STDIN が解放されるまで待機し、実行が遅くなりました。

STDIN のサイズと変更可能性。はいの場合、ベストプラクティスのサイズはどれくらいですか?

私が何を意味するかを示すコードサンプルを次に示します。

if ($child_pid = open($child, "|-"))
{
    $child->autoflush(1);

    # PARENT process
    while (1)
    {

             # Read packet from socket save in $packet
             process_packet($packet);

             # forward packet to child
             print $child $packet;
     }
}
else
{
     die "Cannot fork: $!" unless defined $child_pid;
     # CHILD process
     my $line;  

     while($line = <STDIN>)
     {
         chomp $line;
         another_process_packet($line);
     }
}

このサンプルanother_process_packetではprocess_packet. このようなコードを書く理由は、同じデータをソケットから取得し、実際に一度取得したいからです。

前もって感謝します。

4

3 に答える 3

1

サイズはカーネルで設定されます。より高い制限でカーネルを再コンパイルするか、中間バッファ プロセスを使用することができます。

于 2009-06-09T10:09:26.517 に答える
0

プロセス ハンドルには、'blocking' という名前のメンバー関数が含まれています。ブロッキングを 0 に設定するだけで、親プロセスはブロックされません。

if ($child_pid = open($child, "|-"))
{
    $child->blocking(0);    # Key to the solution.
    $child->autoflush(1);

    # PARENT process
    while (1)
    {

             # Read packet from socket save in $packet
             process_packet($packet);

             # forward packet to child
             print $child $packet;
     }
}
else
{
     die "Cannot fork: $!" unless defined $child_pid;
     # CHILD process
     my $line;  

     while($line = <STDIN>)
     {
         chomp $line;
         another_process_packet($line);
     }
}
于 2009-06-16T01:41:26.167 に答える