3

次のコードは Linux では問題なく動作しますが、Windows マシンに配置すると、すべてが崩壊します。

$pid = open2($my_reader, $my_writer, "$JAVACALL $PARSER_CP $PARSER_CMD -");
$my_reader->autoflush(1);
$my_writer->autoflush(1);
print $my_writer "$line\n";
close($my_writer);
my $tree = <$my_reader>;
chomp($tree);
push @parse_trees, $tree;
close($my_reader);
waitpid($pid, 0);

Windows では、そのままハングアップしwaitpid($pid, 0)ます。その行をコメントアウトすると、すべてが適切に終了しますが、多数の孤立したプロセスが残ります。私を混乱させているのは、ActiveState (私たちが使用している Perl) が実際に、私たちが行っているとおりに物事を行うように指示していることです

これを行うためのWindowsに適した方法を知っている人はいますか? コードの 2 つの別々のバージョンを維持する必要があるとしても、この時点ではそれほど気にすることはできません。:)

(好奇心旺盛な方のために説明すると、このコードはStanford Parserを開きます。このファイルは入力としてファイルを受け取り (したがって、"-" (Linux と同様/同じ) を使用します/dev/stdin)、それに文をスローし、解析ツリーを取得します。重要ではありませんが、私は誰かが尋ねようとしていることを知っています. :) )

4

1 に答える 1

0

好奇心旺盛な方のために説明すると、私は正常に動作するようになりましたが、修正の一部についてあまり夢中になっているわけではありません。追加した

use POSIX ":sys_wait_h";

waitpid()その呼び出しを次のように変更しました

waitpid($pid, &WNOHANG);

これだけではだめだったので、この直後に追加しました

kill(-9, ($pid));

プロセスを強制終了します。への呼び出しはあまり好きではありませんkill()が、機能します。奇妙なことに、 も呼び出さなかった場合でも、ゾンビプロセスが残っていましたwaitpid()。繰り返しますが、誰かがよりエレガントなソリューションを知っていれば素晴らしいことですが、これは今のところ行う必要があります。:)

于 2012-08-22T20:38:36.447 に答える