我正在构建一个基于 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 新的 fds: 1 和 2。然后你可以关闭 STDOUT 和 STDERR 的原始 fds (它们只会在 exec'ed git 程序时关闭,但在你的 main 中仍然打开)。
这应该将 git 的输出重新分配给 libfcgi 流。如果您想手动读取流并自己发送数据,您可以使用 pipeline() 调用创建一对 fd,以便 git 可以写入其中一个,然后从另一个读取。或者只需使用 popen() 即可为您执行此操作(但它不会让您使用 stderr)
关于c - 如何将执行程序的标准输出重定向到 FCGI_stdout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14363150/