我正在用C++(主要是C)在模拟文件系统上实现管道.它需要在主机shell中运行命令,但在模拟文件系统上执行管道本身.
我可以与实现这一目标pipe(),fork()和system()系统调用,但我宁愿使用popen()(它处理创建一条管道,把一个进程,并通过一个命令外壳).这可能是不可能的,因为(我认为)我需要能够从管道的父进程写入,在子进程结束时读取,从子进程写回输出,最后从父进程读取该输出.popen()我的系统上的手册页说明了双向管道,但是我的代码需要在一个只支持单向管道的旧版本的系统上运行.
通过上面的单独调用,我可以打开/关闭管道来实现这一目标.这有可能popen()吗?
对于一个简单的例子,要运行ls -l | grep .txt | grep cmds我需要:
ls -l在主机上运行进程; 读回它的输出ls -l传回我的模拟器grep .txt在管道输出上的主机上运行ls -lgrep cmds在管道输出上的主机上运行grep .txt男人popen
从Mac OS X:
该
popen()函数通过创建双向管道,分叉和调用shell来"打开"一个过程.由popen()父进程中先前调用打开的任何流都将在新的子进程中关闭.历史上,popen()使用单向管道实施; 因此,许多实现popen()只允许mode参数指定读或写,而不是两者.因为popen()现在使用双向管道实现,mode参数可以请求双向数据流.mode参数是一个指向以null结尾的字符串的指针,该字符串必须为'r'表示读取,'w'表示写入,或'r +'表示读写.
因此,如果我在gcc stdio.h中使用popen(),我可以将父级的stdout传递给其子级的stdin,或者我可以将子级的stdout传递给父级的stdin.我想同时做两件事.有没有办法使用popen来做到这一点,或者我是否需要使用较低级别的工具(如共享内存)来完成这项工作?
注意:在FreeBSD中看起来popen可以用"r +"进行读写.我不明白孩子的stdout是如何通过管道输送到父母和父母的标准输出.不管怎么说,这可能对我有用,但在Linux中似乎并非如此.如果我在这一点上弄错了,那就会回答我的问题.以下是我收到此说明的链接:https://www.freebsd.org/cgi/man.cgi?query = popen&sektion = 3
注2:我更喜欢按照优先顺序在几乎所有Linux发行版,FreeBSD和OSX上移植的解决方案.话虽这么说,我很乐意至少让它在Ubuntu 14.04中运行.
在C++应用程序中,我需要启动一个Java应用程序并将参数传递给它的标准输入,当java应用程序完成后,然后在C++应用程序中接收结果.有没有使用文件,套接字等快速简单的方法?
PD:java应用程序与c ++应用程序位于同一目录中.
一些例子?拜托,对不起我的英文