2012-03-27 98 views
0

我正在放置多语言系统,但遇到了孤立进程的问题。调用程序出口/崩溃时关闭Java子进程

我的代码由一个调用Java程序的Python程序组成,两个程序之间用管道通信; Java程序是持久的,而不仅仅是一次性运行。一切正常,但如果Python程序过早退出,我需要关闭Java程序。

认为最好的办法是让Java程序关闭自己,如果它不能检测程序之间的stdin管道,但我不知道这样做。

相关Python代码:

javaInterface = subprocess.Popen(["pathtojavaprogram"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

相关的Java代码;我希望该计划,如果它不能从标准输入读取退出,但我认为使用readline()函数的一些阻塞问题开始发挥作用:

String stdinStr = ""; 
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); 

while(true){ 
    try{ 
     stdinStr = stdin.readLine(); 
    } 
    catch(java.lang.Exception e){ 
     System.exit(0); 
    } 
    //Do stuff with the stdinStr data 
} 
+0

似乎是一种合理的方法。被破坏的管道可能只会导致Java进程标准输入中的EOF。 readLine()的Javadoc表示它在EOF上返回null - 你是否尝试过只检查stdinStr而不是捕获异常? – Alex 2012-03-27 19:27:23

+0

您是否尝试过让Python程序过早退出? Java过程是否保持这个代码的活力? – trutheality 2012-03-27 19:37:02

+0

亚历克斯:检查空明确固定它;非常感谢。我完全错过了在Javadoc ...我假设它抛出了一个异常,没有返回null。随意发布这个答案,以便我可以将其标记为已回答。 – Shookit 2012-03-27 19:37:51

回答

0

这是回答由trutheality的意见,但我想将其标记为已回答。

readLine()函数在管道退出时返回null,因此检查是否允许您正确关闭子进程。

+0

这工作得很好,谢谢你的帮助。 – Shookit 2012-09-07 19:46:18