I’m in an operating systems course and doing assignments with C on Linux. In one of the assignments I was supposed to redirect and output to a file, but for some reason, I keep getting the output in the terminal instead. I tried writing a simple program to do just that and it still didn’t work:
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <sys/fcntl.h> #include <dirent.h> void main(int argc, char* argv[]) { int file1 = open("./text_try", O_CREAT | O_EXCL, 0666) //open file printf("write to screenn"); //print to screen int oldOut = dup(1); //save screen FD dup2(file1,1); //change output stream from screen to file printf("write to file"); //print to file dup2(oldOut,1); //change output stream from file back screen printf("write to screen"); //print to screen }
other things I tried :
- changing the permissions on the file open (adding
O_RDWR
) - running on 2 separate PCs – i run mainly on remote desktop to the uni pc for linux but also got VMware on the laptop.
- tried using
close
+dup
combo instead ondup2
- tried using conditions with
perror
to see if any step will tip me off as to why it doesn’t work. - tried using
STDOUT_FILENO
instead of 1 for output
would really appreciate any help on this!
Advertisement
Answer
stdio normally buffers output to stdout
— it’s line-buffered when it’s connected to a terminal, fully-buffered when connected to a file. Since you’re not writing any newlines, it will not flush the buffer automatically in either mode. The buffer is flushed automatically when the program exits, at which time it gets written to the last stream that FD 1 is connected to.
Either turn off buffering with setvbuf()
, or flush the output explicitly between printf()
calls.
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <sys/fcntl.h> #include <dirent.h> void main(int argc, char* argv[]) { int file1 = open("./text_try", O_CREAT | O_EXCL, 0666) //open file printf("write to screenn"); //print to screen int oldOut = dup(1); //save screen FD dup2(file1,1); //change output stream from screen to file printf("write to file"); //print to file fflush(stdout); dup2(oldOut,1); //change output stream from file back screen printf("write to screen"); //print to screen fflush(stdout); }