繁体   English   中英

逐行读取文件 fork/exec - Perl

[英]Reading a file line-by-line fork/exec - Perl

目前我正在尝试使用 perl 逐行读取文件和 fork 进程

基本上我的 perl 脚本“test.pl”使用 exec 执行另一个脚本,它应该工作的方式是脚本“run.sh”应该使用文件行作为 exec 函数中的命令行参数对文件的每 5 行执行一次等待这 5 个进程完成并继续。

Line: 1 - run.sh executed
Line: 2 - run.sh executed
Line: 3 - run.sh executed
Line: 4 - run.sh executed
Line: 5 - run.sh executed - WAIT HERE for "run.sh" to complete then continue 
Line: 6 - run.sh executed
Line: 7 - run.sh executed
Line: 8 - run.sh executed
Line: 9 - run.sh executed
Line: 10 - run.sh executed

不幸的是,它没有按预期工作,它似乎将随机行读取为与顺序相反的行我相信这是由于分叉过程,但我不确定如何解决它。

这个问题可能与Perl 中的 Fork 没有在从文件读取的 while 循环中工作有关但我仍然很困惑。

测试.txt

5-6
7-1
5-9
1-22
8-55
9-6
3-5
7-1
5-9
1-22
8-55
9-6
3-5

测试文件

$count = 0;
open (MYFILE, 'test.txt');
while (<MYFILE>) { 
    $data = $_;
    $data =~ s/\R//g;
    chomp();
    my $pid = fork();
    if ($pid == -1) {
        die;
    } elsif ($pid == 0) {
        exec './run.sh', "-r $data" or die;
        print $count;
    }

    if( ($count%5) == 0 ){
        while (wait() != -1) {}
    }

    $count ++;
}
close (MYFILE); 

运行文件

sleep 5
echo "I was passed the following arg:"
echo $1
echo $2

您对问题的描述(“它似乎读取随机行”)非常含糊。

您的代码有很多问题,其中许多问题甚至无法编译。

不过,我相信我仍然可以回答你的问题:

不能保证孩子们会按照他们开始的顺序结束。

您将以任何顺序(甚至混合)获得前 5 个孩子的输出,然后您将以任何顺序(甚至混合)获得接下来的 5 个孩子的输出,依此类推。

如果要按特定顺序输出结果,则需要收集子项的输出,并在根据生成它的子项的启动顺序对输出重新排序后重新打印。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM