在 **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** 中,如何启动将命令的标准输入连接到启动器的标准输出的命令?的主要内容,如果未能解决你的问题,请参考以下文章

Chocolatey Ngrok.portable 不工作

如何解决 React Native 中出现“folly/Portability.h”和“File .../main.jsbundle 不存在”的问题?

如何减轻类声明远离文件中的所有者命名空间声明?

修复 msysGit Portable $HOME 位置

在没有 .NET Portability Analyzer 或 VS 的情况下,我如何知道 asp.net 包与 .net 核心的兼容性

如何解决 Git Portable 的文件访问问题?