io-redir.c
/**
* io-redir.c
*
* Demonstrates redirecting I/O with the dup system call. Some of the printf()s
* will be redirected to a file, while others will still display. Try modifying
* this so that it will redirect stderr instead.
*
* @author mmalensek
*/
#include "kernel/fcntl.h"
#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
int
main(void)
{
// Let's redirect all output to a file: log.txt
char *log_file = "log.txt";
/**
* Flags
* - O_RDWR - open for reading and writing (could use O_WRONLY instead)
* - O_CREATE - create file if it does not exist
* - O_TRUNC - truncate size to 0
*/
int open_flags = O_RDWR | O_CREATE | O_TRUNC;
// First, open a file to send text to.
fprintf(2, "Opening file: %s...\n", log_file);
int fd = open(log_file, open_flags);
if (fd == -1) {
fprintf(2, "Could not open file\n");
return 1;
}
// Do redirection. We close stdout, then dup 'fd'. dup looks for the
// lowest unused file descriptor (stdout) to make the copy.
// [!] This tends to be the most confusing part of redirection!
fprintf(2, "Duplicating file descriptor...\n");
close(1); // close stdout
if (dup(fd) == -1) {
fprintf(2, "dup failed\n");
return 1;
}
fprintf(2, "Begin print tests!\n\n");
printf("This is going to go to the file!\n");
printf("Amazing stuff, right? We can just redirect everything\n");
printf("going to stdout somewhere else with this.\n");
// Note: the printfs up at the top of main() WILL print to stdout because we
// didn't redirect yet.
fprintf(2, "This is headed to stderr though... Will it print?\n");
fprintf(2, "Your guess is as good as mine!\n");
fprintf(1, "Printing back to stdout... Goodbye!\n");
return 0;
}