Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

dup2 / dup - why would I need to duplicate a file descriptor?

I'm trying to understand the use of dup2 and dup.

From the man page :

DESCRIPTION  dup and dup2 create a copy of the file descriptor oldfd. After successful return of dup or dup2, the old and new descriptors may be used interchangeably. They share locks, file position pointers and flags; for example, if the file position is modified by using lseek on one of the descriptors, the position is also changed for the other.  The two descriptors do not share the close-on-exec flag, however.  dup uses the lowest-numbered unused descriptor for the new descriptor.  dup2 makes newfd be the copy of oldfd, closing newfd first if necessary.    RETURN VALUE  dup and dup2 return the new descriptor, or -1 if an error occurred  (in which case, errno is set appropriately).   

Why would I need that system call? what is the use of duplicating the file descriptor?

If I have the file descriptor, why would I want to make a copy of it?

I'd appreciate if you could explain and give me an example where dup2 / dup is needed.

Thanks

like image 452
JAN Avatar asked Jul 24 '12 16:07

JAN


People also ask

Why would you duplicate a file descriptor?

The major use of duplicating a file descriptor is to implement redirection of input or output: that is, to change the file or pipe that a particular file descriptor corresponds to.

When you want to duplicate the file descriptor then which of the following options is used?

After using the dup() system call, a copy of file_desc is created copy_desc. This copy can also be used to do some file operation with the same file “dup. txt”. After two write operations one with file_desc and another with copy_desc, same file is edited i.e. “dup.

Does dup2 close a file descriptor?

The dup2() function returns a descriptor with the value fildes2. The descriptor refers to the same file as fildes, and it will close the file that fildes2 was associated with. For more information about the processing which may occur when the file is closed, see close()--Close File or Socket Descriptor.

What does dup and dup2 do?

The difference between dup and dup2 is that dup assigns the lowest available file descriptor number, while dup2 lets you choose the file descriptor number that will be assigned and atomically closes and replaces it if it's already taken.


2 Answers

The dup system call duplicates an existing file descriptor, returning a new one that refers to the same underlying I/O object.

Dup allows shells to implement commands like this:

ls existing-file non-existing-file > tmp1  2>&1 

The 2>&1 tells the shell to give the command a file descriptor 2 that is a duplicate of descriptor 1. (i.e stderr & stdout point to same fd).
Now the error message for calling ls on non-existing file and the correct output of ls on existing file show up in tmp1 file.

The following example code runs the program wc with standard input connected to the read end of a pipe.

int p[2]; char *argv[2]; argv[0] = "wc"; argv[1] = 0; pipe(p); if(fork() == 0) {     close(STDIN); //CHILD CLOSING stdin     dup(p[STDIN]); // copies the fd of read end of pipe into its fd i.e 0 (STDIN)     close(p[STDIN]);     close(p[STDOUT]);     exec("/bin/wc", argv); } else {     write(p[STDOUT], "hello world\n", 12);     close(p[STDIN]);     close(p[STDOUT]); } 

The child dups the read end onto file descriptor 0, closes the file de scriptors in p, and execs wc. When wc reads from its standard input, it reads from the pipe.
This is how pipes are implemented using dup, well that one use of dup now you use pipe to build something else, that's the beauty of system calls,you build one thing after another using tools which are already there , these tool were inturn built using something else so on .. At the end system calls are the most basic tools you get in kernel

Cheers :)

like image 165
Deepthought Avatar answered Sep 23 '22 20:09

Deepthought


Another reason for duplicating a file descriptor is using it with fdopen. fclose closes the file descriptor that was passed to fdopen, so if you don't want the original file descriptor to be closed, you have to duplicate it with dup first.

like image 38
R.. GitHub STOP HELPING ICE Avatar answered Sep 21 '22 20:09

R.. GitHub STOP HELPING ICE