2016-04-19 20 views
1

私はJDKを持っており、無限ループを含むMain.javaプログラムを実行しようとしています。java Main.javaを打ち切りたい< input.txt> output.txtコマンド無限ループに入り、無限ループではない場合、プログラムを中断しないでください。トラブルPHPのexecコマンドを使用して無限ループのJavaプログラムを中断する

<?php 

exec('cmd /k c:/wamp/www/javac Main.java 2>&1', $outputAndErrors, $return_value); 
for($i=0 ; $i<sizeof($outputAndErrors) ; $i++) 
{ 
    $output1=htmlspecialchars($outputAndErrors[$i],ENT_QUOTES); 
    echo "$output1";  
    $flag=1; 
} 
if(!$flag) 
{ 
    exec('cmd /k c:/wamp/www/java Main.java <input.txt> output.txt', $outputAndErrors, $return_value); 
    //want to give timeout but if exec goes to infinite loop than below statement will not executed 
} 

?> 
+0

解決策が必要ですか?それが無限に進まないようにしてください。プロセスIDを知っていれば、他の解決策はプロセスを終了させることです。 –

答えて

0

であなたはJavaでに待機するポートを開き、PHPから接続すると、そのポートに何かを送信する必要があります。

彼は

を言うところあなたはおそらくしたいことのServerSocketを作成し、それを聞くことがある「

"" hereに答える@TomaszNurkiewiczチェックアウト:

ServerSocket serverSocket = new ServerSocket(4000); 
Socket socket = serverSocket.accept(); 

二行目を他のソフトウェアがポート4000上のマシンに接続するまでブロックします。次に、返されたソケットから読み込むことができます。このチュートリアルを見ると、これは実際には非常に広いトピックです読書、プロトコル...)

"" "

と開放PHPでソケットは、コードを使用することができます(または)それにsomethign近いが

the manualから@sanmiによってhereを提供するための

" ""

<?php 
error_reporting(E_ALL); 

/* Get the port for the WWW service. */ 
$service_port = getservbyname('www', 'tcp'); 

/* Get the IP address for the target host. */ 
$address = gethostbyname('www.example.com'); 

/* Create a TCP/IP socket. */ 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
if ($socket === false) { 
    echo "socket_create() failed: reason: " . 
     socket_strerror(socket_last_error()) . "\n"; 
} 

echo "Attempting to connect to '$address' on port '$service_port'..."; 
$result = socket_connect($socket, $address, $service_port); 
if ($result === false) { 
    echo "socket_connect() failed.\nReason: ($result) " . 
      socket_strerror(socket_last_error($socket)) . "\n"; 
} 

$in = "HEAD/HTTP/1.1\r\n"; 
$in .= "Host: www.example.com\r\n"; 
$in .= "Connection: Close\r\n\r\n"; 
$out = ''; 

echo "Sending HTTP HEAD request..."; 
socket_write($socket, $in, strlen($in)); 
echo "OK.\n"; 

echo "Reading response:\n\n"; 
while ($out = socket_read($socket, 2048)) { 
    echo $out; 
} 

socket_close($socket); 
?> 

""」

1

でそれを包む、本質的に(このようなクラスでラップしてみ210を使用してpidを入手し、その方法でバックグラウンドで作業してください)

<?php 
    // You may use status(), start(), and stop(). notice that start() method gets called automatically one time. 
    $process = new Process('ls -al'); 

    // or if you got the pid, however here only the status() metod will work. 
    $process = new Process(); 
    $process.setPid(my_pid); 
?> 

<?php 
    // Then you can start/stop/ check status of the job. 
    $process.stop(); 
    $process.start(); 
    if ($process.status()){ 
     echo "The process is currently running"; 
    }else{ 
     echo "The process is not running."; 
    } 
?> 

<?php 
/* An easy way to keep in track of external processes. 
* Ever wanted to execute a process in php, but you still wanted to have somewhat controll of the process ? Well.. This is a way of doing it. 
* @compability: Linux only. (Windows does not work). 
* @author: Peec 
*/ 
class Process{ 
    private $pid; 
    private $command; 

    public function __construct($cl=false){ 
     if ($cl != false){ 
      $this->command = $cl; 
      $this->runCom(); 
     } 
    } 
    private function runCom(){ 
     $command = 'nohup '.$this->command.' > /dev/null 2>&1 & echo $!'; 
     exec($command ,$op); 
     $this->pid = (int)$op[0]; 
    } 

    public function setPid($pid){ 
     $this->pid = $pid; 
    } 

    public function getPid(){ 
     return $this->pid; 
    } 

    public function status(){ 
     $command = 'ps -p '.$this->pid; 
     exec($command,$op); 
     if (!isset($op[1]))return false; 
     else return true; 
    } 

    public function start(){ 
     if ($this->command != '')$this->runCom(); 
     else return true; 
    } 

    public function stop(){ 
     $command = 'kill '.$this->pid; 
     exec($command); 
     if ($this->status() == false)return true; 
     else return false; 
    } 
} 
?> 
+0

これがうまくいくなら、それは最善の答えです。 – kpie

+0

これはWindowsで動作しますか? –

+0

プロセスを使用してプログラムを実行する方法は? –

1

これは単なる提案です。あなたの質問にはより良い答えがあります。

Java無限ループ内で、他のテキストファイルの値をチェックします。あなたは以外いままでのfalseにyour_txt_file.txt値を設定することができれば、そのような

while true { 

v = readFile('your_txt_file.txt') 
if v == "true" { 
    break; 
} 
//do your stuff } 

その後、Javaのループは休憩になります。

関連する問題