【问题标题】:How can stdout of exec'ed program be redirected to FCGI_stdout?如何将执行程序的标准输出重定向到 FCGI_stdout?
【发布时间】:2013-01-16 16:32:51
【问题描述】:

我正在构建一个基于 libfcgi 的 fastcgi 应用程序,以在 git 中提供“智能 HTTP”传输。为此,我目前需要 fork 并执行 git-upload-pack 程序。唯一的问题是 libfcgi 用特殊的 FCGI 文件描述符替换了 STDOUT 和 STDERR,而 git 不知道这些。我希望能够在父进程中捕获 git 程序(stdout 和 stderr)的输出,以便将其发送到服务器。

【问题讨论】:

    标签: c git exec fastcgi


    【解决方案1】:

    在调用 fork() 之后和调用 exec() 之前,请执行以下操作:在 fds 1 和 2(即 stdout 和 stderr)上调用 close(),然后调用 dup2() 来分配 STDOUT 和 STDERR 的 fds libfcgi new fds: 1 和 2。然后您可以关闭 STDOUT 和 STDERR 的原始 fds(它们将仅对执行的 git 程序关闭,但仍会在您的 main 中打开)。

    这应该将 git 的输出重新分配给 libfcgi 流。如果您想手动读取流并自己发送数据,您可以使用 pipe() 调用来创建一对 fd,以便 git 可以写入其中一个,而您可以从另一个读取。或者只使用可以为您执行此操作的 popen()(但它不会让您使用 stderr)

    【讨论】:

    • git 偶尔会使用 stderr,所以我避免使用 popen。我会试试这个。实施将类似于close(1); dup2(FCGI_stdout, 1);?
    • 只需执行dup2 调用不会重定向输出,并且在调用close(1) 之前会在stderr 上给我一个“错误的文件描述符”错误
    • 关闭失败意味着您之前没有为您的进程打开标准输出。应该传递给 dup2 的值取决于 FCGI_stdout 的性质,如果是 stdio FILE* 实体,则需要传递 fileno(FCGI_stdout)
    • 在 FCGI_stdout 上调用 fileno 解决了问题,即 git 直接打印到 fcgi 流中
    猜你喜欢
    • 2021-01-21
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多