0

我必须在程序中捕获标准输出并将其写入文件......所以我创建了一个管道。在父进程中,我使用 dup() 捕获了管道中的标准输出,我需要将其放入文件中……所以我在子进程中执行了 dup() 以将捕获的文件描述符放入标准输入中。现在,如何使用 fwrite() 将此标准输入写入文件?

4

3 回答 3

2

做事不是很辛苦吗?您在父级中需要做的就是使用freopen()将标准输出连接到您选择的文件。

FILE *fp = freopen("/tmp/mylogfile", "w", stdout);

if (fp == 0)
    error("...something went wrong opening the log file...\n");

您的问题的直接答案是:

char buffer[32768];
ssize_t nbytes;
FILE *fp = fopen("/tmp/mylogfile", "w");

if (fp == 0)
    error("....something went wrong opening my log file...\n");

while ((nbytes = fread(buffer, sizeof(char), sizeof(buffer), stdin)) > 0)
    if (fwrite(buffer, sizeof(char), nbytes, fp) != nbytes)
        error("...something went wrong writing to standard output...\n");

然而,这几乎没有必要。您可以通过各种方式改进错误处理;我只是假设'error()' 报告了一条消息并且没有返回。

于 2009-12-31T05:33:21.093 回答
1

最简单的方法是打开文件并将其作为孩子的标准输出提供:

#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>

#include <stdio.h>

int main() {
  pid_t pid = fork();
  switch (pid) {
  case -1:
    perror("fork");
    return 1;

  case 0:;
    int new_out = open("output.txt", O_WRONLY | O_CREAT, 0666);
    if (new_out == -1) {
      perror("open");
      return 1;
    }
    if (dup2(new_out, 1) == -1) {
      perror("dup2");
      return 1;
    }
    char* args[] = {"/bin/echo", "test output", 0};
    execv(args[0], args);
    perror("exec");
    return 1;

  default:;
    int s;
    if (waitpid(pid, &s, 0) == -1) {
      perror("waitpid");
      return 1;
    }
    if (WIFEXITED(s)) {
      return WEXITSTATUS(s);
    }
    return 1;
  }
}
于 2009-12-31T05:48:03.623 回答
0

您应该捕获到一个字节或字符缓冲区并发送到 fwrite。当我说缓冲区时,我的意思是一个数组或动态分配的字节/字符块。

于 2009-12-31T05:29:49.170 回答