在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`;
}
感谢
答案 0 :(得分:1)
使用&
在后台运行它们,就像在shell中一样。
for($i=0;$i<=$#Each_names;$i++)
{
system("perl ./program_sets/$Each_names[$i]/A.pl >/dev/null 2>&1 &");
}
此外,在将输出分配给变量时,应使用反引号。使用system()
运行命令而不保存输出。
答案 1 :(得分:0)
在* NIX中,您可以添加“&amp;”到命令行在后台启动程序。
另一种选择是使用fork()http://perldoc.perl.org/functions/fork.html
答案 2 :(得分: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 &");
}