【发布时间】:2010-12-08 11:35:03
【问题描述】:
我有一个 Perl 脚本,它使用外部工具 (cleartool) 来收集有关文件列表的信息。我想使用 IPC 来避免为每个文件生成一个新进程:
use IPC::Open2;
my ($cin, $cout);
my $child = open2($cout, $cin, 'cleartool');
返回单行的命令运行良好。例如
print $cin "describe -short $file\n";
my $description = <$cout>;
返回多行的命令让我陷入了死胡同,不知道如何在不被阻塞读取挂断的情况下使用整个响应:
print $cin "lshistory $file\n";
# read and process $cout...
我尝试通过fcntl 为非阻塞读取设置文件句柄:
use Fcntl;
my $flags = '';
fcntl($cout, F_GETFL, $flags);
$flags |= O_NONBLOCK;
fcntl($cout, F_SETFL, $flags);
但是 Fcntl 死机并显示消息“您的供应商尚未定义 Fcntl 宏 F_GETFL。”
我尝试使用 IO::Handle 设置 $cout->blocking(0),但失败了(它返回 undef 并将 $! 设置为“未知错误”)。
在尝试读取之前,我尝试使用select 确定是否有可用数据:
my $rfd = '';
vec($rfd, fileno($cout), 1) = 1;
while (select($rfd, undef, undef, 0) >= 0) {
my $n = read($cout, $buffer, 1024);
print "Read $n bytes\n";
# do something with $buffer...
}
但是没有读过任何东西就挂了。有谁知道如何使这项工作(在 Windows 上)?
【问题讨论】:
-
你打算在不阻塞 IO 的情况下做什么?
-
我想读到我停止获取数据为止,这似乎比通过解析我已经检索到的数据来确定我已经到达终点更可靠。 (数据中没有“这是最后一行”的指示。)
-
搜索了一个相关的问题,我在 GitHub 上找到了这个提交,它似乎调用了黑魔法来制作一个非阻塞套接字:github.com/kthakore/frozen-bubble/commit/…