我有批处理文件,可以为我完成任务。我必须从我的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
答案 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?