gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:38:29 25 4
gpt4 key购买 nike

下面的代码在 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 的方法吗?即使我必须维护代码的两个不同版本,此时我也不会在意。 :)

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

最佳答案

好吧,对于那些好奇的人,我让事情按照他们应该的方式工作,但我对部分修复并不太着迷。我加了

use POSIX ":sys_wait_h";

并将 waitpid() 调用更改为

waitpid($pid, &WNOHANG);

仅此一项没有做到,所以在此之后我立即添加

kill(-9, ($pid));

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

关于windows - Windows 与 Linux/UNIX 中 Perl 的 waitpid() 和 IPC::Open2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12011300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com