将使用双向 popen() 的 C++ 代码移植到 POSIX 的最佳方法
Best way to port C++ code that uses a bidirectional popen() to POSIX
我正在尝试获取同事为 OS X 编写的 Linux 上的一些 C++ 代码 运行。它主要是可移植的,但有一部分我不知道怎么处理。他使用popen(CMD, "r+")
开启双向管道,通过fget
和fprint
.
与进程通信
在 Linux 上,类型 r+
不可用,因为管道只能是单向的。我想通常的方法是通过套接字处理双向通信,但被调用的 CMD
是一个交互式程序,我们只能对其进行有限的控制。
经过一番搜索后,我发现了一些 popen2
在 C 中实现的片段。它有点工作,但如果有一个真正的 "C++" 方法来代替使用流来完成它会容易得多像 write
和 read
这样的低级函数。我也有一些问题,很多沟通都丢失了。
无论如何,我的问题是:将使用双向 popen()
的代码移植到 POSIX(或至少 OS X + Linux)?
socketpair(2) 创建一对作为双向管道端点的套接字。这将直接替换 popen()
。我不明白为什么 CMD
是或不是交互式程序与它有任何关系。
程序可能需要有一个实际的终端设备(不太可能,因为 popen
() 并没有真正模拟终端设备)。如果是这样,pty(7) 手册页提供了有关创建驱动伪 tty 设备的双向管道的附加文档。
我正在尝试获取同事为 OS X 编写的 Linux 上的一些 C++ 代码 运行。它主要是可移植的,但有一部分我不知道怎么处理。他使用popen(CMD, "r+")
开启双向管道,通过fget
和fprint
.
在 Linux 上,类型 r+
不可用,因为管道只能是单向的。我想通常的方法是通过套接字处理双向通信,但被调用的 CMD
是一个交互式程序,我们只能对其进行有限的控制。
经过一番搜索后,我发现了一些 popen2
在 C 中实现的片段。它有点工作,但如果有一个真正的 "C++" 方法来代替使用流来完成它会容易得多像 write
和 read
这样的低级函数。我也有一些问题,很多沟通都丢失了。
无论如何,我的问题是:将使用双向 popen()
的代码移植到 POSIX(或至少 OS X + Linux)?
socketpair(2) 创建一对作为双向管道端点的套接字。这将直接替换 popen()
。我不明白为什么 CMD
是或不是交互式程序与它有任何关系。
程序可能需要有一个实际的终端设备(不太可能,因为 popen
() 并没有真正模拟终端设备)。如果是这样,pty(7) 手册页提供了有关创建驱动伪 tty 设备的双向管道的附加文档。