Java ProcessBuilder 启动的进程阻塞不退出问题。

news/2025/1/14 13:57:00/文章来源:https://www.cnblogs.com/uncleguo/p/18670624

https://wiki.sei.cmu.edu/confluence/display/java/FIO07-J.+Do+not+let+external+processes+block+on+IO+buffers

 

java通过调用进程读取输出启动进程的标准输出时,如果被调用进程的,标准输出以及错误流的缓冲区被写满, 后续写入会导致调用进程会卡住,无法正常结束。 

确保waiffor之前读取清空了所有流数据,并在waitfor 之后 关闭流。 在waifor 之前关闭仍有可能卡住!

 

These processes may require input to be sent to their input stream, and they may also produce output on their output stream, their error stream, or both. Incorrect handling of such external programs can cause unexpected exceptions, denial of service (DoS), and other security problems.

A process that tries to read input on an empty input stream will block until input is supplied. Consequently, input must be supplied when invoking such a process.

Output from an external process can exhaust the available buffer reserved for its output or error stream. When this occurs, the Java program can block the external process as well, preventing any forward progress for both the Java program and the external process. Note that many platforms limit the buffer size available for output streams. Consequently, when invoking an external process, if the process sends any data to its output stream, the output stream must be emptied. Similarly, if the process sends any data to its error stream, the error stream must also be emptied.

 

合格的代码(合并错误流, 并完全读取)

public class Exec {public static void main(String args[])throws IOException, InterruptedException {ProcessBuilder pb = new ProcessBuilder("notemaker");pb = pb.redirectErrorStream(true);Process proc = pb.start();InputStream is = proc.getInputStream();int c;while ((c = is.read()) != -1) {System.out.print((char) c);}int exitVal = proc.waitFor();}
}

合格的代码2 

class StreamGobbler implements Runnable {private final InputStream is;private final PrintStream os;StreamGobbler(InputStream is, PrintStream os) {this.is = is;this.os = os;}public void run() {try {int c;while ((c = is.read()) != -1)os.print((char) c);} catch (IOException x) {// Handle error
    }}
}public class Exec {public static void main(String[] args)throws IOException, InterruptedException {Runtime rt = Runtime.getRuntime();Process proc = rt.exec("notemaker");// Any error message?
    Thread errorGobbler= new Thread(new StreamGobbler(proc.getErrorStream(), System.err));// Any output?
    Thread outputGobbler= new Thread(new StreamGobbler(proc.getInputStream(), System.out));errorGobbler.start();outputGobbler.start();// Any error?int exitVal = proc.waitFor();errorGobbler.join();   // Handle condition where theoutputGobbler.join();  // process ends before the threads finish
  }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/869047.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

65R330-ASEMI超洁MOS管65R330

65R330-ASEMI超洁MOS管65R330编辑:ll 65R330-ASEMI超洁MOS管65R330 型号:65R330 品牌:ASEMI 封装:TO-220F 批号:最新 最大漏源电流:13A 漏源击穿电压:650V RDS(ON)Max:330mΩ 引脚数量:3 芯片个数: 沟道类型:N沟道MOS管、超洁MOS管 漏电流:ua 特性:N沟道MOS管、…

MongoDB 会丢数据吗? 在次补刀MongoDB 双机热备,以及如何删除Journal log【转】

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis ,Oracle ,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加微信号 liuaustin3 (共1220人左右 1 + 2 + 3 +4)新人会进入3群 以后会争取每天一段…

车辆总线接口设备 - VCI

TESTBASE-VCI(Vehicle Communication Interface)系列产品是经纬恒润自主研发的一组用于汽车或工业等应用领域的便携式现场通信总线接口设备,可与PC端INTEWORK系列软件配合使用,实现总线监控、测量标定和诊断刷写等功能。概述TESTBASE-VCI(Vehicle Communication Interface…

Origin 自定义公式拟合

非线性拟合 选中数据 - 绘图 - 分析 - 拟合 - 非线性曲线拟合 - 打开对话框 - 新建函数 - 函数命名 - 输入函数表达式,如 y=a*x^2,即可。 若公式中涉及到复数,则使用 ImReal() 取实部,Imaginary() 取虚部,Imsqrt() 取开方。 如色散方程取实部,即色散部分进行拟合,则相应…

产品经理如何通过看板管理做到更直观的工作管理?

在如今快节奏的产品开发环境中,产品经理面临着众多任务和复杂的流程,如何高效管理工作成为了一大挑战。看板管理作为一种可视化的工作流程管理方法,正逐渐成为产品经理们的得力助手。你是否好奇,看板管理究竟有怎样的魔力,能让产品经理的工作变得更直观、更高效呢?接下来…

VMware17Pro虚拟机安装macOS教程

下载所需文件官方正版VMware下载(17 pro): 通过网盘分享的文件:VMware17.5.rar链接: https://pan.baidu.com/s/15EtL6XUGCIxLpvOcDwL9Ew 提取码: r6ic 下载系统镜像: 通过网盘分享的文件:macOS.Sonoma.14.5.K3.iso链接: https://pan.baidu.com/s/1H14E7snWdPhdcrRcQBtFew…

推荐一款 .NET 智慧水务物联网系统

前言 本文将介绍如何通过智能水表(如 NB-IoT 水表)、智能消火栓、智能阀门、数据采集终端(RTU 或 PLC)及其他前置传感器和设备,开发一个高效、智能的供水管理系统。该系统能够实时采集和分析供水网络中的各种数据,帮助用户单位实现精细化管理和资源优化配置。 项目介绍 智…

python类中的方法【类方法、静态方法、方法】

方法需要实例化类生成对象后才能调用,另两个不需要

【AI+框架】2025智能计算中心技术框架详解

智算中心是对外提供AI算力服务的公共基础设施,如何构建一个高性能、可扩展的技术架构,是智算中心非常重要的技术支撑,所以要在智算中心完成算力的生产、聚合、调度和释放,从而实现构建平台,提供服务。 智算中心的总体架构如下图所示:【图1】 智能计算中心总体架构图 1. 整…

Django 网页开发快速上手——实现一个博客应用

目录0 前言博客定位成果展示环境配置1 创建 project2 创建 app3 Django 三大元素——MVT4 创建你的第一个 view5 创建你的第一个 template6 migration 与 admin 端7 创建你的第一个 model8 连通 view, template 和 model9 实现注册/登录/登出功能10 模版继承11 用 css 文件美化…

DataGrip2024.3.3最新2099年激活教程附带激活工具

前言 看到新版本发布了,准备把DataGrip 2024.3.3来个大变身,激活依旧可破解至 2099 年,安装过DataGrip的小伙伴需要卸载后再重装。接下来,我将为大家详细介绍这一版本的更新内容及具体的激活方法 安装环境 [名称]:DataGrip [大小]:500MB [版本]:2024.3.3 [语言]:简体中…

QD_0001:浅谈前端框架原理

最近在看卡颂大佬的《React 设计原理》,看了第一章,就有一种醍醐灌顶的感觉**,于是决定记录分享一下这一章的内容。这里也极力推荐各位小伙伴读一下。 本人其实是 Vue 开发者,没有太多地使用过 React,只是多多少少听过一些概念,能看懂一些 React 代码 因此我的文章,会更…