Perl在Windows与Linux / UNIX中的waitpid()和IPC :: Open2

时间:2012-08-17 18:32:19

标签: windows linux perl ipc

以下代码在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)实际上是says来完全按照我们的方式做事。

有没有人知道Windows-happy的方法呢?即使我必须维护两个单独版本的代码,我现在也不在乎。 :)

(对于那些好奇的人,这段代码会打开Stanford Parser,它将文件作为输入(因此使用“ - ”(与Linux中的/dev/stdin类似),抛出一个在它的句子,然后回到一个解析树。不重要,但我知道有人会问。:))

1 个答案:

答案 0 :(得分:0)

嗯,对于那些好奇的人,我按照他们应该的方式工作,但我对解决方案的部分内容并不太疯狂。我添加了

use POSIX ":sys_wait_h";

并将waitpid()调用更改为

waitpid($pid, &WNOHANG);

仅此一点没有这样做,所以在此之后我立即添加了

kill(-9, ($pid));

杀死进程。并不喜欢对kill()的调用,但它有效,奇怪的是,如果我还没有调用waitpid(),我仍然会有僵尸进程。再说一次,如果有人知道更优雅的解决方案,那就太好了,但现在必须这样做。 :)