Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does dup2() do in C

I looked it up in the man page but I still don't get it...

let's say you have dup2(f1,0). Does that switch filedesc.1 with stdin and then locks stdin?

like image 860
jabk Avatar asked Jul 02 '14 18:07

jabk


1 Answers

dup2 doesn't switch the file descriptors, it makes them equivalent. After dup2(f1, 0), whatever file was opened on descriptor f1 is now also opened (with the same mode and position) on descriptor 0, i.e. on standard input.

If the target file descriptor (here, 0) was open, it is closed by the dup2 call. Thus:

before                         after
0: closed, f1: somefile        0: somefile, f1:somefile
0: otherfile, f1: somefile     0: somefile, f1:somefile

No locking is involved.

dup2 is useful (among other things) when you have part of a program that reads or write from the standard file descriptors. For example, suppose that somefunc() reads from standard input, but you want it to read from a different file from where the rest of the program is getting its standard input. Then you can do (error checking omitted):

int save_stdin = dup(0);
int somefunc_input_fd = open("input-for-somefunc.data", O_RDONLY);
dup2(somefunc_input_fd, 0);
/* Now the original stdin is open on save_stdin, and input-for-somefunc.data on both somefunc_input_fd and 0. */
somefunc();
close(somefunc_input_fd);
dup2(save_stdin, 0);
close(save_stdin);
like image 195
Gilles 'SO- stop being evil' Avatar answered Sep 19 '22 18:09

Gilles 'SO- stop being evil'