我正在用 C++(主要是 C)在模拟文件系统上实现管道。它需要在主机外壳中运行命令,但在模拟文件系统上执行管道本身。
我可以通过 、 和 系统调用来实现这一点pipe()
,fork()
但system()
我更喜欢使用popen()
(它处理创建管道、分叉进程以及将命令传递给 shell)。这可能是不可能的,因为(我认为)我需要能够从管道的父进程写入,在子进程端读取,从子进程写回输出,最后从父进程读取该输出。我系统上的手册页popen()
说双向管道是可能的,但我的代码需要在旧版本仅支持单向管道的系统上运行。
通过上面的单独调用,我可以打开/关闭管道来实现这一点。这可能popen()
吗?
举一个简单的例子,要运行ls -l | grep .txt | grep cmds
我需要:
- 打开一个管道和进程
ls -l
在主机上运行;读回它的输出 - 通过管道将输出
ls -l
返回到我的模拟器 - 打开管道和进程以
grep .txt
在主机上的管道输出上运行ls -l
- 通过管道将其输出回模拟器(卡在这里)
- 打开管道和进程以
grep cmds
在主机上的管道输出上运行grep .txt
- 通过管道将其输出回模拟器并打印出来
男人弹出
从 Mac OS X:
该
popen()
函数通过创建双向管道、分叉和调用 shell 来“打开”一个进程。父进程中先前popen()
调用打开的任何流都在新的子进程中关闭。从历史上看,popen()
是用单向管道实现的;因此,许多实现popen()
只允许 mode 参数指定读取或写入,而不是两者。因为popen()
现在使用双向管道实现,所以 mode 参数可能会请求双向数据流。mode 参数是一个指向以 null 结尾的字符串的指针,该字符串必须是 'r' 用于读取,'w' 用于写入,或 'r+' 用于读取和写入。