我必须在程序中捕获stdout并将其写入文件...所以我创建了一个管道。在父进程中,我使用dup()捕获管道中的stdout,我需要将其放入文件中...所以我在子进程中执行了dup()以将捕获的文件描述符放入stdin中。现在,如何使用fwrite()?
将此stdin写入文件答案 0 :(得分:2)
难道这不是一件难事吗?您需要在父级中执行的操作是使用freopen()
将stdout连接到您选择的文件。
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()'报告了一条消息并且没有返回。
答案 1 :(得分: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;
}
}
答案 2 :(得分:0)
你应该捕获到一个字节或char缓冲区并将其发送到fwrite。 当我说缓冲区时,我指的是一个数组或动态分配的字节/字符块。