1

私はPerlが初めてで、リンクでこのタラを理解しようとしています: http ://codepaste.ru/1374/しかし、コードのこの部分を理解するのに問題があります:

while($client || $target) {
  my $rin = "";
  vec($rin, fileno($client), 1) = 1 if $client;
  vec($rin, fileno($target), 1) = 1 if $target;
  my($rout, $eout);
  select($rout = $rin, undef, $eout = $rin, 120);
  if (!$rout  &&  !$eout) { return; }
  my $cbuffer = "";
  my $tbuffer = "";

  if ($client && (vec($eout, fileno($client), 1) || vec($rout, fileno($client), 1))) {
    my $result = sysread($client, $tbuffer, 1024);
    if (!defined($result) || !$result) { return; }
  }

  if ($target  &&  (vec($eout, fileno($target), 1)  || vec($rout, fileno($target), 1))) {
    my $result = sysread($target, $cbuffer, 1024);
    if (!defined($result) || !$result) { return; }
    }

  if ($fh  &&  $tbuffer) { print $fh $tbuffer; }

  while (my $len = length($tbuffer)) {
    my $res = syswrite($target, $tbuffer, $len);
    if ($res > 0) { $tbuffer = substr($tbuffer, $res); } else { return; }
  }

  while (my $len = length($cbuffer)) {
    my $res = syswrite($client, $cbuffer, $len);
    if ($res > 0) { $cbuffer = substr($cbuffer, $res); } else { return; }
  }
}

これらの行で何が起こっているのかを正確に説明してくれる人はいますか:

vec($rin, fileno($client), 1) = 1 if $client;
vec($rin, fileno($target), 1) = 1 if $target;

select($rout = $rin, undef, $eout = $rin, 120);
4

1 に答える 1

1

基本的に、selectオペレーターは、どのファイル記述子が準備ができているか (読み取り可能、書き込み可能、​​またはエラー状態) を見つけるために使用されます。ファイル記述子の 1 つが準備できるか、タイムアウトになるまで待機します。

select RBITS, WBITS, EBITS, TIMEOUT

RBITSselectビット マスクで、通常は文字列として格納され、読み取り可能になるまで待機する一連のファイル記述子を表します。の各ビットはファイル記述子をRBITS表し、このビット マスク内のファイル記述子のオフセットは、システム内のファイル記述子番号である必要があります。vecしたがって、このビット マスクを生成するために使用できます。

vec EXPR, OFFSET, BITS

このvec関数は、符号なし整数のリストのストレージを提供します。EXPRはビット文字列で、OFFSETは のビットのオフセットで、から読み書きする各要素の幅を指定しEXPRます。BITSEXPR

したがって、これらの2行:

vec($rin, fileno($client), 1) = 1;
vec($rin, fileno($target), 1) = 1;

$rinオフセットが のファイル記述子番号と等しいビットを設定して、ビット マスク文字列を作成しまし$client$target

それをselectオペレーターに入れます:

select($rout = $rin, undef, $eout = $rin, 120);

次にselect、2 つのファイル ハンドラー ($clientおよび$target) の可読性を監視し、いずれかの準備ができている場合selectは戻ります。または、誰も準備ができていない場合は、120 秒後に戻ります。

WBITSEBITS同じ方法を使用します。selectしたがって、上記の行は、2 つのファイル ハンドラーに例外がある場合にも返されると推測できます。

于 2013-09-23T09:05:17.023 に答える