java启动子进程以及进程通信
1.利用进程的管道通信传输流
2.子进程没有控制台,正常测试的时候也是没办法看到子进程的输出的,需要传到主线程
3.测试主进程传参给子进程再传回来
4.父进程启动子进程只要执行runtime.exec(cmd)就行了,但在linu下面,需要传入数组命令,否则一些特定字符会被当做参数
5.比如"test.sh >> test.log",这种就不能exec直接执行,传入数组:{"/bin/sh","-c",cmd}
子进程:
import java.io.*;
/**
* Created by garfield on 2016/11/1.
*/
public class TestCommand {
public static void main(String[] args) throws IOException, InterruptedException {
BufferedReader s = new BufferedReader(new InputStreamReader(System.in));
String line ;
StringBuffer all = new StringBuffer();
while((line = s.readLine()) != null){
all.append(line);
}
System.out.println(all);
s.close();
}
}
父进程:
import java.io.*; /**
* Created by garfield on 2016/11/9.
*/
public class TestCommunication {
public static void main(String[] args) throws IOException, InterruptedException {
Runtime run = Runtime.getRuntime();
String java = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
String cp = "\"" + System.getProperty("java.class.path");
cp += File.pathSeparator + ClassLoader.getSystemResource("").getPath() + "\"";
String cmd = java + " -cp " + cp + " com.TestCommand";
Process p = run.exec(cmd);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
bw.write("999999");
bw.flush();
bw.close(); BufferedInputStream in = new BufferedInputStream(p.getInputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String s;
while ((s = br.readLine()) != null)
System.out.println(s);
}
}
父进程将99999传给子进程,又在控制台输出:
999999
java启动子进程以及进程通信的更多相关文章
- java父子进程通信
1.利用进程的管道通信传输流 2.子进程没有控制台,正常测试的时候也是没办法看到子进程的输出的,需要传到主线程 3.测试主进程传参给子进程再传回来 4.父进程启动子进程只要执行runtime.exec ...
- 【原创】java中的父进程子进程 —— 坑爹的java Runtime.getRuntime().exec
最近有一个需求,需要用一个java进程启动多个子进程来完成并发任务.由于必须给用户完成任务的反馈,所以需要父进程记录子进程的生命周期. exec方法返回一个Process对象,在当前进程内调用该对象的 ...
- JAVA调用系统命令或可执行程序--返回一个Runtime运行时对象,然后启动另外一个进程来执行命令
通过 java.lang.Runtime 类可以方便的调用操作系统命令,或者一个可执行程序,下面的小例子我在windows和linux分别测试过,都通过.基本原理是,首先通过 Runtime.getR ...
- Java进程通信之映像文件共享内存
Java进程通信之映像文件共享内存 1. 共享内存 vs 进程通信 对UNIX系统来说,共享内存分为一般共享内存和映像文件共享内存两种.但windows实际上只有影像文件共享内存一种. 而说到进程通信 ...
- Linux间的进程通信;以及子进程的创建
"-----第六天-----------------------------------------------------------------------------" .版 ...
- java多线程上篇(三) -- 进程通信和线程死锁简单介绍
进程通信指的是进程间的信息交换 ,IPC(Inter-Process Communication,进程间通信) 进程通信就相当于一种工作方式.沟通形式,进程通信主要指的就是操作系统提供的进程通信工具( ...
- Qt启动子进程,子进程关闭时通知主进程,实现主进程对子进程的管理
自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1.需求描述 Qt主进程启动 ...
- Java 输入/输出——Java虚拟机读写其它进程的数据
使用 Runtime对象的exec()方法可以运行平台上的其它程序,该方法产生一个Process对象,Process对象代表由该Java程序启动的子进程.Process类提供了如下三个方法,用于让程序 ...
- [转]WINDOW进程通信的几种方式
windows进程通信的几种方式 1 文件映射 文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待.因此,进程不必使用文件I/O操作,只需简单的指针 ...
随机推荐
- CentOS7中将Mysql添加为系统服务
如果是自己通过tar包安装的Mysql,不会自动添加到系统服务中,可通过如下方式,自己添加. 先启动一下mysql ${mysql}/support-files/mysql.server start ...
- asp.net时间范围查询
1.首先要查询类表中的一个时间段,要明确我的数据库中只有一个时间字段,我们先将他拆分一下. if ($("#news_OpenTime").val() != "" ...
- 关于mac地址的一点感想
因为怕mac地址冲突导致环路影响,所以修改了本地设备的mac地址.地址修改为 77:77:77:00:22:11, 结果导致 wlan0 下发不下来. 查看配置选项/etc/config/wirele ...
- UIDatePicker 时间滚动表
UIDatePicker *datapicker; //时间滚动表 datapicker = [[UIDatePicker alloc]initWithFrame:CGRectMake(50, 200 ...
- no method declared with objective-c selector error
down voteaccepted Swift 2.2 / Xcode 7.3 has a new way to use selector:Selector("funcName") ...
- pageoffice 开发笔记
开发环境:vs2015,mvc,razor pageoffice版本:Server-Version=3.2.0.1 OCX-Version=2,0,4,6 开发模式:pageofficeLink方式 ...
- jarring type lambda
object IntStateMonad extendsMonad[({type IntState[A] = State[Int, A]})#IntState] {...}This syntax ca ...
- win10 Qt 调试器未设置
安装win10后一直用vs调试,没有用qt调试,这次启动调试,发现提示调试器未设置. 解决办法: 需要重新安装wdk 10 https://developer.microsoft.com/zh-cn/ ...
- jmeter下载及安装配置
本文是在win7环境下安装使用jmeter,jmeter可以运行在多平台上Windows和Linux. 前提:使用jmeter工具之前需要安装java.并配置好java的环境变量.(备注:java下载 ...
- 配置 Apache 的虚拟主机
1.在host配置比如: 找到记事本以管理员的身份打开,然后文件->打开 C:\Windows\System32\drivers\etc 下面的hosts文件 127.0.0.1 www ...