`
codeone
  • 浏览: 46206 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java父子进程管道通信示例

    博客分类:
  • java
 
阅读更多

包含两个java文件,直接运行主进程的java文件就可以了,主进程会自动启动子进程

主进程代码如下:

 

package com.test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
 * Date: 12-1-13
 * Time: 10:52:00
 */
public class Main {


	public static BufferedReader inp;
	public static BufferedWriter out;

	public static void print(String s) {
	//	logger.info(s);
		System.out.println(s);
	}

	public static String pipe(String msg) {
		String ret;
		try {
			out.write(msg + "\n");
			out.flush();
			ret = inp.readLine();
			return ret;
		} catch (Exception err) {

		}
		return "";
	}


	public static void main(String[] args) {
		String cmd = "\"D:\\Program Files\\Java\\jdk1.6.0_16\\bin\\java\" -Didea.launcher.port=7532 \"-Didea.launcher.bin.path=D:\\Program Files\\JetBrains\\IntelliJ IDEA 10.5\\bin\" -Dfile.encoding=GBK -classpath \"D:\\Program Files\\Java\\jdk1.6.0_16\\jre\\lib\\alt-rt.jar;D:\\Program Files\\Java\\jdk1.6.0_16\\jre\\lib\\charsets.jar;D:\\Program Files\\Java\\jdk1.6.0_16\\jre\\lib\\deploy.jar;D:\\Program Files\\Java\\jdk1.6.0_16\\jre\\lib\\javaws.jar;D:\\Program Files\\Java\\jdk1.6.0_16\\jre\\lib\\jce.jar;D:\\Program Files\\Java\\jdk1.6.0_16\\jre\\lib\\jsse.jar;D:\\Program Files\\Java\\jdk1.6.0_16\\jre\\lib\\management-agent.jar;D:\\Program Files\\Java\\jdk1.6.0_16\\jre\\lib\\plugin.jar;D:\\Program Files\\Java\\jdk1.6.0_16\\jre\\lib\\resources.jar;D:\\Program Files\\Java\\jdk1.6.0_16\\jre\\lib\\rt.jar;D:\\Program Files\\Java\\jdk1.6.0_16\\jre\\lib\\ext\\dnsns.jar;D:\\Program Files\\Java\\jdk1.6.0_16\\jre\\lib\\ext\\localedata.jar;D:\\Program Files\\Java\\jdk1.6.0_16\\jre\\lib\\ext\\sunjce_provider.jar;D:\\Program Files\\Java\\jdk1.6.0_16\\jre\\lib\\ext\\sunmscapi.jar;D:\\Program Files\\Java\\jdk1.6.0_16\\jre\\lib\\ext\\sunpkcs11.jar;E:\\projects\\JProj_Idea\\PipeTest\\out\\production\\PipeTest;D:\\Program Files\\JetBrains\\IntelliJ IDEA 10.5\\lib\\idea_rt.jar\" com.intellij.rt.execution.application.AppMain SubClass";
		try {

//			print(cmd);
//			print(System.getProperty("user.dir"));
			Process p = Runtime.getRuntime().exec(cmd);
			inp = new BufferedReader(new InputStreamReader(p.getInputStream()));
			out = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
			print(pipe("你好"));
			print(pipe("RoteM"));

			pipe("quit");
			inp.close();
			out.close();
		} catch (Exception err) {
			err.printStackTrace();
		}
	}
}

 

子进程代码如下:

 

import java.io.*;

/**
 * Date: 12-1-13
 * Time: 10:54:00
 */
public class SubClass {
	static BufferedReader bufferedReader;
	static BufferedWriter bufferedWriter;

	static {
		try {
			bufferedReader = new BufferedReader(new InputStreamReader(System.in));
			File f = new File("e:\\111.txt");
			bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), "GBK"));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

	public static String readFormParentProcess() throws Exception {
		String result = bufferedReader.readLine();
		return result;
	}

	public static void main(String[] args) throws Exception {
		File f = new File("e:\\111.txt");
		String s = readFormParentProcess();
		bufferedWriter.write(s);
		System.out.println("sub class");
		bufferedWriter.flush();
		bufferedWriter.close();
		bufferedReader.close();
	}
}
分享到:
评论

相关推荐

    linux下C和java通过管道通信

    管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,通常是父子进程或兄弟进程。管道由两个文件描述符(File Descriptors)组成,一个用于写入(parent to child),另一个用于...

    ndk层实现双进程守护

    2. **Linux进程通信**:在Linux下,父子进程间的通信主要通过以下方式:共享内存、管道(pipe)、消息队列、信号量、套接字(Socket)等。在这个案例中,子进程使用Socket与父进程进行通信,以检测其状态。 3. **...

    行业文档-设计装置-一种基于字节流的进程间通讯方法.zip

    它提供了无格式的字节流通道,适用于父子进程间的通信。 5. **缓冲区和数据格式**:在字节流通信中,通常需要使用缓冲区来暂存数据,以提高效率。同时,为了确保数据的正确解析,需要定义特定的数据格式,如JSON、...

    LINUX编程白皮书001-04

    它分为无名管道和命名管道,无名管道主要用于父子进程之间的通信,而命名管道则可以连接不相关的进程。 2. **FIFO**:FIFO与管道类似,但它是全双工的,且可以通过文件系统进行访问,任何两个进程只要能访问到同一...

    startChildProcess (2).zip

    9. **并发和同步**:在多线程或多进程环境中,父进程可能需要等待子进程完成(使用`wait`或`waitpid`函数),或者同步父子进程的行为以确保数据一致性。 10. **性能考虑**:频繁创建和销毁进程可能导致系统资源的...

    2024年java面试题-Linux面试题第二部分

    - 通常用于父子进程之间的简单数据传输。 2. **命名管道(Named Pipe)**: - 克服了普通管道无名的限制,允许无亲缘关系的进程之间进行通信; - 提供了更好的灵活性和扩展性。 此外,还有其他常用的IPC机制,...

    完整版执行外部程序.rar

    - **管道(Pipe)**:允许父子进程之间双向通信。 - **套接字(Socket)**:可以用于不同进程间的通信,即使它们不在同一台机器上。 - **信号量(Semaphore)**:用于同步进程,防止资源竞争。 - **共享内存**:...

    2017恒生电子笔试题

    - **无名管道**:只存在于父子进程间。 - **有名管道**:可在不同进程间使用,路径形式存在。 - **信号量**: - 用于解决同步问题,如互斥锁、条件变量等。 - **共享内存**: - 允许多个进程共享同一段内存,提高...

    详解node child_process模块学习笔记

    父子进程之间会创建 IPC 通道,message 事件和 send() 方法便利用 IPC 通道通信。 句柄传递 学会如何创建子进程后,我们创建一个 HTTP 服务并启动多个进程来共同做到充分利用 CPU 多核。 worker.js ``` var ...

Global site tag (gtag.js) - Google Analytics