如何使Perl的system()不阻塞?

时间:2015-01-01 13:53:21

标签: windows perl

在我的PERL代码中,我需要使用Windows命令提示符执行一些操作,例如打开记事本,即

system("start notepad");

现在我发现perl在前一个语句完成之前不会移动到下一个语句。有没有办法在向系统发送命令后,perl移动到下一个语句而不检查系统任务是否结束。

我制作了一个示例代码来解释我的问题。我在这里完成了每项任务后显示的时间。

use Time::HiRes qw(time);
use POSIX qw(strftime);

####################printing time code starts###########
$t = time;
$date = strftime "%Y%m%d %H:%M:%S", localtime $t;
$date .= sprintf ".%03d", ($t-int($t))*1000; # without rounding
print "Statement 1 executed at $date\n";
#######################printing time code ends###########
####################printing time code starts###########
$t = time;
$date = strftime "%Y%m%d %H:%M:%S", localtime $t;
$date .= sprintf ".%03d", ($t-int($t))*1000; # without rounding
print "Statement 2 executed at $date\n";
#######################printing time code ends#####
system("start notepad");
####################printing time code starts###########
$t = time;
$date = strftime "%Y%m%d %H:%M:%S", localtime $t;
$date .= sprintf ".%03d", ($t-int($t))*1000; # without rounding
print "Statement 3 executed at $date\n";

我的输出是:

Statement 1 executed at 20150101 19:09:37.614
Statement 2 executed at 20150101 19:09:37.614
Statement 3 executed at 20150101 19:09:37.647

显然,声明2和声明3之间存在很大差异,我想避免它。请提出建议。

注意:启动记事本只是一个例子,我可能想将100MB文件从1个文件夹复制到另一个文件夹,我不希望perl在向系统发送命令后等待。

2 个答案:

答案 0 :(得分:8)

在win32 perl ,你可以这样做:

system( 1, "start notepad" );

告诉系统立即返回。这在perlport中有记录。

答案 1 :(得分:-2)

是什么让你认为它正在等待系统调用完成才能继续?

您所写的测试用例并没有给出明确的指示,告诉我们您的假设是正确的。您应该调整系统调用,以便执行更耗时的操作,例如执行完整C驱动器的目录列表。该测试将显示“语句2和语句3之间的巨大差异”是由于系统功能的启动成本和Windows 启动命令。

使用ysth建议的解决方案可以降低启动成本。

use strict;
use warnings;
use Time::HiRes qw(time);
use POSIX qw(strftime);

my ($t, $date);

####################printing time code starts###########
$t = time;
$date = strftime "%Y%m%d %H:%M:%S", localtime $t;
$date .= sprintf ".%03d", ($t-int($t))*1000; # without rounding
print "Statement 1 executed at $date\n";
#######################printing time code ends###########
system('');
####################printing time code starts###########
$t = time;
$date = strftime "%Y%m%d %H:%M:%S", localtime $t;
$date .= sprintf ".%03d", ($t-int($t))*1000; # without rounding
print "Statement 2 executed at $date\n";
#######################printing time code ends#####
system("start dir /s C:\\");
####################printing time code starts###########
$t = time;
$date = strftime "%Y%m%d %H:%M:%S", localtime $t;
$date .= sprintf ".%03d", ($t-int($t))*1000; # without rounding
print "Statement 3 executed at $date\n";

声明1于20150101 07:23:04.745执行 声明2于20150101 07:23:04.757执行 报表3于20150101 07:23:04.767执行

将附加参数添加到系统调用后,这是新的时间。

声明1于20150101 07:27:56.333执行 声明2于20150101 07:27:56.355执行 报表3执行于20150101 07:27:56.356