在 **portable C** 中,如何启动将命令的标准输入连接到启动器的标准输出的命令?
Posted
技术标签:
【中文标题】在 **portable C** 中,如何启动将命令的标准输入连接到启动器的标准输出的命令?【英文标题】:In **portable C**, how to launch a command connecting the command's stdin to the launcher's stdout? 【发布时间】:2008-10-23 13:05:35 【问题描述】:在 C 程序 (p1) 中,如何启动从 p1 的标准输出读取其标准输入的动态构造命令(及其参数)?
注意:
此标准输出以外的方法 --> 标准输入管道也可以提供 它在 Windows 和 Linux。
我不能使用 C++、Java、Perl、Ruby、 Python等在这里。
另外,它的 Windows 版本是否会有 MinGW 依赖项?
REOPENED:下面的问题针对 Linux 回答了这个问题,但是这个问题需要一个可移植的方法。 Execute program from within a C program
【问题讨论】:
请注意,我只喜欢 C 解决方案。 (抱歉给您带来不便!) 【参考方案1】:Microsoft C 运行时将其称为 _popen
而不是 popen
,但它似乎在 Windows(用于控制台应用程序)和 Linux 中具有相同的功能。
【讨论】:
【参考方案2】:说实话,我并不是 100% 清楚你想要达到的目标。
但据我了解,你可以看看Boost.Process
你可以做这样的事情
bp::child cs = p.start();
bp::postream& os = cs.get_stdin();
然后使用 os 作为任何流来转储子进程的标准输入中的内容。
无论如何,使用 w.r.t. 库可以实现很多目标。管道重定向和链接。
【讨论】:
嗯,加油。我需要与一只 800 磅重的大猩猩联系并握手。我仍然会留意任何整体轻量级的 C 响应。不过,谢谢。 (请注意,我现在从条件中删除了 C++。)【参考方案3】:链接的分析器(您拒绝)指的是 POSIX 管道。 POSIX 是 C 的扩展,它添加了标准 C 中缺少的功能。POSIX 管道是此类功能的一个很好的例子:它们被添加到 POSIX 是因为标准 C 没有该功能。
【讨论】:
【参考方案4】:glib 库是用 C 语言编写的,其实现在 Linux 和 Windows 上都经过了很好的测试。 The manual section on spawning new processes 将为您提供有关如何使用 g_spawn_async_with_pipes 调用启动新进程并挂钩其标准输入和标准输出句柄的信息。
【讨论】:
以上是关于在 **portable C** 中,如何启动将命令的标准输入连接到启动器的标准输出的命令?的主要内容,如果未能解决你的问题,请参考以下文章
如何解决 React Native 中出现“folly/Portability.h”和“File .../main.jsbundle 不存在”的问题?
在没有 .NET Portability Analyzer 或 VS 的情况下,我如何知道 asp.net 包与 .net 核心的兼容性