【问题标题】:Redirecting Standard In and Out in C (Linux)在 C (Linux) 中重定向标准输入和输出
【发布时间】:2011-10-21 16:27:26
【问题描述】:

我正在尝试将标准重定向进出我的流程将要创建的流程,因此我可以与该流程进行双向通信。

基本上,我正在尝试在 C 中完成 Python 的 popen2()。

我在这方面找不到任何东西,因为每个人似乎都在他们的示例中使用了 fork(),这很方便,因为您可以在孩子中创建管道、fork 和 dup() 来更改您的标准输入和标准输出,然而,就我而言,我不是分叉,我实际上是在执行一个 shell 命令,我希望能够与之通信。

【问题讨论】:

    标签: c stdout stdin


    【解决方案1】:

    如果不派生进程,您将无法执行 shell 命令。它是由系统等函数在内部完成的,您应该明确地执行它以捕获标准输入/标准输出。在您之前创建的pipes 中通过dup2 完成分叉和设置stdin/stdout 后,使用您的shell、“-c”参数和您想要分叉的shell 命令调用exec

    【讨论】:

      【解决方案2】:

      一些 unix 让popen (3) 支持双向管道(包括 Mac OS 在内的大多数 BSD;我不知道关于 linux 的情况),但这不是必需的,其他只支持一个方向与popen。对于那些您必须使用pipe (2)forkexec 自己建立两个单向管道。

      【讨论】:

        【解决方案3】:

        popen2 的 Python 确实 fork 一个 shell 进程,并使用 popen(3) 实现。

        popen(3) 是 POSIX 标准的一部分,在 Linux 下受支持。但是请注意,popen 只能创建单向通信(只读或只写)。 popen(3) 是 pipe(2) 系统调用的包装器。

        如果您想在同一个描述符上同时进行输入和输出,那么您正在进入套接字领域。您可以实现 UNIX 套接字(本地通信),请参阅 unix(7) 了解详细信息 — 手册页中也有适当的 C 示例,因此我不会在此处重新发布。

        【讨论】:

        • 几乎所有时候你都可以用 3 个管道来完成。大多数时候是两个。
        • 正如我所说,如果他想在同一个“描述符”上进行 I/O :-) 三个管道是几个不同的描述符。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-26
        • 1970-01-01
        相关资源
        最近更新 更多