2009-12-31 114 views
0

我必须捕获程序中的stdout并将其写入文件中...所以我创建了一个管道。在父进程中,我使用dup()捕获了管道中的stdout,并且我需要将它存入一个文件中...所以我在子进程中做了一个dup()以获取捕获的文件描述符到stdin中。现在,我如何使用fwrite()将此stdin写入文件?使用fwrite将stdin写入文件()

回答

0

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

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()'报告消息,并且不返回

+0

是的,可是这只是一个学习C方式...我努力去学习使用管道。 – sfactor 2009-12-31 05:38:45

+0

好的 - 这样做不会有什么坏处;它为做事情找借口不合适的技巧。我已经给出了直接的答案。但是,如果我使用管道作为管道,而不是巧合地使用碰巧连接到管道的文件流,我会使用文件描述符I/O调用(例如read()和write()),而不是文件流I/O调用如fread()和fwrite()。 – 2009-12-31 05:42:52

+0

使用管道(尤其是使用dup()时要记住的主要问题是关闭管道未使用的端点。如果你不这样做,事情不会正确终止。 – 2009-12-31 06:49:53

1

最简单的方法就是打开文件和规定,在有孩子的stdout:

#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; 
    } 
}