我想将程序的输出重定向到文件。我怎样才能做到这一点?目前我的文件没有被创建,我只能将输出打印到我的控制台。
int fd[2];
int processId;
int output;
char filename[] = "output.txt";
if((output = open(filename, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR)) == -1){
fprintf(stderr, "Unable to create/open file '%s'\n", filename);
return 1;
}
if(pipe(fd) == -1){
fprintf(stderr, "Error creating pipe\n");
return 2;
}
if((processId = fork()) == -1){
fprintf(stderr, "Error forking\n");
return 3;
}
if(processId == 0){
int newFD = dup(STDOUT_FILENO);
char newFileDescriptor[2];
sprintf(newFileDescriptor, "%d", newFD);
dup2(fd[1], output);
close(fd[0]);
execl("./pipetest", "pipetest", newFileDescriptor, NULL);
}else{
close(fd[1]);
char c[10];
int r = read(fd[0], c, sizeof(char) * 10);
if(r > 0){
fprintf(stderr, "PIPE INPUT = %s", c);
fwrite(c, 1, sizeof(c), output);
}
}
Run Code Online (Sandbox Code Playgroud)
一个好的开始不是忽略编译器警告:
test.c: In function ‘main’:
test.c:42:13: warning: passing argument 4 of ‘fwrite’ makes pointer from integer without a cast [enabled by default]
fwrite(c, 1, sizeof(c), output);
^
In file included from test.c:1:0:
/usr/include/stdio.h:715:15: note: expected ‘struct FILE * __restrict__’ but argument is of type ‘int’
extern size_t fwrite (const void *__restrict __ptr, size_t __size,
^
Run Code Online (Sandbox Code Playgroud)
int并且FILE*不可互换。如果您使用open,请使用write. 如果您使用fopen,请使用fwrite.
此外,您永远不会修改流程的标准输出。相反,您修改output,这是没有意义的。以下是对您的代码进行的最少更改以使其正常工作:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
int fd[2];
int processId;
int output;
char filename[] = "output.txt";
if((output = open(filename, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR)) == -1){
fprintf(stderr, "Unable to create/open file '%s'\n", filename);
return 1;
}
if(pipe(fd) == -1){
fprintf(stderr, "Error creating pipe\n");
return 2;
}
if((processId = fork()) == -1){
fprintf(stderr, "Error forking\n");
return 3;
}
if(processId == 0){
int newFD = dup(STDOUT_FILENO);
char newFileDescriptor[2];
sprintf(newFileDescriptor, "%d", newFD);
dup2(fd[1], STDOUT_FILENO); // You want to modify STDOUT_FILENO
close(fd[0]);
execl("/bin/echo", "echo", newFileDescriptor, NULL); // switched to echo
}else{
close(fd[1]);
char c[10];
int r = read(fd[0], c, sizeof(char) * 10);
if(r > 0){
fprintf(stderr, "PIPE INPUT = %s", c);
write(output, c, r); // use write instead of fwrite
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是运行它的结果:
$ gcc test.c -o test
$ ./test
PIPE INPUT = 6
$ cat output.txt
6
Run Code Online (Sandbox Code Playgroud)