What end of the stream does dub2 ( ) change is it the end the OS is connected to or the end connected to application .
int main(){ FILE* file = fopen("test.txt", "w"); // Create file dexcriptor int num = fileno(file); // Convert FILE* to file descriptor dup2(num, STDOUT_FILENO); // Make STDOUT_FILENO an alias to num cout << "happy year"; close(num); }
this code redirect output to file and not the screen which means that input side of stream is connected now to the file right .
Advertisement
Answer
Before the dup2()
, the file descriptor table for the process looks something like this:
0 => terminal (stdin) 1 => terminal (stdout) 2 => terminal (stderr) ... num => file "test.txt"
After the dup2()
, it looks like this:
0 => terminal (stdin) 1 => file "test.txt" 2 => terminal (stderr) ... num => file "test.txt"
There’s actually an extra level of indirection. There’s a file table in the kernel for all open streams, and there’s just one entry for the shared opening of test.txt
. Both descriptors point to that file table entry — this is what allows them to share the file position.
In the C++ I/O subsystem, cout
is connected to STDOUT_FILENO
, so redirecting the descriptor changes where writing to cout
writes.