我正在使用C++(主要是C)在模拟文件系统上实现管道。它需要在宿主shell中运行命令,但在模拟文件系统上执行管道操作。
我可以使用pipe()
, fork()
, 和 system()
系统调用来实现这一点,但我更喜欢使用popen()
(它处理创建管道、fork进程和将命令传递给shell)。这可能是不可能的,因为(我认为)我需要能够从管道的父进程中写入数据,从子进程中读取数据,将子进程的输出写回父进程,最后从父进程中读取输出。我的系统上popen()
的man page表示双向管道是可行的,但我的代码需要在一个只支持单向管道的旧版本系统上运行。
使用上述分离的调用,我可以打开/关闭管道以实现此目的。那么用popen()
是否也可能呢?
对于一个简单的例子,要运行ls -l | grep .txt | grep cmds
,我需要:
- 打开管道和进程,在主机上运行
ls -l
;然后读取它的输出 - 将
ls -l
的输出放回模拟器 - 打开管道和进程,在主机上运行
grep .txt
,并将其应用于ls -l
的输出 - 将此输出返回到模拟器(卡在这里)
- 打开管道和进程,在主机上运行
grep cmds
,并将其应用于grep .txt
的输出 - 将此输出返回到模拟器并打印出来
man popen
来自Mac OS X:
任何由父进程之前的
popen()
函数通过创建双向管道、fork进程和调用shell来'打开'一个进程。popen()
调用打开的流都会在新的子进程中关闭。历史上,popen()
是使用单向管道实现的,因此许多popen()
的实现仅允许模式参数指定读取或写入,而不是同时具备两者。由于popen()
现在采用双向管道实现,因此模式参数可以请求双向数据流。模式参数是一个指向以空字符结尾的字符串的指针,必须为'r'表示读取,'w'表示写入,或'r+'表示读和写。
由于管道的定义是单向的,类型参数只能指定读取或写入,而不能同时;因此,生成的流相应地是只读或只写的。
我很惊讶这是“旧版”的popen... - sager89pipe()
从/向另一个程序读写数据。 - Jonathan Leffler