相关疑难解决方法(0)

如何在Windows上进行非阻塞IPC读取?

我有一个Perl脚本,它使用外部工具(cleartool)来收集有关文件列表的信息.我想使用IPC来避免为每个文件生成一个新进程:

use IPC::Open2;
my ($cin, $cout);
my $child = open2($cout, $cin, 'cleartool');
Run Code Online (Sandbox Code Playgroud)

返回单行的命令运行良好.例如

print $cin "describe -short $file\n";
my $description = <$cout>;
Run Code Online (Sandbox Code Playgroud)

返回多行的命令使我处于死胡同,以便如何使用整个响应而不会被阻塞读取挂起:

print $cin "lshistory $file\n";
# read and process $cout...
Run Code Online (Sandbox Code Playgroud)

我试图通过fcntl以下方式为非阻塞读取设置文件句柄:

use Fcntl;
my $flags = '';
fcntl($cout, F_GETFL, $flags);
$flags |= O_NONBLOCK;
fcntl($cout, F_SETFL, $flags);
Run Code Online (Sandbox Code Playgroud)

但是Fcntl的消息是"你的供应商还没有定义Fcntl宏F_GETFL".

我已经尝试使用IO :: Handle进行设置$cout->blocking(0)但失败了(它返回undef并设置$!为"Unknown error").

select在尝试阅读之前,我曾试图确定是否有可用的数据:

my $rfd = '';
vec($rfd, fileno($cout), 1) = 1;
while (select($rfd, undef, undef, 0) >= 0) { …
Run Code Online (Sandbox Code Playgroud)

windows perl ipc

6
推荐指数
1
解决办法
2274
查看次数

标签 统计

ipc ×1

perl ×1

windows ×1