2013-10-20 47 views
1

我使用proc_open()然后usleep()打开进程一段时间,之后检查进程的状态。如果这个过程还在运行那么我proc_terminate()吧。proc_terminate()即使在很多时间后也不终止进程

问题是,当我使用proc_terminate()脚本将继续,而不必等待进程结束(这是正常的),但即使大量的时间之后的过程没有结束。

的过程是一个.exe文件,其中第一次印到hello标准输出,然后进入无限循环。

我的PHP脚本:

<pre> 
<?php 

$descriptorspec = array(
    1 => array('pipe', 'w') 
    ); 
$process = proc_open("C:/wamp/www/my-project/run.exe", $descriptorspec, $pipes); 

if (is_resource($process)) { 
    usleep(2.5*1000000); // wait 2.5 secs 

    $status = proc_get_status($process); 
    if ($status['running'] == true) { 
     proc_terminate($process); 
     echo "Terminated\n"; 
    } else { 
     echo "Exited in time\n"; 
     echo "EXIT CODE : {$status['exitcode']}\n"; 
     echo "OUTPUT :\n"; 

     while (!feof($pipes[1])) 
      echo fgets($pipes[1]); 

     fclose($pipes[1]); 
     proc_close($process); 
    } 
} 

?> 
</pre> 

我编译这个C++文件,并得到.exe

#include <iostream> 
using namespace std; 

int main() { 
    cout << "hello"; 
    while (1); 
    return 0; 
} 

是否有人知道为什么会这样? :(

回答

0

proc_terminate实际上并没有终止一个进程,它发送一个SIGTERM信号的过程中要求它终止自己。

我觉得现在的问题是,你的测试可执行文件不监听SIGTERM信号,所以它被忽略

在POSIX系统上,你可以使用第二个参数来发送SIGKILL,它本质上要求操作系统终止进程,这样可能会更好。知道什么,如果有的话,这会做。

但是这个过程应该是处理信号。你可以很容易的信号处理程序添加到您的exe文件来进行测试:

#include <csignal> 
#include <iostream> 
#include <thread> 

using namespace std; 

void signal_handler(int signal) 
{ 
    cout << "received SIGTERM\n"; 
    exit(0); 
} 

int main() 
{ 
    // Install a signal handler 
    std::signal(SIGTERM, signal_handler); 

    cout << "starting\n"; 

    while (1) 
     std::this_thread::sleep_for(std::chrono::seconds(1)); 

    return 0; 
} 

注意添加sleep_for还,这样的exe不占用CPU的100%。

还有在评论中here有关使用posix_kill()杀死一个进程和它的孩子,如果上述方法不为你工作的讨论。

1

proc_terminate()在Windows上无法正常工作。

一个很好的解决方法是调用taskkill命令。

function kill($process) { 
    if (strncasecmp(PHP_OS, 'WIN', 3) == 0) { 
     $status = proc_get_status($process); 
     return exec('taskkill /F /T /PID '.$status['pid']); 
    } else { 
     return proc_terminate($process); 
    } 
} 
相关问题