2011-02-06 88 views
1

打开的进程我试图杀死一个进程,我在Win32(XP)的Perl在后台打开 我尝试了几件事....似乎没有工作....如何杀死打开()

$pid = open(CMD, "| cmd.exe > C:\\cmdout.txt"); 

要杀了这个后台进程试过几件事情.... :(

  1. system('taskkill /F /IM cmd.exe');

  2. system("taskkill /F /pid $pid");

  3. close CMD || warn "cmd exited $?";

选项2永远不会奏效试图打印PID打印的值,并在系统实际是不同的。 选项1级的作品,但我觉得这个过程仍然在回地面运行,因为我结束进程后,我等待一段时间,然后重新启动该进程...

请帮

-Thanks

+0

这听起来像一个特定于Windows的问题。 – EboMike 2011-02-06 03:34:23

+0

原帖说'system('taskkill/F/pid $ pid')`。我将它改为双引号,否则`$ pid`不会被内插。我希望这只是你的文章中的一个错字,而不是实际的代码。 – cjm 2011-02-06 04:10:30

回答

2

我玩了一下你的情况。显然,有两个cmd.exe被启动,父亲的PID由open及其子命令返回。

第二种情况部分起作用,它杀死父母,但孩子仍然在跑步。使用/T选项taskkill你可以迫使它杀死所有的孩子:

system("taskkill /F /T /pid $pid"); 

您将看到有关这两个过程的终止消息:

SUCCESS: The process with PID 3956 child of PID 1864 has been terminated. 
SUCCESS: The process with PID 1864 child of PID 580 has been terminated. 

第三种情况似乎为我工作的罚款。关闭文件句柄会导致CMD进程死亡。