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 愉快的方式来做到这一点?即使我必须维护两个不同版本的代码,我也不会在意这一点。:)

(对于那些好奇的人,这段代码会打开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 回答