小弟最近在研究父子进程中如何用管道进行通信,但是遇到一个情况,目前无法理解现有的答案。
shell 脚本
#!/bin/bash
for((i=0; i<10913; i++));do
# 输出到 stdin
echo "input"
# 输出到 stderr
echo "error" 1>&2
done
java
public static Object executeCommand(String command) throws Exception
{
ProcessBuilder processBuilder = new ProcessBuilder(command);
Process process = processBuilder.start();
readStreamInfo(process.getInputStream(), process.getErrorStream());
int exit = process.waitFor();
process.destroy();
if (exit == 0)
{
System.out.println("子进程正常完成");
}
else
{
System.out.println("子进程异常结束");
}
return null;
}
private static void readStreamInfo(InputStream... inputStreams){
try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStreams[0]),8192))
{
String line;
int i = 0;
while (true)
{
String s = br.readLine();
if (s != null)
{
System.out.println(++i + " " + s);
}
else
{
break;
}
}
}
catch (IOException e)
{
throw new RuntimeException(e);
}
finally
{
try
{
inputStreams[0].close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
try (BufferedReader bufferedInput = new BufferedReader(new InputStreamReader(inputStreams[1])))
{
String line;
int i = 0;
while ((line = bufferedInput.readLine()) != null)
{
System.out.println(++i + " " + line);
}
}
catch (IOException e)
{
throw new RuntimeException(e);
}
finally
{
try
{
inputStreams[1].close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
实测断点会卡在 String s = br.readLine();迟迟没有收到返回值。
shell 中 for 循环减少一次错误流输出上述代码就不会阻塞。
以上问题是缓冲区满了导致的
但是还是有几个问题不能理解,希望有研究过的大佬可以帮帮小弟。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.