逐行读取文件fork / exec - Perl

时间:2013-06-01 04:06:54

标签: linux perl bash while-loop line-by-line

目前我正在尝试使用perl

逐行读取文件

基本上是我的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

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

这个问题可能有关系 Fork in Perl not working inside a while loop reading from file但我仍然感到很困惑。

的test.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

test.pl

$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); 

run.sh

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

你将获得任意顺序的前5个孩子的输出(甚至混合),然后你将以任何顺序(甚至混合)等获得接下来的5个孩子的输出。

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