[英]Java: popen()-like function?
Process process = Runtime.getRuntime().exec("your command");
然后,您可以使用Process
流读取和写入数据。
JDK5引入了ProcessBuilder以更好地控制流程生成。
Process process = new ProcessBuilder(command).start()
请注意,调用内部forkAndExec,fork'复制整个父地址空间',这样当父进程获取大量内存空间时,即使是一个小命令也可能导致OutOfMemoryErrors。
popen()
密友是将命名管道作为输入和/或输出,就像在UNIX中一样:
mknod /tmp/mypipe.12345 p ; sort -o /tmp/mypipe.12345 /tmp/mypipe.12345 &
然后打开/tmp/mypipe.12345
,写入,关闭,打开/tmp/mypipe.12345
,读取,关闭。 由于排序在输入EOF
之前无法写入任何内容,因此输出打开将在输入关闭后发生。 popen()
调用不能这样做!
对于更简单的场景,可以只读取或写入命名管道。
当然,您仍然需要将其关闭,就像在system(...)
调用中一样。
您希望在完成后删除命名管道。 在某些UNIX系统上,重新启动时会清除/tmp
。
/tmp
是共享的,因此很可能发生名称冲突。 您可以使用Java生成部分随机的管道文件名( /tmp/mypipe.12345
数字部分)以防止这种情况发生。 在某些系统中, Bash为每个<(...)
或>(...)
使用在/var/tmp
创建命名管道。 不幸的是,确定何时可以在没有效果的情况下移除它们(fuser?)是一个挑战!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.