【发布时间】:2013-01-16 16:32:51
【问题描述】:
我正在构建一个基于 libfcgi 的 fastcgi 应用程序,以在 git 中提供“智能 HTTP”传输。为此,我目前需要 fork 并执行 git-upload-pack 程序。唯一的问题是 libfcgi 用特殊的 FCGI 文件描述符替换了 STDOUT 和 STDERR,而 git 不知道这些。我希望能够在父进程中捕获 git 程序(stdout 和 stderr)的输出,以便将其发送到服务器。
【问题讨论】:
我正在构建一个基于 libfcgi 的 fastcgi 应用程序,以在 git 中提供“智能 HTTP”传输。为此,我目前需要 fork 并执行 git-upload-pack 程序。唯一的问题是 libfcgi 用特殊的 FCGI 文件描述符替换了 STDOUT 和 STDERR,而 git 不知道这些。我希望能够在父进程中捕获 git 程序(stdout 和 stderr)的输出,以便将其发送到服务器。
【问题讨论】:
在调用 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)
【讨论】:
close(1); dup2(FCGI_stdout, 1);?
dup2 调用不会重定向输出,并且在调用close(1) 之前会在stderr 上给我一个“错误的文件描述符”错误
fileno 解决了问题,即 git 直接打印到 fcgi 流中