exec&x27的stdout;被重定向的程序是否重定向到FCGI_stdout?

exec&x27的stdout;被重定向的程序是否重定向到FCGI_stdout?,c,git,exec,fastcgi,C,Git,Exec,Fastcgi,我正在构建一个基于libfcgi的fastcgi应用程序,以在git中提供“智能HTTP”传输。为此,我目前需要分叉并执行git upload pack程序。唯一的问题是libfcgi用特殊的FCGI文件描述符替换了STDOUT和STDERR,而git并不知道这些。我希望能够在父进程中捕获git程序(stdout和stderr)的输出,以便将其发送到服务器。在调用fork()之后和调用exec()之前,执行以下操作:对fds 1和2(即stdout和stderr)调用close(),然后调用du

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

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


这应该将git的输出重新分配给libfcgi流。如果您想手动读取流并自己发送数据,您可以使用pipe()调用创建一对FD,这样git就可以对其中一个进行写入,而您可以从另一个进行读取。或者只使用popen(),它可以为您做到这一点(但它不允许您使用stderr)

git偶尔使用stderr,所以我避免使用popen。我试试这个。实现将沿着
close(1)的路线进行;dup2(FCGI_stdout,1)?简单地执行
dup2
调用不会重定向输出,并且在调用之前调用
close(1)
会在stderr上出现“错误的文件描述符”错误关闭失败意味着之前没有为进程打开stdout。应该传递给dup2的值取决于FCGI_stdout的性质,如果它是stdio FILE*实体,则需要在FCGI_stdout上传递fileno(FCGI_stdout)调用
fileno
,解决了这个问题,即git直接打印到FCGI流中