从Perl异步调用批处理文件

时间:2011-07-28 07:19:38

标签: perl

我有批处理文件,可以为我完成任务。我必须从我的PERL文件中调用这个批处理文件。

我希望将其称为异步调用。任务批处理文件将会很费时,我不希望这个Perl文件等到Bach文件结束

这是我尝试进行模拟的原因

批处理文件:

@ECHO off
ECHO ------Start of Batch file---------- >> C:\\temp\test.txt
Echo ------End of Batch file---------- >> C:\\temp\test.txt
pause

我添加Pause的原因是为了模拟aysnch。 (逻辑上如果它的Async没有办法在批处理文件中输入:-))

我的Perl代码看起来像这样

system("CreateTicket.bat");

当我使用system();时,它正在等待批处理文件完成其执行

我用

修改了它

"C://Work/Playground/Perl/CQ_createRTCTicket.bat"; (在这里使用反引号格式化问题)

这也等待批处理文件停止(我认为是因为暂停)

或者如果我的方法有问题,有没有办法模拟这种异步?

[我无法使用CPAN的任何额外模块]

谢谢,

KARTHIK

2 个答案:

答案 0 :(得分:1)

使用“开始”(建议here

简短的POC:

  print 'before', "\n";
  system "start notepad.exe";
  print 'between', "\n";
  system "start wait.bat";
  print 'after', "\n";

答案 1 :(得分:1)

正如您所注意到的,system()等待其他进程。在内部,它forks()另一个进程,调用exec()来运行批处理文件,原始进程等待。如果你不能使用CPAN,那么你可以自己调用fork()和exec(),而不是等待子进程完成。

首先阅读这些内容:

注意有关信号和僵尸进程的信息。一旦你了解它是如何工作的,它就足够简单了。

如果批处理文件生成输出,则需要在perl中处理,然后可以使用open()创建管道(perldoc -f open)。

以前曾提出过类似的问题:

What's the difference between Perl's backticks, system, and exec?