1

在unix系统中

我有一个名为 program_sets 的目录,在 program_sets 中,存在 8 个目录,每个目录中都有一个名为 A.pl 的程序

我想同时启动和运行 8 个 A.pl 程序,但是当我启动第一个程序时,程序将被阻塞,直到第一个程序调用完成。我该如何解决这个问题?

这是我的代码

#!/usr/bin/perl

opendir(Programs,"./program_sets");
@Each_names = readdir(Programs);
shift(@Each_names);
shift(@Each_names);

for($i=0;$i<=$#Each_names;$i++)
{
    `perl ./program_sets/$Each_names[$i]/A.pl`;
}

谢谢

4

3 回答 3

1

在后台使用 运行它们&,就像在 shell 中一样。

for($i=0;$i<=$#Each_names;$i++)
{
    system("perl ./program_sets/$Each_names[$i]/A.pl >/dev/null 2>&1 &");
}

此外,将输出分配给变量时应使用反引号。用于system()在不保存输出的情况下运行命令。

于 2013-05-02T03:27:59.820 回答
0

在 *NIX 中,您可以在命令行中添加“&”以在后台启动程序。

另一种选择是使用 fork() http://perldoc.perl.org/functions/fork.html

于 2013-05-02T03:28:29.357 回答
0

这里似乎还有其他一些问题。

#!/usr/bin/perl

# warnings, strict
use warnings;
use strict;

# lexically scoped $dh
#opendir(Programs,"./program_sets");
my $cur_dir = "./program_sets";
opendir(my $dh, $cur_dir);

# what exactly is being shifted off here? "." and ".."??
#@Each_names = readdir(Programs);
#shift(@Each_names);
#shift(@Each_names);

# I would replace these three lines with a grep and a meaningful name.
# -d: only directories. /^\./: Anything that begins with a "." 
# eg. hidden files, "." and ".."
my @dirs = grep{ -d && $_ !~ /^\./ } readdir $dh;
close $dh;

for my $dir ( @dirs ) {
    my $path = "$cur_dir/$dir";

    system("perl $path/A.pl >/dev/null 2>&1 &");
}
于 2013-05-02T04:57:29.783 回答