gpt4 book ai didi

perl - 当从 Perl 向执行 xargs 的子进程打开 n 个管道时,n-1 个进程收到一个空行

转载 作者:行者123 更新时间:2023-12-04 18:40:46 25 4
gpt4 key购买 nike

...另一方面,如果我在打开下一个管道之前向管道写入一些内容,则不会发生这种情况。

下面的代码应该更清楚:

sub test_concurrent_pipes
{
my $write_at_once = $_[0];
my $pipe_handle;
my @pipe_handle_list;
my $i;
foreach $i ( 1..3 )
{
open ( $pipe_handle, "| xargs echo" ) or die ( "Cannot open pipe.\n" );
if ( $write_at_once == 1 )
{
print $pipe_handle "Hello\n";
}
push( @pipe_handle_list, $pipe_handle );
}
foreach $pipe_handle ( @pipe_handle_list )
{
print $pipe_handle "world\n";
}
foreach $pipe_handle ( @pipe_handle_list )
{
close ( $pipe_handle );
}
}

print "Test 0: open all pipes before writing\n";
test_concurrent_pipes(0);

print "Test 1: write Hello before opening next pipe\n";
test_concurrent_pipes(1);

运行我得到的测试
./test_pipe_2_xargs.pl 
Test 0: open all pipes before writing


world world world
Test 1: write Hello before opening next pipe
Hello
Hello
Hello world world world

正如您在测试 0 中看到的那样,连续打开 3 个管道而中间没有任何输出会生成 2 个空行。
奇怪的是,如果我替换 xargs echocat -没有产生空行。
xargs 的行为似乎也与其手册页相矛盾,其中说明 Blank lines on the standard input are ignored.
我怎样才能避免那些空行?

cygwin/XP 上的 Perl 5.14.2 和 HP-UX 11.00 上的 Perl 5.8.8 会发生这种情况。

我写了最后我真正想做的事情,因为它在这里无关紧要:

通过 Perl 脚本有效地清除从所有 Clearcase View 可见的所有派生对象,该脚本为每个 View 派生一个进程以在从 VOB (rmdo) 中删除文件之前删除文件 (xargs rm)。

最佳答案

使“创建循环”使用局部变量( my $pipe_handle )修复了该问题。

foreach $i ( 1..3 )
{
open ( my $pipe_handle, "| xargs echo" ) or die ( "Cannot open pipe.\n" );
...
}

关于perl - 当从 Perl 向执行 xargs 的子进程打开 n 个管道时,n-1 个进程收到一个空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26846038/

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